From 3b13f7ac20875df55e02d5e407c4c3cbab3f159c Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Tue, 29 Oct 2019 19:50:18 +0300 Subject: . --- src/markdown.cpp | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 231 insertions(+), 1 deletion(-) (limited to 'src/markdown.cpp') diff --git a/src/markdown.cpp b/src/markdown.cpp index c542a1f..0593eb9 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -2,7 +2,8 @@ TexoProducerMarkdown::TexoProducerMarkdown(TexoExporter &exporter): - TexoProducer(exporter), quoted(false), newline(false), code(false) + TexoProducer(exporter), + quoted(false), newline(false), header(false), code(false) {} void TexoProducerMarkdown::Put(const Texo &piece) @@ -165,3 +166,232 @@ void TexoProducerMarkdown::Put(const TexoHorizontalRule &piece) exporter.Put("---\n"); newline = false; } + + +TexoImporterMarkdown::TexoImporterMarkdown(TexoProducer &producer): + TexoImporter(producer), state(text) +{} + +TexoImporterMarkdown::~TexoImporterMarkdown() +{} + +void TexoImporterMarkdown::Put(char c) +{ + switch (state) { + case text: Text(c); break; + case header_text: HeaderText(c); break; + case quote_text: QuoteText(c); break; + case quote_newline: QuoteNewline(c); break; + case code_text: CodeText(c); break; + case code_newline: CodeNewline(c); break; + case code_end: CodeEnd(c); break; + case backslash: Backslash(c); break; + case asterisk: Asterisk(c); break; + case underline: Underline(c); break; + case plus: Plus(c); break; + case tilde: Tilde(c); break; + case newline: Newline(c); break; + case paragraph: Paragraph(c); break; + case header: Header(c); break; + case code: Code(c); break; + case quote: Quote(c); break; + } +} + +void TexoImporterMarkdown::Put(const ScriptVariable &str) +{ + TexoImporter::Put(str); +} + +void TexoImporterMarkdown::Put(FILE *file) +{ + TexoImporter::Put(file); +} + +void TexoImporterMarkdown::Text(char c) +{ + wrapping_state = text; + switch (c) { + case '\\': state = backslash; break; + case '\n': state = newline; break; + case '*': state = asterisk; break; + case '_': state = underline; break; + case '~': state = tilde; break; + case '`': Backquote(); break; + default: producer.Put(c); + } +} + +void TexoImporterMarkdown::HeaderText(char c) +{ + wrapping_state = header_text; + switch (c) { + case '\\': state = backslash; break; + case '\n': EndHeader(); break; + case '*': state = asterisk; break; + case '_': state = underline; break; + case '~': state = tilde; break; + case '`': Backquote(); break; + default: producer.Put(c); + } +} + +void TexoImporterMarkdown::QuoteText(char c) +{ + wrapping_state = header_text; + switch (c) { + case '\\': state = backslash; break; + case '\n': state = quote_newline; break; + case '*': state = asterisk; break; + case '_': state = underline; break; + case '~': state = tilde; break; + case '`': Backquote(); break; + default: producer.Put(c); + } +} + +void TexoImporterMarkdown::QuoteNewline(char c); +void TexoImporterMarkdown::CodeText(char c); +void TexoImporterMarkdown::CodeNewline(char c); +void TexoImporterMarkdown::CodeEnd(char c); + +void TexoImporterMarkdown::Backslash(char c) +{ + producer.Put(c); + state = wrapping_state; +} + +void TexoImporterMarkdown::Asterisk(char c) +{ + state = wrapping_state; + if (c == '*') { + producer.Put(TexoBold(is_bold)); + is_bold = !is_bold; + } else { + producer.Put(TexoItalic(is_italic)); + is_italic = !is_italic; + Put(c); + } +} + +void TexoImporterMarkdown::Underline(char c) +{ + state = wrapping_state; + if (c == '_') { + producer.Put(TexoBold(is_bold)); + is_bold = !is_bold; + } else { + producer.Put(TexoItalic(is_italic)); + is_italic = !is_italic; + Put(c); + } +} + +void TexoImporterMarkdown::Plus(char c) +{ + state = wrapping_state; + if (c == '+') { + producer.Put(TexoUnderline(is_underline)); + is_underline = !is_underline; + } else { + producer.Put('+'); + Put(c); + } +} + +void TexoImporterMarkdown::Tilde(char c) +{ + state = wrapping_state; + if (c == '~') { + producer.Put(TexoStrike(is_strike)); + is_strike = !is_strike; + } else { + producer.Put('~'); + Put(c); + } +} + +void TexoImporterMarkdown::Backquote() +{ + producer.Put(TexoMono(is_mono)); + is_mono = !is_mono; +} + +void TexoImporterMarkdown::Newline(char c) +{ + if (c == '\n') { + state = paragraph; + } else if (c == '#') { + state = header; + header_level = 6; + } else if (c == '>') { + state = quote; + } else if (c == '-') { + state = rule; + rule_dash_count = 1; + } else if (c == '`') { + state = code; + code_quote_count = 1; + } else { + producer.Put(' '); + state = text; + Put(c); + } +} + +void TexoImporterMarkdown::Rule(char c) +{ + if (c == '-') { + ++rule_dash_count; + } else { + if (rule_dash_count >= 3) { + producer.Put(TexoHorizontalRule()); + } else { + if (wrapping_state == paragraph) { + producer.Put(TexoParagraph()); + } + for (int i = 0; i < rule_dash_count; ++i) { + producer.Put('-'); + } + } + } +} + +void TexoImporterMarkdown::Paragraph(char c) +{ + wrapping_state = paragraph; + if (c == '#') { + state = header; + header_level = 6; + } else if (c == '>') { + state = quote; + } else if (c == '-') { + state = rule; + rule_dash_count = 1; + } else if (c == '`') { + state = code; + code_quote_count = 1; + } else { + producer.Put(TexoParagraph()); + state = text; + Put(c); + } +} + +void TexoImporterMarkdown::Header(char c) +{ + if (c == '#') { + if (header_level > 1) { + --header_level; + } + } else { + producer.Put(TexoHeader(header_level)); + state = header_text; + } +} + +void TexoImporterMarkdown::EndHeader() +{ + producer.Put(TexoHeader(header_level, true)); + state = paragraph; +} -- cgit v1.2.3