summaryrefslogtreecommitdiff
path: root/src/markdown.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/markdown.cpp')
-rw-r--r--src/markdown.cpp232
1 files changed, 231 insertions, 1 deletions
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;
+}