summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2019-11-15 15:06:13 +0300
committerAleksey Veresov <aleksey@veresov.pro>2019-11-15 15:06:13 +0300
commit649822c38bf0853680bcc9ea49e4fadd525f187b (patch)
tree2b45172577104a63cfba9f61b9d1134cf46ab9f9 /src
parenta45cb537ab82f13f29f1bc33dd8bf998b3fb9c9b (diff)
parent3047ed6100a56a529f26e43ada0a3fc3c3815c3e (diff)
downloadtexo-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.hpp113
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