No segfault anymore when file is missing. Get rid of Qt again in MarkdownRender class
parent
c0c2d5f53a
commit
fbcb8fcc5b
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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.
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue