No segfault anymore when file is missing. Get rid of Qt again in MarkdownRender class

master
Melroy van den Berg 2020-11-14 05:22:56 +01:00
parent c0c2d5f53a
commit fbcb8fcc5b
7 changed files with 59 additions and 59 deletions

View File

@ -2,6 +2,10 @@
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"files.associations": { "files.associations": {
"qapplication": "cpp", "qapplication": "cpp",
"ostream": "cpp" "ostream": "cpp",
"qdir": "cpp",
"qfile": "cpp",
"*.tcc": "cpp",
"qmainwindow": "cpp"
} }
} }

View File

@ -4,7 +4,7 @@ set (CMAKE_AUTOUIC ON)
set (CMAKE_AUTOMOC ON) set (CMAKE_AUTOMOC ON)
set (CMAKE_AUTORCC ON) set (CMAKE_AUTORCC ON)
set (CMAKE_CXX_STANDARD 11) set (CMAKE_CXX_STANDARD 20)
set (CMAKE_CXX_STANDARD_REQUIRED ON) set (CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables. # QtCreator supports the following variables for Android, which are identical to qmake Android variables.

View File

@ -2,14 +2,16 @@
#include "markdown-render.h" #include "markdown-render.h"
#include <QApplication> #include <QApplication>
#include <QString>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
MarkdownRender md; MarkdownRender md;
w.setLabel(md.render()); QString output = QString::fromStdString(md.render());
w.setLabel(output);
w.show(); w.show();
return a.exec(); return a.exec();
} }

View File

@ -13,7 +13,7 @@ MainWindow::~MainWindow()
delete ui; delete ui;
} }
void MainWindow::setLabel(QString text) void MainWindow::setLabel(const QString& text)
{ {
QLabel *label = findChild<QLabel *>("output"); QLabel *label = findChild<QLabel *>("output");
if(label) if(label)

View File

@ -2,6 +2,7 @@
#define MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QMainWindow>
#include <QString>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@ -15,7 +16,7 @@ public:
MainWindow(QWidget *parent = nullptr); MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
void setLabel(QString text); void setLabel(const QString& text);
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
}; };

View File

@ -1,12 +1,8 @@
#include "markdown-render.h" #include "markdown-render.h"
#include <QCoreApplication> #include <filesystem>
#include <QDebug> #include <string>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <cmark-gfm-core-extensions.h> #include <cmark-gfm-core-extensions.h>
#include <string.h>
#include <time.h> #include <time.h>
#include "node.h" #include "node.h"
@ -24,23 +20,15 @@ static inline void outc(cmark_renderer *renderer, cmark_node *node,
MarkdownRender::MarkdownRender() 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); return parseAndRender(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;
} }
/** /**
@ -52,8 +40,9 @@ void MarkdownRender::addMarkdownExtension(cmark_parser *parser, const char *extN
cmark_parser_attach_syntax_extension(parser, ext); 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. int options = CMARK_OPT_DEFAULT; // You can also use CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE to enforce double tilde.
cmark_gfm_core_extensions_ensure_registered(); cmark_gfm_core_extensions_ensure_registered();
@ -71,30 +60,34 @@ char *MarkdownRender::parseAndRender(const QString& filePath)
// Parse to AST with cmark // Parse to AST with cmark
cmark_node *root_node; cmark_node *root_node;
FILE * file; FILE *file;
file = fopen(filePath.toStdString().c_str(), "r"); 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); // TODO: Copy/paste cmark_parse_file() content, allowing me to add extensions to the parser.
fclose(file); 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_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; return output;
} }
@ -105,22 +98,22 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node,
switch (node->type) { switch (node->type) {
case CMARK_NODE_DOCUMENT: case CMARK_NODE_DOCUMENT:
qDebug() << "Document" << endl; printf("Document\n");
break; break;
case CMARK_NODE_BLOCK_QUOTE: case CMARK_NODE_BLOCK_QUOTE:
break; break;
case CMARK_NODE_LIST: case CMARK_NODE_LIST:
qDebug() << "List" << endl; printf("List\n");
break; break;
case CMARK_NODE_ITEM: case CMARK_NODE_ITEM:
qDebug() << "Item" << endl; printf("Item\n");
break; break;
case CMARK_NODE_HEADING: case CMARK_NODE_HEADING:
qDebug() << "Heading" << endl; printf("Heading\n");
break; break;
case CMARK_NODE_CODE_BLOCK: case CMARK_NODE_CODE_BLOCK:
@ -136,11 +129,11 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node,
break; break;
case CMARK_NODE_PARAGRAPH: case CMARK_NODE_PARAGRAPH:
qDebug() << "Paragraph" << endl; printf("Paragraph\n");
break; break;
case CMARK_NODE_TEXT: case CMARK_NODE_TEXT:
qDebug() << "Text" << endl; printf("Text\n");
// False = no wrap, we didn't specify a width // False = no wrap, we didn't specify a width
OUT(cmark_node_get_literal(node), false, NORMAL); OUT(cmark_node_get_literal(node), false, NORMAL);
@ -162,7 +155,7 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node,
break; break;
case CMARK_NODE_STRONG: case CMARK_NODE_STRONG:
qDebug() << "Bold" << endl; printf("Bold\n");
if (entering) { if (entering) {
LIT("[b]"); LIT("[b]");
} else { } else {
@ -171,7 +164,7 @@ int MarkdownRender::renderNode(cmark_renderer *renderer, cmark_node *node,
break; break;
case CMARK_NODE_EMPH: case CMARK_NODE_EMPH:
qDebug() << "Italic" << endl; printf("Italic\n");
if (entering) { if (entering) {
LIT("_"); LIT("_");
} else { } else {

View File

@ -1,7 +1,7 @@
#ifndef MARKDOWN_RENDER_H #ifndef MARKDOWN_RENDER_H
#define MARKDOWN_RENDER_H #define MARKDOWN_RENDER_H
#include <QString> #include <string>
#include <cmark-gfm.h> #include <cmark-gfm.h>
#include "render.h" #include "render.h"
@ -9,13 +9,13 @@ class MarkdownRender
{ {
public: public:
MarkdownRender(); MarkdownRender();
QString const render(); std::string const render();
private: private:
QString exePath; std::string exePath;
void addMarkdownExtension(cmark_parser *parser, const char *extName); 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, static int renderNode(cmark_renderer *renderer, cmark_node *node,
cmark_event_type ev_type, int options); cmark_event_type ev_type, int options);
char * renderToLayout(cmark_node *root, int options, int width, cmark_llist *extensions); char * renderToLayout(cmark_node *root, int options, int width, cmark_llist *extensions);