]> git.sven.stormbind.net Git - sven/vym.git/blob - src/export-markdown.cpp
Replace Pierre as the maintainer
[sven/vym.git] / src / export-markdown.cpp
1 #include "export-markdown.h"
2
3 #include "mainwindow.h"
4 #include <QMessageBox>
5
6 extern QString vymName;
7 extern Main *mainWindow;
8
9 ExportMarkdown::ExportMarkdown()
10 {
11     exportName = "Markdown";
12     filter = "Markdown (*.md);;All (* *.*)";
13     caption = vymName + " -" + QObject::tr("Export as Markdown");
14 }
15
16 void ExportMarkdown::doExport()
17 {
18     QFile file(filePath);
19     if (!file.open(QIODevice::WriteOnly)) {
20         QMessageBox::critical(
21             0, QObject::tr("Critical Export Error"),
22             QObject::tr("Could not export as Markdown to %1").arg(filePath));
23         mainWindow->statusMessage(QString(QObject::tr("Export failed.")));
24         return;
25     }
26
27     QString out;
28
29     // Main loop over all branches
30     QString s;
31     QString curIndent;
32     QString dashIndent;
33     int i;
34     BranchItem *cur = NULL;
35     BranchItem *prev = NULL;
36
37     QString curHeading;
38
39     int lastDepth = 0;
40
41     QStringList tasks;
42
43     model->nextBranch(cur, prev);
44     while (cur) {
45         if (cur->getType() == TreeItem::Branch ||
46             cur->getType() == TreeItem::MapCenter) {
47             // Insert newline after previous list
48             if (cur->depth() < lastDepth)
49                 out += "\n";
50
51             // Make indentstring
52             curIndent = "";
53             for (i = 1; i < cur->depth() - 1; i++)
54                 curIndent += indentPerDepth;
55
56             curHeading = cur->getHeadingText();
57
58             // If necessary, write heading as URL
59             if (!cur->getURL().isEmpty())
60                 curHeading = "[" + curHeading + "](" + cur->getURL() + ")";
61
62             if (!cur->hasHiddenExportParent()) {
63                 // qDebug() << "ExportMarkdown::
64                 // "<<curIndent.toStdString()<<cur->curHeading.toStdString();
65
66                 dashIndent = "";
67                 switch (cur->depth()) {
68                 case 0:
69                     out += "\n";
70                     out += ("# " + curHeading);
71                     out += "\n";
72                     break;
73                 case 1:
74                     out += "\n";
75                     out += ("## " + curHeading);
76                     out += "\n";
77                     break;
78                 case 2:
79                     out += "\n";
80                     out += ("### " + curHeading);
81                     out += "\n";
82                     break;
83                 case 3:
84                     out += "\n";
85                     out += ("#### " + curHeading);
86                     out += "\n";
87                     break;
88                 case 4:
89                     out += "\n";
90                     out += ("##### " + curHeading);
91                     out += "\n";
92                     break;
93                 case 5:
94                     out += "\n";
95                     out += ("###### " + curHeading);
96                     out += "\n";
97                     break;
98                 default:
99                     out += "\n";
100                     out += (curIndent + "- " + curHeading);
101                     out += "\n";
102                     dashIndent = "  ";
103                     break;
104                 }
105
106                 // If there is a task, save it for potential later display
107                 if (listTasks && cur->getTask()) {
108                     tasks.append(QString("[%1]: %2")
109                                      .arg(cur->getTask()->getStatusString())
110                                      .arg(curHeading));
111                 }
112
113                 // If necessary, write vymlink
114                 if (!cur->getVymLink().isEmpty())
115                     out += (curIndent + dashIndent + cur->getVymLink()) +
116                            " (vym mindmap)\n";
117
118                 // If necessary, write note
119                 if (!cur->isNoteEmpty()) {
120                     // curIndent +="  | ";
121                     // Only indent for bullet points
122                     if (cur->depth() > 2)
123                         curIndent += "  ";
124                     out += '\n' + cur->getNoteASCII(curIndent, 80);
125                 }
126                 lastDepth = cur->depth();
127             }
128         }
129         model->nextBranch(cur, prev);
130     }
131
132     if (listTasks) {
133         out += "\n\nTasks\n-----\n\n";
134
135         foreach (QString t, tasks) {
136             out += " - " + t + "\n";
137         }
138     }
139     QTextStream ts(&file);
140     ts.setCodec("UTF-8");
141     ts << out;
142     file.close();
143
144     QClipboard *clipboard = QGuiApplication::clipboard();
145     clipboard->setText(out);
146
147     QString listTasksString = listTasks ? "true" : "false";
148
149     displayedDestination = filePath;
150
151     result = ExportBase::Success;
152
153     QStringList args;
154     args << filePath;
155     args << listTasksString;
156
157     completeExport(args);
158 }
159
160 QString ExportMarkdown::underline(const QString &text, const QString &line)
161 {
162     QString r = text + "\n";
163     for (int j = 0; j < text.length(); j++)
164         r += line;
165     return r;
166 }