diff --git a/.vscode/settings.json b/.vscode/settings.json index c80fa16..36a2f17 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,10 @@ "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", "files.associations": { "qapplication": "cpp", - "ostream": "cpp" + "ostream": "cpp", + "qdir": "cpp", + "qfile": "cpp", + "*.tcc": "cpp", + "qmainwindow": "cpp" } } \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0dcf930..f1e21e9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,7 @@ set (CMAKE_AUTOUIC ON) set (CMAKE_AUTOMOC ON) set (CMAKE_AUTORCC ON) -set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD 20) set (CMAKE_CXX_STANDARD_REQUIRED ON) # QtCreator supports the following variables for Android, which are identical to qmake Android variables. diff --git a/src/main.cc b/src/main.cc index f587a71..f9ffdc9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -2,14 +2,16 @@ #include "markdown-render.h" #include +#include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; MarkdownRender md; - - w.setLabel(md.render()); + + QString output = QString::fromStdString(md.render()); + w.setLabel(output); w.show(); return a.exec(); } diff --git a/src/mainwindow.cc b/src/mainwindow.cc index 206189f..c9f39b1 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -13,7 +13,7 @@ MainWindow::~MainWindow() delete ui; } -void MainWindow::setLabel(QString text) +void MainWindow::setLabel(const QString& text) { QLabel *label = findChild("output"); if(label) diff --git a/src/mainwindow.h b/src/mainwindow.h index ff3f616..38b8f7d 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -15,7 +16,7 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); - void setLabel(QString text); + void setLabel(const QString& text); private: Ui::MainWindow *ui; }; diff --git a/src/markdown-render.cc b/src/markdown-render.cc index fb0190e..121feb9 100644 --- a/src/markdown-render.cc +++ b/src/markdown-render.cc @@ -1,12 +1,8 @@ #include "markdown-render.h" -#include -#include -#include -#include -#include +#include +#include #include -#include #include #include "node.h" @@ -24,23 +20,15 @@ static inline void outc(cmark_renderer *renderer, cmark_node *node, MarkdownRender::MarkdownRender() { - exePath = QCoreApplication::applicationDirPath(); + exePath = std::filesystem::current_path().string(); } -QString const MarkdownRender::render() +std::string const MarkdownRender::render() { - QString filePath = exePath + QDir::separator() + "../../test.md"; + std::string filePath = exePath.append("/test.md"); + printf("Path: %s\n", filePath.c_str()); - QFile file(filePath); - if(!file.open(QIODevice::ReadOnly)) - { - qDebug() << "error opening file: " << file.error(); - } - char *message = parseAndRender(filePath); - - QString output = QString::fromUtf8(message); - free(message); - return output; + return parseAndRender(filePath); } /** @@ -52,8 +40,9 @@ void MarkdownRender::addMarkdownExtension(cmark_parser *parser, const char *extN cmark_parser_attach_syntax_extension(parser, ext); } -char *MarkdownRender::parseAndRender(const QString& filePath) +std::string MarkdownRender::parseAndRender(const std::string& filePath) { + std::string output(""); int options = CMARK_OPT_DEFAULT; // You can also use CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE to enforce double tilde. cmark_gfm_core_extensions_ensure_registered(); @@ -71,30 +60,34 @@ char *MarkdownRender::parseAndRender(const QString& filePath) // Parse to AST with cmark cmark_node *root_node; - FILE * file; - file = fopen(filePath.toStdString().c_str(), "r"); - // TODO: Copy/paste cmark_parse_file() content, allowing me to add extensions to the parser. - root_node = cmark_parse_file(file, options); - fclose(file); + FILE *file; + if( ( file = fopen(filePath.c_str(), "r" ) ) != NULL ) + { + // TODO: Copy/paste cmark_parse_file() content, allowing me to add extensions to the parser. + root_node = cmark_parse_file(file, options); + fclose(file); + + // Render + char *charStr = renderToLayout(root_node, options, 0, NULL); + output = std::string(charStr); + free(charStr); + + // Stop measurement + t = clock() - t; + double timeDuration = (((double)t)/CLOCKS_PER_SEC) * 1000; // ms + + char *html = cmark_render_html(root_node, options, NULL); + + printf("\nHTML render: %s", html); + printf("My render: %s", output.c_str()); + printf("Content loaded, parsed & rendered time: %f ms", timeDuration); + + free(html); + cmark_node_free(root_node); + } cmark_parser_free(parser); - cmark_node_mem(root_node); - - // Render - char *output = renderToLayout(root_node, options, 0, NULL); - // Stop measurement - t = clock() - t; - double timeDuration = (((double)t)/CLOCKS_PER_SEC) * 1000; // ms - - char *html = cmark_render_html(root_node, options, NULL); - - printf("HTML render: %s", html); - printf("My render: %s", output); - qDebug() << "Content loaded, parsed & rendered time:" << timeDuration << "ms" << endl; - - cmark_node_free(root_node); - return output; } @@ -105,22 +98,22 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node, switch (node->type) { case CMARK_NODE_DOCUMENT: - qDebug() << "Document" << endl; + printf("Document\n"); break; case CMARK_NODE_BLOCK_QUOTE: break; case CMARK_NODE_LIST: - qDebug() << "List" << endl; + printf("List\n"); break; case CMARK_NODE_ITEM: - qDebug() << "Item" << endl; + printf("Item\n"); break; case CMARK_NODE_HEADING: - qDebug() << "Heading" << endl; + printf("Heading\n"); break; case CMARK_NODE_CODE_BLOCK: @@ -136,11 +129,11 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node, break; case CMARK_NODE_PARAGRAPH: - qDebug() << "Paragraph" << endl; + printf("Paragraph\n"); break; case CMARK_NODE_TEXT: - qDebug() << "Text" << endl; + printf("Text\n"); // False = no wrap, we didn't specify a width OUT(cmark_node_get_literal(node), false, NORMAL); @@ -162,7 +155,7 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node, break; case CMARK_NODE_STRONG: - qDebug() << "Bold" << endl; + printf("Bold\n"); if (entering) { LIT("[b]"); } else { @@ -171,7 +164,7 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node, break; case CMARK_NODE_EMPH: - qDebug() << "Italic" << endl; + printf("Italic\n"); if (entering) { LIT("_"); } else { diff --git a/src/markdown-render.h b/src/markdown-render.h index b4592e6..cb51c5e 100644 --- a/src/markdown-render.h +++ b/src/markdown-render.h @@ -1,7 +1,7 @@ #ifndef MARKDOWN_RENDER_H #define MARKDOWN_RENDER_H -#include +#include #include #include "render.h" @@ -9,13 +9,13 @@ class MarkdownRender { public: MarkdownRender(); - QString const render(); + std::string const render(); private: - QString exePath; + std::string exePath; void addMarkdownExtension(cmark_parser *parser, const char *extName); - char * parseAndRender(const QString& filePath); + std::string parseAndRender(const std::string &filePath); static int renderNode(cmark_renderer *renderer, cmark_node *node, cmark_event_type ev_type, int options); char * renderToLayout(cmark_node *root, int options, int width, cmark_llist *extensions);