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
@@ -4,6 +4,7 @@
|
|
4
4
|
#include <stdio.h>
|
5
5
|
#include "node.h"
|
6
6
|
#include "buffer.h"
|
7
|
+
#include "memory.h"
|
7
8
|
|
8
9
|
#ifdef __cplusplus
|
9
10
|
extern "C" {
|
@@ -12,6 +13,7 @@ extern "C" {
|
|
12
13
|
#define MAX_LINK_LABEL_LENGTH 1000
|
13
14
|
|
14
15
|
struct cmark_parser {
|
16
|
+
struct cmark_mem *mem;
|
15
17
|
struct cmark_reference_map *refmap;
|
16
18
|
struct cmark_node *root;
|
17
19
|
struct cmark_node *current;
|
@@ -23,9 +25,9 @@ struct cmark_parser {
|
|
23
25
|
int indent;
|
24
26
|
bool blank;
|
25
27
|
bool partially_consumed_tab;
|
26
|
-
cmark_strbuf
|
28
|
+
cmark_strbuf curline;
|
27
29
|
bufsize_t last_line_length;
|
28
|
-
cmark_strbuf
|
30
|
+
cmark_strbuf linebuf;
|
29
31
|
int options;
|
30
32
|
bool last_buffer_ended_with_cr;
|
31
33
|
};
|
@@ -14,12 +14,13 @@ static unsigned int refhash(const unsigned char *link_ref) {
|
|
14
14
|
return hash;
|
15
15
|
}
|
16
16
|
|
17
|
-
static void reference_free(cmark_reference *ref) {
|
17
|
+
static void reference_free(cmark_reference_map *map, cmark_reference *ref) {
|
18
|
+
cmark_mem *mem = map->mem;
|
18
19
|
if (ref != NULL) {
|
19
|
-
free(ref->label);
|
20
|
-
cmark_chunk_free(&ref->url);
|
21
|
-
cmark_chunk_free(&ref->title);
|
22
|
-
free(ref);
|
20
|
+
mem->free(ref->label);
|
21
|
+
cmark_chunk_free(mem, &ref->url);
|
22
|
+
cmark_chunk_free(mem, &ref->title);
|
23
|
+
mem->free(ref);
|
23
24
|
}
|
24
25
|
}
|
25
26
|
|
@@ -27,8 +28,8 @@ static void reference_free(cmark_reference *ref) {
|
|
27
28
|
// remove leading/trailing whitespace, case fold
|
28
29
|
// Return NULL if the reference name is actually empty (i.e. composed
|
29
30
|
// solely from whitespace)
|
30
|
-
static unsigned char *normalize_reference(cmark_chunk *ref) {
|
31
|
-
cmark_strbuf normalized =
|
31
|
+
static unsigned char *normalize_reference(cmark_mem *mem, cmark_chunk *ref) {
|
32
|
+
cmark_strbuf normalized = CMARK_BUF_INIT(mem);
|
32
33
|
unsigned char *result;
|
33
34
|
|
34
35
|
if (ref == NULL)
|
@@ -57,7 +58,7 @@ static void add_reference(cmark_reference_map *map, cmark_reference *ref) {
|
|
57
58
|
|
58
59
|
while (t) {
|
59
60
|
if (t->hash == ref->hash && !strcmp((char *)t->label, (char *)ref->label)) {
|
60
|
-
reference_free(ref);
|
61
|
+
reference_free(map, ref);
|
61
62
|
return;
|
62
63
|
}
|
63
64
|
|
@@ -70,22 +71,20 @@ static void add_reference(cmark_reference_map *map, cmark_reference *ref) {
|
|
70
71
|
void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label,
|
71
72
|
cmark_chunk *url, cmark_chunk *title) {
|
72
73
|
cmark_reference *ref;
|
73
|
-
unsigned char *reflabel = normalize_reference(label);
|
74
|
+
unsigned char *reflabel = normalize_reference(map->mem, label);
|
74
75
|
|
75
76
|
/* empty reference name, or composed from only whitespace */
|
76
77
|
if (reflabel == NULL)
|
77
78
|
return;
|
78
79
|
|
79
|
-
ref = (cmark_reference *)calloc(1, sizeof(*ref));
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
ref->next = NULL;
|
80
|
+
ref = (cmark_reference *)map->mem->calloc(1, sizeof(*ref));
|
81
|
+
ref->label = reflabel;
|
82
|
+
ref->hash = refhash(ref->label);
|
83
|
+
ref->url = cmark_clean_url(map->mem, url);
|
84
|
+
ref->title = cmark_clean_title(map->mem, title);
|
85
|
+
ref->next = NULL;
|
86
86
|
|
87
|
-
|
88
|
-
}
|
87
|
+
add_reference(map, ref);
|
89
88
|
}
|
90
89
|
|
91
90
|
// Returns reference if refmap contains a reference with matching
|
@@ -102,7 +101,7 @@ cmark_reference *cmark_reference_lookup(cmark_reference_map *map,
|
|
102
101
|
if (map == NULL)
|
103
102
|
return NULL;
|
104
103
|
|
105
|
-
norm = normalize_reference(label);
|
104
|
+
norm = normalize_reference(map->mem, label);
|
106
105
|
if (norm == NULL)
|
107
106
|
return NULL;
|
108
107
|
|
@@ -131,7 +130,7 @@ void cmark_reference_map_free(cmark_reference_map *map) {
|
|
131
130
|
|
132
131
|
while (ref) {
|
133
132
|
next = ref->next;
|
134
|
-
reference_free(ref);
|
133
|
+
reference_free(map, ref);
|
135
134
|
ref = next;
|
136
135
|
}
|
137
136
|
}
|
@@ -139,6 +138,8 @@ void cmark_reference_map_free(cmark_reference_map *map) {
|
|
139
138
|
free(map);
|
140
139
|
}
|
141
140
|
|
142
|
-
cmark_reference_map *cmark_reference_map_new(
|
143
|
-
|
141
|
+
cmark_reference_map *cmark_reference_map_new(cmark_mem *mem) {
|
142
|
+
cmark_reference_map *map = (cmark_reference_map *)mem->calloc(1, sizeof(cmark_reference_map));
|
143
|
+
map->mem = mem;
|
144
|
+
return map;
|
144
145
|
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#ifndef CMARK_REFERENCES_H
|
2
2
|
#define CMARK_REFERENCES_H
|
3
3
|
|
4
|
+
#include "memory.h"
|
4
5
|
#include "chunk.h"
|
5
6
|
|
6
7
|
#ifdef __cplusplus
|
@@ -20,12 +21,13 @@ struct cmark_reference {
|
|
20
21
|
typedef struct cmark_reference cmark_reference;
|
21
22
|
|
22
23
|
struct cmark_reference_map {
|
24
|
+
cmark_mem *mem;
|
23
25
|
cmark_reference *table[REFMAP_SIZE];
|
24
26
|
};
|
25
27
|
|
26
28
|
typedef struct cmark_reference_map cmark_reference_map;
|
27
29
|
|
28
|
-
cmark_reference_map *cmark_reference_map_new(
|
30
|
+
cmark_reference_map *cmark_reference_map_new(cmark_mem *mem);
|
29
31
|
void cmark_reference_map_free(cmark_reference_map *map);
|
30
32
|
cmark_reference *cmark_reference_lookup(cmark_reference_map *map,
|
31
33
|
cmark_chunk *label);
|
@@ -4,6 +4,7 @@
|
|
4
4
|
#include "cmark.h"
|
5
5
|
#include "utf8.h"
|
6
6
|
#include "render.h"
|
7
|
+
#include "node.h"
|
7
8
|
|
8
9
|
static CMARK_INLINE void S_cr(cmark_renderer *renderer) {
|
9
10
|
if (renderer->need_cr < 1) {
|
@@ -19,7 +20,7 @@ static CMARK_INLINE void S_blankline(cmark_renderer *renderer) {
|
|
19
20
|
|
20
21
|
static void S_out(cmark_renderer *renderer, const char *source, bool wrap,
|
21
22
|
cmark_escaping escape) {
|
22
|
-
int length =
|
23
|
+
int length = strlen(source);
|
23
24
|
unsigned char nextc;
|
24
25
|
int32_t c;
|
25
26
|
int i = 0;
|
@@ -28,7 +29,7 @@ static void S_out(cmark_renderer *renderer, const char *source, bool wrap,
|
|
28
29
|
cmark_chunk remainder = cmark_chunk_literal("");
|
29
30
|
int k = renderer->buffer->size - 1;
|
30
31
|
|
31
|
-
wrap = wrap && !renderer->
|
32
|
+
wrap = wrap && !renderer->no_linebreaks;
|
32
33
|
|
33
34
|
if (renderer->in_tight_list_item && renderer->need_cr > 1) {
|
34
35
|
renderer->need_cr = 1;
|
@@ -108,7 +109,7 @@ static void S_out(cmark_renderer *renderer, const char *source, bool wrap,
|
|
108
109
|
!renderer->begin_line && renderer->last_breakable > 0) {
|
109
110
|
|
110
111
|
// copy from last_breakable to remainder
|
111
|
-
cmark_chunk_set_cstr(&remainder, (char *)renderer->buffer->ptr +
|
112
|
+
cmark_chunk_set_cstr(renderer->mem, &remainder, (char *)renderer->buffer->ptr +
|
112
113
|
renderer->last_breakable + 1);
|
113
114
|
// truncate at last_breakable
|
114
115
|
cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable);
|
@@ -118,7 +119,7 @@ static void S_out(cmark_renderer *renderer, const char *source, bool wrap,
|
|
118
119
|
renderer->prefix->size);
|
119
120
|
cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len);
|
120
121
|
renderer->column = renderer->prefix->size + remainder.len;
|
121
|
-
cmark_chunk_free(&remainder);
|
122
|
+
cmark_chunk_free(renderer->mem, &remainder);
|
122
123
|
renderer->last_breakable = 0;
|
123
124
|
renderer->begin_line = false;
|
124
125
|
renderer->begin_content = false;
|
@@ -146,14 +147,15 @@ char *cmark_render(cmark_node *root, int options, int width,
|
|
146
147
|
int (*render_node)(cmark_renderer *renderer,
|
147
148
|
cmark_node *node,
|
148
149
|
cmark_event_type ev_type, int options)) {
|
149
|
-
|
150
|
-
cmark_strbuf
|
150
|
+
cmark_mem *mem = cmark_node_mem(root);
|
151
|
+
cmark_strbuf pref = CMARK_BUF_INIT(mem);
|
152
|
+
cmark_strbuf buf = CMARK_BUF_INIT(mem);
|
151
153
|
cmark_node *cur;
|
152
154
|
cmark_event_type ev_type;
|
153
155
|
char *result;
|
154
156
|
cmark_iter *iter = cmark_iter_new(root);
|
155
157
|
|
156
|
-
cmark_renderer renderer = {&buf, &pref, 0,
|
158
|
+
cmark_renderer renderer = {mem, &buf, &pref, 0, width, 0,
|
157
159
|
0, true, true, false, false,
|
158
160
|
outc, S_cr, S_blankline, S_out};
|
159
161
|
|
@@ -8,10 +8,12 @@ extern "C" {
|
|
8
8
|
#include <stdlib.h>
|
9
9
|
#include "buffer.h"
|
10
10
|
#include "chunk.h"
|
11
|
+
#include "memory.h"
|
11
12
|
|
12
13
|
typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
|
13
14
|
|
14
15
|
struct cmark_renderer {
|
16
|
+
cmark_mem *mem;
|
15
17
|
cmark_strbuf *buffer;
|
16
18
|
cmark_strbuf *prefix;
|
17
19
|
int column;
|
@@ -20,7 +22,7 @@ struct cmark_renderer {
|
|
20
22
|
bufsize_t last_breakable;
|
21
23
|
bool begin_line;
|
22
24
|
bool begin_content;
|
23
|
-
bool
|
25
|
+
bool no_linebreaks;
|
24
26
|
bool in_tight_list_item;
|
25
27
|
void (*outc)(struct cmark_renderer *, cmark_escaping, int32_t, unsigned char);
|
26
28
|
void (*cr)(struct cmark_renderer *);
|
@@ -8258,37 +8258,45 @@ bufsize_t _scan_html_tag(const unsigned char *p) {
|
|
8258
8258
|
unsigned char yych;
|
8259
8259
|
static const unsigned char yybm[] = {
|
8260
8260
|
/* table 1 .. 8: 0 */
|
8261
|
-
0,
|
8261
|
+
0, 230, 230, 230, 230, 230, 230, 230, 230, 199, 199, 199, 199, 199,
|
8262
8262
|
230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
|
8263
|
-
230, 230, 230, 199, 230, 70,
|
8264
|
-
230, 230, 254, 246, 230, 254, 254, 254, 254, 254, 254, 254, 254,
|
8265
|
-
254, 246, 230, 198, 198, 196, 230, 230, 254, 254, 254, 254, 254,
|
8263
|
+
230, 230, 230, 230, 199, 230, 70, 230, 230, 230, 230, 134, 230, 230,
|
8264
|
+
230, 230, 230, 254, 246, 230, 254, 254, 254, 254, 254, 254, 254, 254,
|
8265
|
+
254, 254, 246, 230, 198, 198, 196, 230, 230, 254, 254, 254, 254, 254,
|
8266
8266
|
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
|
8267
|
-
254, 254, 254, 254, 254, 254, 230, 230, 226, 230, 246, 198, 254,
|
8267
|
+
254, 254, 254, 254, 254, 254, 254, 230, 230, 226, 230, 246, 198, 254,
|
8268
8268
|
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
|
8269
|
-
254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
|
8270
|
-
230,
|
8271
|
-
0,
|
8272
|
-
0,
|
8273
|
-
0,
|
8274
|
-
0,
|
8275
|
-
0,
|
8269
|
+
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 230, 230, 230,
|
8270
|
+
230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8271
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8272
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8273
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8274
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8275
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8276
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8277
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8278
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8279
|
+
0, 0, 0, 0,
|
8276
8280
|
/* table 9 .. 11: 256 */
|
8277
|
-
0,
|
8281
|
+
0, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8278
8282
|
160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8279
8283
|
160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8280
|
-
160, 160,
|
8281
|
-
160, 160, 160, 160, 160, 160, 128, 160, 224, 224, 224, 224, 224,
|
8284
|
+
160, 160, 160, 32, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8285
|
+
160, 160, 160, 160, 160, 160, 160, 128, 160, 224, 224, 224, 224, 224,
|
8282
8286
|
224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
|
8283
|
-
224, 224, 224, 224, 224, 224,
|
8287
|
+
224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 160, 160, 160,
|
8284
8288
|
160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8285
8289
|
160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
|
8286
|
-
160,
|
8287
|
-
0,
|
8288
|
-
0,
|
8289
|
-
0,
|
8290
|
-
0,
|
8291
|
-
0,
|
8290
|
+
160, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8291
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8292
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8293
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8294
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8295
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8296
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8297
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8298
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
8299
|
+
0, 0, 0, 0,
|
8292
8300
|
};
|
8293
8301
|
yych = *(marker = p);
|
8294
8302
|
if (yych <= '`') {
|
@@ -149,7 +149,7 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,
|
|
149
149
|
|
150
150
|
char *cmark_render_xml(cmark_node *root, int options) {
|
151
151
|
char *result;
|
152
|
-
cmark_strbuf xml =
|
152
|
+
cmark_strbuf xml = CMARK_BUF_INIT(cmark_node_mem(root));
|
153
153
|
cmark_event_type ev_type;
|
154
154
|
cmark_node *cur;
|
155
155
|
struct render_state state = {&xml, 0};
|
@@ -13,12 +13,12 @@ add_test(NAME api_test COMMAND api_test)
|
|
13
13
|
|
14
14
|
if (WIN32)
|
15
15
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR}/src WIN_DLL_DIR)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
set(ROUNDTRIP
|
16
|
+
set(NEWPATH "${WIN_DLL_DIR};$ENV{PATH}")
|
17
|
+
string(REPLACE ";" "\\;" NEWPATH "${NEWPATH}")
|
18
|
+
set_tests_properties(api_test PROPERTIES ENVIRONMENT "PATH=${NEWPATH}")
|
19
|
+
set(ROUNDTRIP "${CMAKE_CURRENT_SOURCE_DIR}/roundtrip.bat")
|
20
20
|
else(WIN32)
|
21
|
-
set(ROUNDTRIP
|
21
|
+
set(ROUNDTRIP "${CMAKE_CURRENT_SOURCE_DIR}/roundtrip.sh")
|
22
22
|
endif(WIN32)
|
23
23
|
|
24
24
|
IF (PYTHONINTERP_FOUND)
|
@@ -48,9 +48,9 @@ IF (PYTHONINTERP_FOUND)
|
|
48
48
|
|
49
49
|
add_test(roundtriptest_executable
|
50
50
|
${PYTHON_EXECUTABLE}
|
51
|
-
"${CMAKE_CURRENT_SOURCE_DIR}/
|
52
|
-
"--spec" "${CMAKE_CURRENT_SOURCE_DIR}/spec.txt"
|
53
|
-
"
|
51
|
+
"${CMAKE_CURRENT_SOURCE_DIR}/roundtrip_tests.py"
|
52
|
+
"--spec" "${CMAKE_CURRENT_SOURCE_DIR}/spec.txt"
|
53
|
+
"--library-dir" "${CMAKE_CURRENT_BINARY_DIR}/../src"
|
54
54
|
)
|
55
55
|
|
56
56
|
add_test(regressiontest_executable
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
|
4
|
-
from ctypes import CDLL, c_char_p,
|
4
|
+
from ctypes import CDLL, c_char_p, c_size_t, c_int, c_void_p
|
5
5
|
from subprocess import *
|
6
6
|
import platform
|
7
7
|
import os
|
@@ -11,30 +11,50 @@ def pipe_through_prog(prog, text):
|
|
11
11
|
[result, err] = p1.communicate(input=text.encode('utf-8'))
|
12
12
|
return [p1.returncode, result.decode('utf-8'), err]
|
13
13
|
|
14
|
-
def
|
14
|
+
def to_html(lib, text):
|
15
|
+
markdown = lib.cmark_markdown_to_html
|
16
|
+
markdown.restype = c_char_p
|
17
|
+
markdown.argtypes = [c_char_p, c_size_t, c_int]
|
15
18
|
textbytes = text.encode('utf-8')
|
16
19
|
textlen = len(textbytes)
|
17
|
-
|
20
|
+
result = markdown(textbytes, textlen, 0).decode('utf-8')
|
21
|
+
return [0, result, '']
|
22
|
+
|
23
|
+
def to_commonmark(lib, text):
|
24
|
+
textbytes = text.encode('utf-8')
|
25
|
+
textlen = len(textbytes)
|
26
|
+
parse_document = lib.cmark_parse_document
|
27
|
+
parse_document.restype = c_void_p
|
28
|
+
parse_document.argtypes = [c_char_p, c_size_t, c_int]
|
29
|
+
render_commonmark = lib.cmark_render_commonmark
|
30
|
+
render_commonmark.restype = c_char_p
|
31
|
+
render_commonmark.argtypes = [c_void_p, c_int, c_int]
|
32
|
+
node = parse_document(textbytes, textlen, 0)
|
33
|
+
result = render_commonmark(node, 0, 0).decode('utf-8')
|
34
|
+
return [0, result, '']
|
18
35
|
|
19
36
|
class CMark:
|
20
37
|
def __init__(self, prog=None, library_dir=None):
|
21
38
|
self.prog = prog
|
22
39
|
if prog:
|
23
40
|
self.to_html = lambda x: pipe_through_prog(prog, x)
|
41
|
+
self.to_commonmark = lambda x: pipe_through_prog(prog + ' -t commonmark', x)
|
24
42
|
else:
|
25
43
|
sysname = platform.system()
|
26
44
|
if sysname == 'Darwin':
|
27
|
-
|
45
|
+
libnames = [ "libcmark.dylib" ]
|
28
46
|
elif sysname == 'Windows':
|
29
|
-
|
47
|
+
libnames = [ "cmark.dll", "libcmark.dll" ]
|
30
48
|
else:
|
31
|
-
|
32
|
-
if library_dir:
|
33
|
-
|
34
|
-
|
35
|
-
|
49
|
+
libnames = [ "libcmark.so" ]
|
50
|
+
if not library_dir:
|
51
|
+
library_dir = os.path.join("build", "src")
|
52
|
+
for libname in libnames:
|
53
|
+
candidate = os.path.join(library_dir, libname)
|
54
|
+
if os.path.isfile(candidate):
|
55
|
+
libpath = candidate
|
56
|
+
break
|
36
57
|
cmark = CDLL(libpath)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
self.to_html = lambda x: use_library(markdown, x)
|
58
|
+
self.to_html = lambda x: to_html(cmark, x)
|
59
|
+
self.to_commonmark = lambda x: to_commonmark(cmark, x)
|
60
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import re
|
2
|
+
import sys
|
3
|
+
from spec_tests import get_tests, do_test
|
4
|
+
from cmark import CMark
|
5
|
+
import argparse
|
6
|
+
|
7
|
+
if __name__ == "__main__":
|
8
|
+
parser = argparse.ArgumentParser(description='Run cmark roundtrip tests.')
|
9
|
+
parser.add_argument('-p', '--program', dest='program', nargs='?', default=None,
|
10
|
+
help='program to test')
|
11
|
+
parser.add_argument('-s', '--spec', dest='spec', nargs='?', default='spec.txt',
|
12
|
+
help='path to spec')
|
13
|
+
parser.add_argument('-P', '--pattern', dest='pattern', nargs='?',
|
14
|
+
default=None, help='limit to sections matching regex pattern')
|
15
|
+
parser.add_argument('--library-dir', dest='library_dir', nargs='?',
|
16
|
+
default=None, help='directory containing dynamic library')
|
17
|
+
parser.add_argument('--no-normalize', dest='normalize',
|
18
|
+
action='store_const', const=False, default=True,
|
19
|
+
help='do not normalize HTML')
|
20
|
+
parser.add_argument('-n', '--number', type=int, default=None,
|
21
|
+
help='only consider the test with the given number')
|
22
|
+
args = parser.parse_args(sys.argv[1:])
|
23
|
+
|
24
|
+
spec = sys.argv[1]
|
25
|
+
|
26
|
+
def converter(md):
|
27
|
+
cmark = CMark(prog=args.program, library_dir=args.library_dir)
|
28
|
+
[ec, result, err] = cmark.to_commonmark(md)
|
29
|
+
if ec == 0:
|
30
|
+
[ec, html, err] = cmark.to_html(result)
|
31
|
+
if ec == 0:
|
32
|
+
# In the commonmark writer we insert dummy HTML
|
33
|
+
# comments between lists, and between lists and code
|
34
|
+
# blocks. Strip these out, since the spec uses
|
35
|
+
# two blank lines instead:
|
36
|
+
return [ec, re.sub('<!-- end list -->\n', '', html), '']
|
37
|
+
else:
|
38
|
+
return [ec, html, err]
|
39
|
+
else:
|
40
|
+
return [ec, result, err]
|
41
|
+
|
42
|
+
tests = get_tests(args.spec)
|
43
|
+
result_counts = {'pass': 0, 'fail': 0, 'error': 0, 'skip': 0}
|
44
|
+
for test in tests:
|
45
|
+
do_test(converter, test, args.normalize, result_counts)
|
46
|
+
|
47
|
+
exit(result_counts['fail'] + result_counts['error'])
|