diff options
author | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 15:06:13 +0300 |
---|---|---|
committer | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 15:06:13 +0300 |
commit | 649822c38bf0853680bcc9ea49e4fadd525f187b (patch) | |
tree | 2b45172577104a63cfba9f61b9d1134cf46ab9f9 /src | |
parent | a45cb537ab82f13f29f1bc33dd8bf998b3fb9c9b (diff) | |
parent | 3047ed6100a56a529f26e43ada0a3fc3c3815c3e (diff) | |
download | texo-649822c38bf0853680bcc9ea49e4fadd525f187b.tar texo-649822c38bf0853680bcc9ea49e4fadd525f187b.tar.xz texo-649822c38bf0853680bcc9ea49e4fadd525f187b.zip |
Merge remote-tracking branch 'croco/master' into test
Diffstat (limited to 'src')
-rw-r--r-- | src/producer.hpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/producer.hpp b/src/producer.hpp index c310e19..6aacddf 100644 --- a/src/producer.hpp +++ b/src/producer.hpp @@ -164,4 +164,117 @@ private: }; +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Texo Strict Producer + * Converts switch-signal interface of Texo Producer into + * sequence of start/close signals with disjoint modificator sections, + * as well as block sections, which are provided on top level. + */ +class TexoProducerStrict: public TexoProducer { +public: + TexoProducerStrict(TexoExporter & exporter); + + + bool End(); + + + bool Put(char c); + + + bool Code(); + bool Header(int level); + bool Paragraph(); + bool Quote(); + + + bool Bold(); + bool Italic(); + bool Mono(); + bool Strike(); + bool Underline(); + + bool Link(const ScriptVariable & path, const ScriptVariable & title); + bool Link(); + + bool PutImage(const ScriptVariable & src, const ScriptVariable & alt, + const ScriptVariable & title); + bool PutHorizontalRule(); + + +protected: + virtual bool TruePut(char c) = 0; + + virtual bool StartCode() = 0; + virtual bool StartHeader(int level) = 0; + virtual bool StartParagraph() = 0; + virtual bool StartQuote() = 0; + + virtual bool CloseCode() = 0; + virtual bool CloseHeader(int level) = 0; + virtual bool CloseParagraph() = 0; + virtual bool CloseQuote() = 0; + + + virtual bool StartBold() = 0; + virtual bool StartItalic() = 0; + virtual bool StartMono() = 0; + virtual bool StartStrike() = 0; + virtual bool StartUnderline() = 0; + + virtual bool CloseBold() = 0; + virtual bool CloseItalic() = 0; + virtual bool CloseMono() = 0; + virtual bool CloseStrike() = 0; + virtual bool CloseUnderline() = 0; + + virtual bool StartLink( + const ScriptVariable & link, const ScriptVariable & title) + = 0; + virtual bool CloseLink( + const ScriptVariable & link, const ScriptVariable & title) + = 0; + + + virtual bool TruePutImage(const ScriptVariable & src, + const ScriptVariable & alt, const ScriptVariable & title) + = 0; + virtual bool TruePutHorizontalRule() = 0; + + +private: + enum Block { block_none = 0, code, header, paragraph, quote } block; + + int header_level; + + + enum Mod { bold, italic, link, mono, strike, underline } mods[6]; + int opened; + + const ScriptVariable * link_link; + const ScriptVariable * link_title; + + + bool Start(); // Open paragraph if no block is opened. + + bool CloseBlock(); + + bool SwitchMod(Mod mod); + + bool OpenMod(Mod mod); + + bool CloseMod(Mod mod); + + // Close all opened mods sequentially, down to (including) last, + // returning count of closed mods, or negative number in case of error. + int CloseMods(Mod last); + + // Close all opened mods. + bool CloseMods(); + + bool Reopen(int closed); + + bool IsOpened(Mod mod) const; +}; + + #endif |