commonmarker 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of commonmarker might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/Rakefile +9 -9
- data/ext/commonmarker/cmark/api_test/main.c +5 -0
- data/ext/commonmarker/cmark/build/CMakeCache.txt +459 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeCCompiler.cmake +67 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeCXXCompiler.cmake +68 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeDetermineCompilerABI_C.bin +0 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeSystem.cmake +15 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdC/CMakeCCompilerId.c +544 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdC/a.out +0 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +533 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdCXX/a.out +0 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +14 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +562 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/Makefile.cmake +150 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/Makefile2 +295 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/TargetDirectories.txt +39 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/cmake.check_cache +1 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.bin +0 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.c +34 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.cxx +405 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/progress.marks +1 -0
- data/ext/commonmarker/cmark/build/CTestTestfile.cmake +10 -0
- data/ext/commonmarker/cmark/build/Makefile +250 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/DependInfo.cmake +35 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/build.make +168 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cmake_clean.cmake +12 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.make +2 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/flags.make +17 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/link.txt +1 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/progress.make +5 -0
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/progress.marks +1 -0
- data/ext/commonmarker/cmark/build/api_test/Makefile +300 -0
- data/ext/commonmarker/cmark/build/api_test/cmake_install.cmake +29 -0
- data/ext/commonmarker/cmark/build/cmake_install.cmake +48 -0
- data/ext/commonmarker/cmark/build/man/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- data/ext/commonmarker/cmark/build/man/CMakeFiles/progress.marks +1 -0
- data/ext/commonmarker/cmark/build/man/Makefile +194 -0
- data/ext/commonmarker/cmark/build/man/cmake_install.cmake +37 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/DependInfo.cmake +41 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/build.make +626 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmake_clean.cmake +29 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.make +2 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/flags.make +10 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/link.txt +1 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/progress.make +22 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/DependInfo.cmake +46 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/build.make +603 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmake_clean.cmake +29 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.make +2 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/flags.make +10 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/link.txt +1 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/progress.make +21 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/C.includecache +468 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/DependInfo.cmake +40 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/blocks.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/buffer.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/build.make +600 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean.cmake +28 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean_target.cmake +3 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark_ctype.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/commonmark.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.internal +211 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.make +211 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/flags.make +10 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_href_e.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_e.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/html.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/inlines.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/latex.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/link.txt +2 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/man.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/node.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/progress.make +21 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/references.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/render.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/scanners.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/utf8.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/xml.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/progress.marks +1 -0
- data/ext/commonmarker/cmark/build/src/Makefile +956 -0
- data/ext/commonmarker/cmark/build/src/cmake_install.cmake +77 -0
- data/ext/commonmarker/cmark/build/src/cmark_export.h +41 -0
- data/ext/commonmarker/cmark/build/src/cmark_version.h +7 -0
- data/ext/commonmarker/cmark/build/src/config.h +84 -0
- data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
- data/ext/commonmarker/cmark/build/src/libcmark.pc +10 -0
- data/ext/commonmarker/cmark/build/testdir/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
- data/ext/commonmarker/cmark/build/testdir/CMakeFiles/progress.marks +1 -0
- data/ext/commonmarker/cmark/build/testdir/CTestTestfile.cmake +14 -0
- data/ext/commonmarker/cmark/build/testdir/Makefile +194 -0
- data/ext/commonmarker/cmark/build/testdir/cmake_install.cmake +29 -0
- data/ext/commonmarker/cmark/man/man1/cmark.1 +11 -4
- data/ext/commonmarker/cmark/man/man3/cmark.3 +66 -11
- data/ext/commonmarker/cmark/src/blocks.c +232 -235
- data/ext/commonmarker/cmark/src/buffer.c +19 -56
- data/ext/commonmarker/cmark/src/buffer.h +7 -20
- data/ext/commonmarker/cmark/src/chunk.h +19 -19
- data/ext/commonmarker/cmark/src/cmark.c +14 -0
- data/ext/commonmarker/cmark/src/cmark.h +45 -6
- data/ext/commonmarker/cmark/src/cmark_ctype.c +2 -0
- data/ext/commonmarker/cmark/src/cmark_ctype.h +2 -0
- data/ext/commonmarker/cmark/src/commonmark.c +42 -29
- data/ext/commonmarker/cmark/src/config.h.in +8 -0
- data/ext/commonmarker/cmark/src/html.c +3 -1
- data/ext/commonmarker/cmark/src/inlines.c +111 -150
- data/ext/commonmarker/cmark/src/inlines.h +4 -4
- data/ext/commonmarker/cmark/src/iterator.c +6 -7
- data/ext/commonmarker/cmark/src/iterator.h +2 -0
- data/ext/commonmarker/cmark/src/latex.c +10 -8
- data/ext/commonmarker/cmark/src/main.c +6 -2
- data/ext/commonmarker/cmark/src/man.c +9 -5
- data/ext/commonmarker/cmark/src/node.c +38 -29
- data/ext/commonmarker/cmark/src/node.h +15 -11
- data/ext/commonmarker/cmark/src/parser.h +4 -2
- data/ext/commonmarker/cmark/src/references.c +23 -22
- data/ext/commonmarker/cmark/src/references.h +3 -1
- data/ext/commonmarker/cmark/src/render.c +9 -7
- data/ext/commonmarker/cmark/src/render.h +3 -1
- data/ext/commonmarker/cmark/src/scanners.c +30 -22
- data/ext/commonmarker/cmark/src/xml.c +1 -1
- data/ext/commonmarker/cmark/test/CMakeLists.txt +8 -8
- data/ext/commonmarker/cmark/test/cmark.py +34 -14
- data/ext/commonmarker/cmark/test/roundtrip_tests.py +47 -0
- data/ext/commonmarker/cmark/test/spec.txt +96 -6
- data/ext/commonmarker/cmark/test/spec_tests.py +5 -8
- data/ext/commonmarker/commonmarker.c +14 -8
- data/lib/commonmarker/config.rb +2 -2
- data/lib/commonmarker/renderer.rb +17 -7
- data/lib/commonmarker/renderer/html_renderer.rb +16 -21
- data/lib/commonmarker/version.rb +1 -1
- data/test/test_pathological_inputs.rb +11 -11
- metadata +99 -4
- data/ext/commonmarker/cmark/test/roundtrip.bat +0 -1
- data/ext/commonmarker/cmark/test/roundtrip.sh +0 -2
@@ -5,13 +5,13 @@
|
|
5
5
|
extern "C" {
|
6
6
|
#endif
|
7
7
|
|
8
|
-
cmark_chunk cmark_clean_url(cmark_chunk *url);
|
9
|
-
cmark_chunk cmark_clean_title(cmark_chunk *title);
|
8
|
+
cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url);
|
9
|
+
cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title);
|
10
10
|
|
11
|
-
void cmark_parse_inlines(cmark_node *parent, cmark_reference_map *refmap,
|
11
|
+
void cmark_parse_inlines(cmark_mem *mem, cmark_node *parent, cmark_reference_map *refmap,
|
12
12
|
int options);
|
13
13
|
|
14
|
-
bufsize_t cmark_parse_reference_inline(cmark_strbuf *input,
|
14
|
+
bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_strbuf *input,
|
15
15
|
cmark_reference_map *refmap);
|
16
16
|
|
17
17
|
#ifdef __cplusplus
|
@@ -16,10 +16,9 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
|
|
16
16
|
if (root == NULL) {
|
17
17
|
return NULL;
|
18
18
|
}
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
}
|
19
|
+
cmark_mem *mem = root->content.mem;
|
20
|
+
cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter));
|
21
|
+
iter->mem = mem;
|
23
22
|
iter->root = root;
|
24
23
|
iter->cur.ev_type = CMARK_EVENT_NONE;
|
25
24
|
iter->cur.node = NULL;
|
@@ -28,7 +27,7 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
|
|
28
27
|
return iter;
|
29
28
|
}
|
30
29
|
|
31
|
-
void cmark_iter_free(cmark_iter *iter) { free(iter); }
|
30
|
+
void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); }
|
32
31
|
|
33
32
|
static bool S_is_leaf(cmark_node *node) {
|
34
33
|
return ((1 << node->type) & S_leaf_mask) != 0;
|
@@ -93,7 +92,7 @@ void cmark_consolidate_text_nodes(cmark_node *root) {
|
|
93
92
|
return;
|
94
93
|
}
|
95
94
|
cmark_iter *iter = cmark_iter_new(root);
|
96
|
-
cmark_strbuf buf =
|
95
|
+
cmark_strbuf buf = CMARK_BUF_INIT(iter->mem);
|
97
96
|
cmark_event_type ev_type;
|
98
97
|
cmark_node *cur, *tmp, *next;
|
99
98
|
|
@@ -111,7 +110,7 @@ void cmark_consolidate_text_nodes(cmark_node *root) {
|
|
111
110
|
cmark_node_free(tmp);
|
112
111
|
tmp = next;
|
113
112
|
}
|
114
|
-
cmark_chunk_free(&cur->as.literal);
|
113
|
+
cmark_chunk_free(iter->mem, &cur->as.literal);
|
115
114
|
cur->as.literal = cmark_chunk_buf_detach(&buf);
|
116
115
|
}
|
117
116
|
}
|
@@ -6,6 +6,7 @@ extern "C" {
|
|
6
6
|
#endif
|
7
7
|
|
8
8
|
#include "cmark.h"
|
9
|
+
#include "memory.h"
|
9
10
|
|
10
11
|
typedef struct {
|
11
12
|
cmark_event_type ev_type;
|
@@ -13,6 +14,7 @@ typedef struct {
|
|
13
14
|
} cmark_iter_state;
|
14
15
|
|
15
16
|
struct cmark_iter {
|
17
|
+
cmark_mem *mem;
|
16
18
|
cmark_node *root;
|
17
19
|
cmark_iter_state cur;
|
18
20
|
cmark_iter_state next;
|
@@ -2,7 +2,6 @@
|
|
2
2
|
#include <stdio.h>
|
3
3
|
#include <string.h>
|
4
4
|
#include <assert.h>
|
5
|
-
#include <ctype.h>
|
6
5
|
|
7
6
|
#include "config.h"
|
8
7
|
#include "cmark.h"
|
@@ -12,7 +11,6 @@
|
|
12
11
|
#include "scanners.h"
|
13
12
|
#include "render.h"
|
14
13
|
|
15
|
-
#define safe_strlen(s) cmark_strbuf_safe_strlen(s)
|
16
14
|
#define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping)
|
17
15
|
#define LIT(s) renderer->out(renderer, s, false, LITERAL)
|
18
16
|
#define CR() renderer->cr(renderer)
|
@@ -20,7 +18,7 @@
|
|
20
18
|
#define LIST_NUMBER_STRING_SIZE 20
|
21
19
|
|
22
20
|
static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
|
23
|
-
|
21
|
+
int32_t c, unsigned char nextc) {
|
24
22
|
if (escape == LITERAL) {
|
25
23
|
cmark_render_code_point(renderer, c);
|
26
24
|
return;
|
@@ -169,13 +167,13 @@ static link_type get_link_type(cmark_node *node) {
|
|
169
167
|
return INTERNAL_LINK;
|
170
168
|
}
|
171
169
|
|
172
|
-
url_len =
|
170
|
+
url_len = strlen(url);
|
173
171
|
if (url_len == 0 || scan_scheme(&url_chunk, 0) == 0) {
|
174
172
|
return NO_LINK;
|
175
173
|
}
|
176
174
|
|
177
175
|
const char *title = cmark_node_get_title(node);
|
178
|
-
title_len =
|
176
|
+
title_len = strlen(title);
|
179
177
|
// if it has a title, we can't treat it as an autolink:
|
180
178
|
if (title_len == 0) {
|
181
179
|
|
@@ -223,6 +221,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
223
221
|
cmark_list_type list_type;
|
224
222
|
const char *roman_numerals[] = {"", "i", "ii", "iii", "iv", "v",
|
225
223
|
"vi", "vii", "viii", "ix", "x"};
|
224
|
+
bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options);
|
226
225
|
|
227
226
|
// avoid warning about unused parameter:
|
228
227
|
(void)(options);
|
@@ -334,7 +333,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
334
333
|
break;
|
335
334
|
|
336
335
|
case CMARK_NODE_TEXT:
|
337
|
-
OUT(cmark_node_get_literal(node),
|
336
|
+
OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
|
338
337
|
break;
|
339
338
|
|
340
339
|
case CMARK_NODE_LINEBREAK:
|
@@ -343,10 +342,13 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
343
342
|
break;
|
344
343
|
|
345
344
|
case CMARK_NODE_SOFTBREAK:
|
346
|
-
if (
|
345
|
+
if (options & CMARK_OPT_HARDBREAKS) {
|
346
|
+
LIT("\\\\");
|
347
|
+
CR();
|
348
|
+
} else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) {
|
347
349
|
CR();
|
348
350
|
} else {
|
349
|
-
OUT(" ",
|
351
|
+
OUT(" ", allow_wrap, NORMAL);
|
350
352
|
}
|
351
353
|
break;
|
352
354
|
|
@@ -3,6 +3,7 @@
|
|
3
3
|
#include <string.h>
|
4
4
|
#include <errno.h>
|
5
5
|
#include "config.h"
|
6
|
+
#include "memory.h"
|
6
7
|
#include "cmark.h"
|
7
8
|
|
8
9
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
@@ -27,6 +28,7 @@ void print_usage() {
|
|
27
28
|
printf(" --width WIDTH Specify wrap width (default 0 = nowrap)\n");
|
28
29
|
printf(" --sourcepos Include source position attribute\n");
|
29
30
|
printf(" --hardbreaks Treat newlines as hard line breaks\n");
|
31
|
+
printf(" --nobreaks Render soft line breaks as spaces\n");
|
30
32
|
printf(" --safe Suppress raw HTML and dangerous URLs\n");
|
31
33
|
printf(" --smart Use smart punctuation\n");
|
32
34
|
printf(" --normalize Consolidate adjacent text nodes\n");
|
@@ -79,17 +81,19 @@ int main(int argc, char *argv[]) {
|
|
79
81
|
_setmode(_fileno(stdout), _O_BINARY);
|
80
82
|
#endif
|
81
83
|
|
82
|
-
files = (int *)
|
84
|
+
files = (int *)calloc(argc, sizeof(*files));
|
83
85
|
|
84
86
|
for (i = 1; i < argc; i++) {
|
85
87
|
if (strcmp(argv[i], "--version") == 0) {
|
86
88
|
printf("cmark %s", CMARK_VERSION_STRING);
|
87
|
-
printf(" - CommonMark converter\n(C) 2014
|
89
|
+
printf(" - CommonMark converter\n(C) 2014-2016 John MacFarlane\n");
|
88
90
|
exit(0);
|
89
91
|
} else if (strcmp(argv[i], "--sourcepos") == 0) {
|
90
92
|
options |= CMARK_OPT_SOURCEPOS;
|
91
93
|
} else if (strcmp(argv[i], "--hardbreaks") == 0) {
|
92
94
|
options |= CMARK_OPT_HARDBREAKS;
|
95
|
+
} else if (strcmp(argv[i], "--nobreaks") == 0) {
|
96
|
+
options |= CMARK_OPT_NOBREAKS;
|
93
97
|
} else if (strcmp(argv[i], "--smart") == 0) {
|
94
98
|
options |= CMARK_OPT_SMART;
|
95
99
|
} else if (strcmp(argv[i], "--safe") == 0) {
|
@@ -75,6 +75,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
75
75
|
cmark_node *tmp;
|
76
76
|
int list_number;
|
77
77
|
bool entering = (ev_type == CMARK_EVENT_ENTER);
|
78
|
+
bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options);
|
78
79
|
|
79
80
|
// avoid unused parameter error:
|
80
81
|
(void)(options);
|
@@ -173,7 +174,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
173
174
|
break;
|
174
175
|
|
175
176
|
case CMARK_NODE_TEXT:
|
176
|
-
OUT(cmark_node_get_literal(node),
|
177
|
+
OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
|
177
178
|
break;
|
178
179
|
|
179
180
|
case CMARK_NODE_LINEBREAK:
|
@@ -182,16 +183,19 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
182
183
|
break;
|
183
184
|
|
184
185
|
case CMARK_NODE_SOFTBREAK:
|
185
|
-
if (
|
186
|
+
if (options & CMARK_OPT_HARDBREAKS) {
|
187
|
+
LIT(".PD 0\n.P\n.PD");
|
188
|
+
CR();
|
189
|
+
} else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) {
|
186
190
|
CR();
|
187
191
|
} else {
|
188
|
-
OUT(" ",
|
192
|
+
OUT(" ", allow_wrap, LITERAL);
|
189
193
|
}
|
190
194
|
break;
|
191
195
|
|
192
196
|
case CMARK_NODE_CODE:
|
193
197
|
LIT("\\f[C]");
|
194
|
-
OUT(cmark_node_get_literal(node),
|
198
|
+
OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
|
195
199
|
LIT("\\f[]");
|
196
200
|
break;
|
197
201
|
|
@@ -222,7 +226,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|
222
226
|
case CMARK_NODE_LINK:
|
223
227
|
if (!entering) {
|
224
228
|
LIT(" (");
|
225
|
-
OUT(cmark_node_get_url(node),
|
229
|
+
OUT(cmark_node_get_url(node), allow_wrap, URL);
|
226
230
|
LIT(")");
|
227
231
|
}
|
228
232
|
break;
|
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
static void S_node_unlink(cmark_node *node);
|
8
8
|
|
9
|
+
#define NODE_MEM(node) cmark_node_mem(node)
|
10
|
+
|
9
11
|
static CMARK_INLINE bool S_is_block(cmark_node *node) {
|
10
12
|
if (node == NULL) {
|
11
13
|
return false;
|
@@ -28,6 +30,9 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
|
|
28
30
|
if (node == NULL || child == NULL) {
|
29
31
|
return false;
|
30
32
|
}
|
33
|
+
if (NODE_MEM(node) != NODE_MEM(child)) {
|
34
|
+
return 0;
|
35
|
+
}
|
31
36
|
|
32
37
|
// Verify that child is not an ancestor of node or equal to node.
|
33
38
|
cur = node;
|
@@ -70,9 +75,10 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
|
|
70
75
|
return false;
|
71
76
|
}
|
72
77
|
|
73
|
-
cmark_node *
|
74
|
-
cmark_node *node = (cmark_node *)calloc(1, sizeof(*node));
|
75
|
-
node->
|
78
|
+
cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
|
79
|
+
cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
|
80
|
+
cmark_strbuf_init(mem, &node->content, 0);
|
81
|
+
node->type = (uint16_t)type;
|
76
82
|
|
77
83
|
switch (node->type) {
|
78
84
|
case CMARK_NODE_HEADING:
|
@@ -94,33 +100,36 @@ cmark_node *cmark_node_new(cmark_node_type type) {
|
|
94
100
|
return node;
|
95
101
|
}
|
96
102
|
|
103
|
+
cmark_node *cmark_node_new(cmark_node_type type) {
|
104
|
+
extern cmark_mem DEFAULT_MEM_ALLOCATOR;
|
105
|
+
return cmark_node_new_with_mem(type, &DEFAULT_MEM_ALLOCATOR);
|
106
|
+
}
|
107
|
+
|
97
108
|
// Free a cmark_node list and any children.
|
98
109
|
static void S_free_nodes(cmark_node *e) {
|
99
110
|
cmark_node *next;
|
100
111
|
while (e != NULL) {
|
101
|
-
|
102
|
-
cmark_strbuf_free(&e->string_content);
|
103
|
-
}
|
112
|
+
cmark_strbuf_free(&e->content);
|
104
113
|
switch (e->type) {
|
105
114
|
case CMARK_NODE_CODE_BLOCK:
|
106
|
-
cmark_chunk_free(&e->as.code.info);
|
107
|
-
cmark_chunk_free(&e->as.code.literal);
|
115
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.code.info);
|
116
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.code.literal);
|
108
117
|
break;
|
109
118
|
case CMARK_NODE_TEXT:
|
110
119
|
case CMARK_NODE_HTML_INLINE:
|
111
120
|
case CMARK_NODE_CODE:
|
112
121
|
case CMARK_NODE_HTML_BLOCK:
|
113
|
-
cmark_chunk_free(&e->as.literal);
|
122
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.literal);
|
114
123
|
break;
|
115
124
|
case CMARK_NODE_LINK:
|
116
125
|
case CMARK_NODE_IMAGE:
|
117
|
-
cmark_chunk_free(&e->as.link.url);
|
118
|
-
cmark_chunk_free(&e->as.link.title);
|
126
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.link.url);
|
127
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.link.title);
|
119
128
|
break;
|
120
129
|
case CMARK_NODE_CUSTOM_BLOCK:
|
121
130
|
case CMARK_NODE_CUSTOM_INLINE:
|
122
|
-
cmark_chunk_free(&e->as.custom.on_enter);
|
123
|
-
cmark_chunk_free(&e->as.custom.on_exit);
|
131
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_enter);
|
132
|
+
cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_exit);
|
124
133
|
break;
|
125
134
|
default:
|
126
135
|
break;
|
@@ -131,7 +140,7 @@ static void S_free_nodes(cmark_node *e) {
|
|
131
140
|
e->next = e->first_child;
|
132
141
|
}
|
133
142
|
next = e->next;
|
134
|
-
free(e);
|
143
|
+
NODE_MEM(e)->free(e);
|
135
144
|
e = next;
|
136
145
|
}
|
137
146
|
}
|
@@ -146,7 +155,7 @@ cmark_node_type cmark_node_get_type(cmark_node *node) {
|
|
146
155
|
if (node == NULL) {
|
147
156
|
return CMARK_NODE_NONE;
|
148
157
|
} else {
|
149
|
-
return node->type;
|
158
|
+
return (cmark_node_type)node->type;
|
150
159
|
}
|
151
160
|
}
|
152
161
|
|
@@ -269,10 +278,10 @@ const char *cmark_node_get_literal(cmark_node *node) {
|
|
269
278
|
case CMARK_NODE_TEXT:
|
270
279
|
case CMARK_NODE_HTML_INLINE:
|
271
280
|
case CMARK_NODE_CODE:
|
272
|
-
return cmark_chunk_to_cstr(&node->as.literal);
|
281
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);
|
273
282
|
|
274
283
|
case CMARK_NODE_CODE_BLOCK:
|
275
|
-
return cmark_chunk_to_cstr(&node->as.code.literal);
|
284
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal);
|
276
285
|
|
277
286
|
default:
|
278
287
|
break;
|
@@ -291,11 +300,11 @@ int cmark_node_set_literal(cmark_node *node, const char *content) {
|
|
291
300
|
case CMARK_NODE_TEXT:
|
292
301
|
case CMARK_NODE_HTML_INLINE:
|
293
302
|
case CMARK_NODE_CODE:
|
294
|
-
cmark_chunk_set_cstr(&node->as.literal, content);
|
303
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content);
|
295
304
|
return 1;
|
296
305
|
|
297
306
|
case CMARK_NODE_CODE_BLOCK:
|
298
|
-
cmark_chunk_set_cstr(&node->as.code.literal, content);
|
307
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content);
|
299
308
|
return 1;
|
300
309
|
|
301
310
|
default:
|
@@ -452,7 +461,7 @@ const char *cmark_node_get_fence_info(cmark_node *node) {
|
|
452
461
|
}
|
453
462
|
|
454
463
|
if (node->type == CMARK_NODE_CODE_BLOCK) {
|
455
|
-
return cmark_chunk_to_cstr(&node->as.code.info);
|
464
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info);
|
456
465
|
} else {
|
457
466
|
return NULL;
|
458
467
|
}
|
@@ -464,7 +473,7 @@ int cmark_node_set_fence_info(cmark_node *node, const char *info) {
|
|
464
473
|
}
|
465
474
|
|
466
475
|
if (node->type == CMARK_NODE_CODE_BLOCK) {
|
467
|
-
cmark_chunk_set_cstr(&node->as.code.info, info);
|
476
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info);
|
468
477
|
return 1;
|
469
478
|
} else {
|
470
479
|
return 0;
|
@@ -479,7 +488,7 @@ const char *cmark_node_get_url(cmark_node *node) {
|
|
479
488
|
switch (node->type) {
|
480
489
|
case CMARK_NODE_LINK:
|
481
490
|
case CMARK_NODE_IMAGE:
|
482
|
-
return cmark_chunk_to_cstr(&node->as.link.url);
|
491
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.url);
|
483
492
|
default:
|
484
493
|
break;
|
485
494
|
}
|
@@ -495,7 +504,7 @@ int cmark_node_set_url(cmark_node *node, const char *url) {
|
|
495
504
|
switch (node->type) {
|
496
505
|
case CMARK_NODE_LINK:
|
497
506
|
case CMARK_NODE_IMAGE:
|
498
|
-
cmark_chunk_set_cstr(&node->as.link.url, url);
|
507
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.url, url);
|
499
508
|
return 1;
|
500
509
|
default:
|
501
510
|
break;
|
@@ -512,7 +521,7 @@ const char *cmark_node_get_title(cmark_node *node) {
|
|
512
521
|
switch (node->type) {
|
513
522
|
case CMARK_NODE_LINK:
|
514
523
|
case CMARK_NODE_IMAGE:
|
515
|
-
return cmark_chunk_to_cstr(&node->as.link.title);
|
524
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.title);
|
516
525
|
default:
|
517
526
|
break;
|
518
527
|
}
|
@@ -528,7 +537,7 @@ int cmark_node_set_title(cmark_node *node, const char *title) {
|
|
528
537
|
switch (node->type) {
|
529
538
|
case CMARK_NODE_LINK:
|
530
539
|
case CMARK_NODE_IMAGE:
|
531
|
-
cmark_chunk_set_cstr(&node->as.link.title, title);
|
540
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.title, title);
|
532
541
|
return 1;
|
533
542
|
default:
|
534
543
|
break;
|
@@ -545,7 +554,7 @@ const char *cmark_node_get_on_enter(cmark_node *node) {
|
|
545
554
|
switch (node->type) {
|
546
555
|
case CMARK_NODE_CUSTOM_INLINE:
|
547
556
|
case CMARK_NODE_CUSTOM_BLOCK:
|
548
|
-
return cmark_chunk_to_cstr(&node->as.custom.on_enter);
|
557
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_enter);
|
549
558
|
default:
|
550
559
|
break;
|
551
560
|
}
|
@@ -561,7 +570,7 @@ int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) {
|
|
561
570
|
switch (node->type) {
|
562
571
|
case CMARK_NODE_CUSTOM_INLINE:
|
563
572
|
case CMARK_NODE_CUSTOM_BLOCK:
|
564
|
-
cmark_chunk_set_cstr(&node->as.custom.on_enter, on_enter);
|
573
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter);
|
565
574
|
return 1;
|
566
575
|
default:
|
567
576
|
break;
|
@@ -578,7 +587,7 @@ const char *cmark_node_get_on_exit(cmark_node *node) {
|
|
578
587
|
switch (node->type) {
|
579
588
|
case CMARK_NODE_CUSTOM_INLINE:
|
580
589
|
case CMARK_NODE_CUSTOM_BLOCK:
|
581
|
-
return cmark_chunk_to_cstr(&node->as.custom.on_exit);
|
590
|
+
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_exit);
|
582
591
|
default:
|
583
592
|
break;
|
584
593
|
}
|
@@ -594,7 +603,7 @@ int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) {
|
|
594
603
|
switch (node->type) {
|
595
604
|
case CMARK_NODE_CUSTOM_INLINE:
|
596
605
|
case CMARK_NODE_CUSTOM_BLOCK:
|
597
|
-
cmark_chunk_set_cstr(&node->as.custom.on_exit, on_exit);
|
606
|
+
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit);
|
598
607
|
return 1;
|
599
608
|
default:
|
600
609
|
break;
|
@@ -25,11 +25,10 @@ typedef struct {
|
|
25
25
|
typedef struct {
|
26
26
|
cmark_chunk info;
|
27
27
|
cmark_chunk literal;
|
28
|
-
|
29
|
-
|
30
|
-
int8_t fence_offset;
|
28
|
+
uint8_t fence_length;
|
29
|
+
uint8_t fence_offset;
|
31
30
|
unsigned char fence_char;
|
32
|
-
|
31
|
+
int8_t fenced;
|
33
32
|
} cmark_code;
|
34
33
|
|
35
34
|
typedef struct {
|
@@ -47,7 +46,14 @@ typedef struct {
|
|
47
46
|
cmark_chunk on_exit;
|
48
47
|
} cmark_custom;
|
49
48
|
|
49
|
+
enum cmark_node__internal_flags {
|
50
|
+
CMARK_NODE__OPEN = (1 << 0),
|
51
|
+
CMARK_NODE__LAST_LINE_BLANK = (1 << 1),
|
52
|
+
};
|
53
|
+
|
50
54
|
struct cmark_node {
|
55
|
+
cmark_strbuf content;
|
56
|
+
|
51
57
|
struct cmark_node *next;
|
52
58
|
struct cmark_node *prev;
|
53
59
|
struct cmark_node *parent;
|
@@ -60,13 +66,8 @@ struct cmark_node {
|
|
60
66
|
int start_column;
|
61
67
|
int end_line;
|
62
68
|
int end_column;
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
bool open;
|
67
|
-
bool last_line_blank;
|
68
|
-
|
69
|
-
cmark_strbuf string_content;
|
69
|
+
uint16_t type;
|
70
|
+
uint16_t flags;
|
70
71
|
|
71
72
|
union {
|
72
73
|
cmark_chunk literal;
|
@@ -79,6 +80,9 @@ struct cmark_node {
|
|
79
80
|
} as;
|
80
81
|
};
|
81
82
|
|
83
|
+
static CMARK_INLINE cmark_mem *cmark_node_mem(cmark_node *node) {
|
84
|
+
return node->content.mem;
|
85
|
+
}
|
82
86
|
CMARK_EXPORT int cmark_node_check(cmark_node *node, FILE *out);
|
83
87
|
|
84
88
|
#ifdef __cplusplus
|