forked from KDE/ghostwriter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCmarkGfmAPI.cpp
More file actions
117 lines (91 loc) · 3.45 KB
/
Copy pathCmarkGfmAPI.cpp
File metadata and controls
117 lines (91 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/***********************************************************************
*
* Copyright (C) 2020 wereturtle
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
***********************************************************************/
#include "cmark-gfm-core-extensions.h"
#include "cmark-gfm-extension_api.h"
#include "CmarkGfmAPI.h"
CmarkGfmAPI* CmarkGfmAPI::instance = NULL;
CmarkGfmAPI* CmarkGfmAPI::getInstance()
{
if (NULL == instance)
{
instance = new CmarkGfmAPI();
}
return instance;
}
CmarkGfmAPI::~CmarkGfmAPI()
{
cmark_arena_reset();
}
MarkdownAST* CmarkGfmAPI::parse(const QString& text, const bool smartTypographyEnabled)
{
int opts = CMARK_OPT_DEFAULT | CMARK_OPT_FOOTNOTES;
if (smartTypographyEnabled)
{
opts |= CMARK_OPT_SMART;
}
apiMutex.lock();
cmark_mem* mem = cmark_get_arena_mem_allocator();
cmark_parser* parser = cmark_parser_new_with_mem(opts, mem);
cmark_parser_attach_syntax_extension(parser, tableExt);
cmark_parser_attach_syntax_extension(parser, strikethroughExt);
cmark_parser_attach_syntax_extension(parser, autolinkExt);
cmark_parser_attach_syntax_extension(parser, tagfilterExt);
cmark_parser_attach_syntax_extension(parser, tasklistExt);
cmark_parser_feed(parser, text.toLatin1().data(), text.length());
cmark_node* root = cmark_parser_finish(parser);
MarkdownAST* ast = new MarkdownAST(root);
cmark_parser_free(parser);
cmark_node_free(root);
cmark_arena_reset();
apiMutex.unlock();
return ast;
}
QString CmarkGfmAPI::renderToHtml(const QString& text, const bool smartTypographyEnabled)
{
int opts = CMARK_OPT_DEFAULT | CMARK_OPT_FOOTNOTES;
if (smartTypographyEnabled)
{
opts |= CMARK_OPT_SMART;
}
apiMutex.lock();
cmark_mem* mem = cmark_get_arena_mem_allocator();
cmark_parser* parser = cmark_parser_new_with_mem(opts, mem);
cmark_parser_attach_syntax_extension(parser, tableExt);
cmark_parser_attach_syntax_extension(parser, strikethroughExt);
cmark_parser_attach_syntax_extension(parser, autolinkExt);
cmark_parser_attach_syntax_extension(parser, tagfilterExt);
cmark_parser_attach_syntax_extension(parser, tasklistExt);
cmark_parser_feed(parser, text.toLatin1().data(), text.length());
cmark_node* root = cmark_parser_finish(parser);
char* output = cmark_render_html(root, opts, cmark_parser_get_syntax_extensions(parser));
QString html = QString::fromUtf8(output);
cmark_parser_free(parser);
cmark_arena_reset();
apiMutex.unlock();
return html;
}
CmarkGfmAPI::CmarkGfmAPI()
{
cmark_gfm_core_extensions_ensure_registered();
tableExt = cmark_find_syntax_extension("table");
strikethroughExt = cmark_find_syntax_extension("strikethrough");
autolinkExt = cmark_find_syntax_extension("autolink");
tagfilterExt = cmark_find_syntax_extension("tagfilter");
tasklistExt = cmark_find_syntax_extension("tasklist");
}