summaryrefslogtreecommitdiff
path: root/src/markdown.cpp
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2019-10-25 14:10:45 +0300
committerAleksey Veresov <aleksey@veresov.pro>2019-10-25 14:10:45 +0300
commit1de3a9aae84ec71c4fd83604ea9c45204efb9baf (patch)
tree99246ae8cbb19864657360b513f501d796a92db5 /src/markdown.cpp
parent2c12c0652d2b8c8440e1e908f004826840ed14ab (diff)
downloadtexo-1de3a9aae84ec71c4fd83604ea9c45204efb9baf.tar
texo-1de3a9aae84ec71c4fd83604ea9c45204efb9baf.tar.xz
texo-1de3a9aae84ec71c4fd83604ea9c45204efb9baf.zip
.
Diffstat (limited to 'src/markdown.cpp')
-rw-r--r--src/markdown.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/markdown.cpp b/src/markdown.cpp
new file mode 100644
index 0000000..c542a1f
--- /dev/null
+++ b/src/markdown.cpp
@@ -0,0 +1,167 @@
+#include "markdown.hpp"
+
+
+TexoProducerMarkdown::TexoProducerMarkdown(TexoExporter &exporter):
+ TexoProducer(exporter), quoted(false), newline(false), code(false)
+{}
+
+void TexoProducerMarkdown::Put(const Texo &piece)
+{
+ if (piece.c == '\n') {
+ if (code) {
+ exporter.Put('\n');
+ } else if (quoted) {
+ exporter.Put("\n>");
+ } else if (header || newline) {
+ exporter.Put(' ');
+ } else {
+ exporter.Put('\n');
+ newline = true;
+ }
+ } else {
+ exporter.Put(piece.c);
+ newline = false;
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoHeader &piece)
+{
+ if (piece.closing) {
+ exporter.Put('\n');
+ header = false;
+ newline = true;
+ } else {
+ if (!newline) {
+ exporter.Put('\n');
+ }
+ if (piece.level <= 1) {
+ exporter.Put("###### ");
+ } else if (piece.level == 2) {
+ exporter.Put("##### ");
+ } else if (piece.level == 3) {
+ exporter.Put("#### ");
+ } else if (piece.level == 4) {
+ exporter.Put("### ");
+ } else if (piece.level == 5) {
+ exporter.Put("## ");
+ } else {
+ exporter.Put("# ");
+ }
+ header = true;
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoParagraph &piece)
+{
+ if (piece.closing) {
+ exporter.Put("\n\n");
+ newline = true;
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoCode &piece)
+{
+ exporter.Put("\n```\n");
+ code = !code;
+}
+
+void TexoProducerMarkdown::Put(const TexoQuote &piece)
+{
+ if (piece.closing) {
+ exporter.Put("\n\n");
+ quoted = false;
+ newline = true;
+ } else {
+ if (!newline) {
+ exporter.Put('\n');
+ }
+ exporter.Put(">");
+ quoted = true;
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoMono &piece)
+{
+ exporter.Put("`");
+}
+
+void TexoProducerMarkdown::Put(const TexoBold &piece)
+{
+ exporter.Put("**");
+}
+
+void TexoProducerMarkdown::Put(const TexoItalic &piece)
+{
+ exporter.Put("*");
+}
+
+void TexoProducerMarkdown::Put(const TexoUnderline &piece)
+{
+ exporter.Put("++");
+}
+
+void TexoProducerMarkdown::Put(const TexoStrike &piece)
+{
+ exporter.Put("~~");
+}
+
+void TexoProducerMarkdown::Put(const TexoImage &piece)
+{
+ if (piece.path != "") {
+ const bool link = piece.link != "";
+ if (link) {
+ exporter.Put('[');
+ }
+ exporter.Put("![");
+ exporter.Put(piece.alt);
+ exporter.Put("](");
+ exporter.Put(piece.path);
+ if (piece.title != "") {
+ exporter.Put(" \"");
+ exporter.Put(piece.title);
+ exporter.Put('"');
+ }
+ exporter.Put(')');
+ if (link) {
+ exporter.Put("](");
+ exporter.Put(piece.link);
+ if (piece.title != "") {
+ exporter.Put(" \"");
+ exporter.Put(piece.title);
+ exporter.Put('"');
+ }
+ exporter.Put(')');
+ }
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoLink &piece)
+{
+ if (piece.text != "") {
+ exporter.Put('[');
+ exporter.Put(piece.text);
+ exporter.Put("](");
+ exporter.Put(piece.link);
+ if (piece.title != "") {
+ exporter.Put(" \"");
+ exporter.Put(piece.title);
+ exporter.Put('"');
+ }
+ exporter.Put(')');
+ }
+}
+
+void TexoProducerMarkdown::Put(const TexoLineBreak &piece)
+{
+ exporter.Put("\\\n");
+ newline = true;
+}
+
+void TexoProducerMarkdown::Put(const TexoHorizontalRule &piece)
+{
+ if (!newline) {
+ exporter.Put('\n');
+ }
+ exporter.Put("---\n");
+ newline = false;
+}