markly 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/markly +94 -0
- data/ext/markly/arena.c +103 -0
- data/ext/markly/autolink.c +425 -0
- data/ext/markly/autolink.h +8 -0
- data/ext/markly/blocks.c +1585 -0
- data/ext/markly/buffer.c +278 -0
- data/ext/markly/buffer.h +116 -0
- data/ext/markly/case_fold_switch.inc +4327 -0
- data/ext/markly/chunk.h +135 -0
- data/ext/markly/cmark-gfm-core-extensions.h +54 -0
- data/ext/markly/cmark-gfm-extension_api.h +736 -0
- data/ext/markly/cmark-gfm-extensions_export.h +42 -0
- data/ext/markly/cmark-gfm.h +817 -0
- data/ext/markly/cmark-gfm_export.h +42 -0
- data/ext/markly/cmark-gfm_version.h +7 -0
- data/ext/markly/cmark.c +55 -0
- data/ext/markly/cmark_ctype.c +44 -0
- data/ext/markly/cmark_ctype.h +33 -0
- data/ext/markly/commonmark.c +519 -0
- data/ext/markly/config.h +76 -0
- data/ext/markly/core-extensions.c +27 -0
- data/ext/markly/entities.inc +2138 -0
- data/ext/markly/ext_scanners.c +1159 -0
- data/ext/markly/ext_scanners.h +24 -0
- data/ext/markly/extconf.rb +7 -0
- data/ext/markly/footnotes.c +40 -0
- data/ext/markly/footnotes.h +25 -0
- data/ext/markly/houdini.h +57 -0
- data/ext/markly/houdini_href_e.c +100 -0
- data/ext/markly/houdini_html_e.c +66 -0
- data/ext/markly/houdini_html_u.c +149 -0
- data/ext/markly/html.c +465 -0
- data/ext/markly/html.h +27 -0
- data/ext/markly/inlines.c +1633 -0
- data/ext/markly/inlines.h +29 -0
- data/ext/markly/iterator.c +159 -0
- data/ext/markly/iterator.h +26 -0
- data/ext/markly/latex.c +466 -0
- data/ext/markly/linked_list.c +37 -0
- data/ext/markly/man.c +278 -0
- data/ext/markly/map.c +122 -0
- data/ext/markly/map.h +41 -0
- data/ext/markly/markly.c +1226 -0
- data/ext/markly/markly.h +16 -0
- data/ext/markly/node.c +979 -0
- data/ext/markly/node.h +118 -0
- data/ext/markly/parser.h +58 -0
- data/ext/markly/plaintext.c +235 -0
- data/ext/markly/plugin.c +36 -0
- data/ext/markly/plugin.h +34 -0
- data/ext/markly/references.c +42 -0
- data/ext/markly/references.h +26 -0
- data/ext/markly/registry.c +63 -0
- data/ext/markly/registry.h +24 -0
- data/ext/markly/render.c +205 -0
- data/ext/markly/render.h +62 -0
- data/ext/markly/scanners.c +20382 -0
- data/ext/markly/scanners.h +62 -0
- data/ext/markly/scanners.re +326 -0
- data/ext/markly/strikethrough.c +167 -0
- data/ext/markly/strikethrough.h +9 -0
- data/ext/markly/syntax_extension.c +149 -0
- data/ext/markly/syntax_extension.h +34 -0
- data/ext/markly/table.c +803 -0
- data/ext/markly/table.h +12 -0
- data/ext/markly/tagfilter.c +60 -0
- data/ext/markly/tagfilter.h +8 -0
- data/ext/markly/tasklist.c +156 -0
- data/ext/markly/tasklist.h +8 -0
- data/ext/markly/utf8.c +317 -0
- data/ext/markly/utf8.h +35 -0
- data/ext/markly/xml.c +181 -0
- data/lib/markly.rb +43 -0
- data/lib/markly/flags.rb +37 -0
- data/lib/markly/markly.so +0 -0
- data/lib/markly/node.rb +70 -0
- data/lib/markly/node/inspect.rb +59 -0
- data/lib/markly/renderer.rb +133 -0
- data/lib/markly/renderer/html_renderer.rb +252 -0
- data/lib/markly/version.rb +5 -0
- metadata +211 -0
data/ext/markly/plugin.h
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#ifndef CMARK_PLUGIN_H
|
2
|
+
#define CMARK_PLUGIN_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
#include "cmark-gfm.h"
|
9
|
+
#include "cmark-gfm-extension_api.h"
|
10
|
+
|
11
|
+
/**
|
12
|
+
* cmark_plugin:
|
13
|
+
*
|
14
|
+
* A plugin structure, which should be filled by plugin's
|
15
|
+
* init functions.
|
16
|
+
*/
|
17
|
+
struct cmark_plugin {
|
18
|
+
cmark_llist *syntax_extensions;
|
19
|
+
};
|
20
|
+
|
21
|
+
cmark_llist *
|
22
|
+
cmark_plugin_steal_syntax_extensions(cmark_plugin *plugin);
|
23
|
+
|
24
|
+
cmark_plugin *
|
25
|
+
cmark_plugin_new(void);
|
26
|
+
|
27
|
+
void
|
28
|
+
cmark_plugin_free(cmark_plugin *plugin);
|
29
|
+
|
30
|
+
#ifdef __cplusplus
|
31
|
+
}
|
32
|
+
#endif
|
33
|
+
|
34
|
+
#endif
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#include "cmark-gfm.h"
|
2
|
+
#include "parser.h"
|
3
|
+
#include "references.h"
|
4
|
+
#include "inlines.h"
|
5
|
+
#include "chunk.h"
|
6
|
+
|
7
|
+
static void reference_free(cmark_map *map, cmark_map_entry *_ref) {
|
8
|
+
cmark_reference *ref = (cmark_reference *)_ref;
|
9
|
+
cmark_mem *mem = map->mem;
|
10
|
+
if (ref != NULL) {
|
11
|
+
mem->free(ref->entry.label);
|
12
|
+
cmark_chunk_free(mem, &ref->url);
|
13
|
+
cmark_chunk_free(mem, &ref->title);
|
14
|
+
mem->free(ref);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
void cmark_reference_create(cmark_map *map, cmark_chunk *label,
|
19
|
+
cmark_chunk *url, cmark_chunk *title) {
|
20
|
+
cmark_reference *ref;
|
21
|
+
unsigned char *reflabel = normalize_map_label(map->mem, label);
|
22
|
+
|
23
|
+
/* empty reference name, or composed from only whitespace */
|
24
|
+
if (reflabel == NULL)
|
25
|
+
return;
|
26
|
+
|
27
|
+
assert(map->sorted == NULL);
|
28
|
+
|
29
|
+
ref = (cmark_reference *)map->mem->calloc(1, sizeof(*ref));
|
30
|
+
ref->entry.label = reflabel;
|
31
|
+
ref->url = cmark_clean_url(map->mem, url);
|
32
|
+
ref->title = cmark_clean_title(map->mem, title);
|
33
|
+
ref->entry.age = map->size;
|
34
|
+
ref->entry.next = map->refs;
|
35
|
+
|
36
|
+
map->refs = (cmark_map_entry *)ref;
|
37
|
+
map->size++;
|
38
|
+
}
|
39
|
+
|
40
|
+
cmark_map *cmark_reference_map_new(cmark_mem *mem) {
|
41
|
+
return cmark_map_new(mem, reference_free);
|
42
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#ifndef CMARK_REFERENCES_H
|
2
|
+
#define CMARK_REFERENCES_H
|
3
|
+
|
4
|
+
#include "map.h"
|
5
|
+
|
6
|
+
#ifdef __cplusplus
|
7
|
+
extern "C" {
|
8
|
+
#endif
|
9
|
+
|
10
|
+
struct cmark_reference {
|
11
|
+
cmark_map_entry entry;
|
12
|
+
cmark_chunk url;
|
13
|
+
cmark_chunk title;
|
14
|
+
};
|
15
|
+
|
16
|
+
typedef struct cmark_reference cmark_reference;
|
17
|
+
|
18
|
+
void cmark_reference_create(cmark_map *map, cmark_chunk *label,
|
19
|
+
cmark_chunk *url, cmark_chunk *title);
|
20
|
+
cmark_map *cmark_reference_map_new(cmark_mem *mem);
|
21
|
+
|
22
|
+
#ifdef __cplusplus
|
23
|
+
}
|
24
|
+
#endif
|
25
|
+
|
26
|
+
#endif
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#include <stdint.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include <string.h>
|
4
|
+
|
5
|
+
#include "config.h"
|
6
|
+
#include "cmark-gfm.h"
|
7
|
+
#include "syntax_extension.h"
|
8
|
+
#include "registry.h"
|
9
|
+
#include "plugin.h"
|
10
|
+
|
11
|
+
extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR;
|
12
|
+
|
13
|
+
static cmark_llist *syntax_extensions = NULL;
|
14
|
+
|
15
|
+
void cmark_register_plugin(cmark_plugin_init_func reg_fn) {
|
16
|
+
cmark_plugin *plugin = cmark_plugin_new();
|
17
|
+
|
18
|
+
if (!reg_fn(plugin)) {
|
19
|
+
cmark_plugin_free(plugin);
|
20
|
+
return;
|
21
|
+
}
|
22
|
+
|
23
|
+
cmark_llist *syntax_extensions_list = cmark_plugin_steal_syntax_extensions(plugin),
|
24
|
+
*it;
|
25
|
+
|
26
|
+
for (it = syntax_extensions_list; it; it = it->next) {
|
27
|
+
syntax_extensions = cmark_llist_append(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions, it->data);
|
28
|
+
}
|
29
|
+
|
30
|
+
cmark_llist_free(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions_list);
|
31
|
+
cmark_plugin_free(plugin);
|
32
|
+
}
|
33
|
+
|
34
|
+
void cmark_release_plugins(void) {
|
35
|
+
if (syntax_extensions) {
|
36
|
+
cmark_llist_free_full(
|
37
|
+
&CMARK_DEFAULT_MEM_ALLOCATOR,
|
38
|
+
syntax_extensions,
|
39
|
+
(cmark_free_func) cmark_syntax_extension_free);
|
40
|
+
syntax_extensions = NULL;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem) {
|
45
|
+
cmark_llist *it;
|
46
|
+
cmark_llist *res = NULL;
|
47
|
+
|
48
|
+
for (it = syntax_extensions; it; it = it->next) {
|
49
|
+
res = cmark_llist_append(mem, res, it->data);
|
50
|
+
}
|
51
|
+
return res;
|
52
|
+
}
|
53
|
+
|
54
|
+
cmark_syntax_extension *cmark_find_syntax_extension(const char *name) {
|
55
|
+
cmark_llist *tmp;
|
56
|
+
|
57
|
+
for (tmp = syntax_extensions; tmp; tmp = tmp->next) {
|
58
|
+
cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp->data;
|
59
|
+
if (!strcmp(ext->name, name))
|
60
|
+
return ext;
|
61
|
+
}
|
62
|
+
return NULL;
|
63
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef CMARK_REGISTRY_H
|
2
|
+
#define CMARK_REGISTRY_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
#include "cmark-gfm.h"
|
9
|
+
#include "plugin.h"
|
10
|
+
|
11
|
+
CMARK_GFM_EXPORT
|
12
|
+
void cmark_register_plugin(cmark_plugin_init_func reg_fn);
|
13
|
+
|
14
|
+
CMARK_GFM_EXPORT
|
15
|
+
void cmark_release_plugins(void);
|
16
|
+
|
17
|
+
CMARK_GFM_EXPORT
|
18
|
+
cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem);
|
19
|
+
|
20
|
+
#ifdef __cplusplus
|
21
|
+
}
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#endif
|
data/ext/markly/render.c
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
#include <stdlib.h>
|
2
|
+
#include "buffer.h"
|
3
|
+
#include "chunk.h"
|
4
|
+
#include "cmark-gfm.h"
|
5
|
+
#include "utf8.h"
|
6
|
+
#include "render.h"
|
7
|
+
#include "node.h"
|
8
|
+
#include "syntax_extension.h"
|
9
|
+
|
10
|
+
static CMARK_INLINE void S_cr(cmark_renderer *renderer) {
|
11
|
+
if (renderer->need_cr < 1) {
|
12
|
+
renderer->need_cr = 1;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
static CMARK_INLINE void S_blankline(cmark_renderer *renderer) {
|
17
|
+
if (renderer->need_cr < 2) {
|
18
|
+
renderer->need_cr = 2;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
static void S_out(cmark_renderer *renderer, cmark_node *node,
|
23
|
+
const char *source, bool wrap,
|
24
|
+
cmark_escaping escape) {
|
25
|
+
int length = (int)strlen(source);
|
26
|
+
unsigned char nextc;
|
27
|
+
int32_t c;
|
28
|
+
int i = 0;
|
29
|
+
int last_nonspace;
|
30
|
+
int len;
|
31
|
+
cmark_chunk remainder = cmark_chunk_literal("");
|
32
|
+
int k = renderer->buffer->size - 1;
|
33
|
+
|
34
|
+
cmark_syntax_extension *ext = NULL;
|
35
|
+
cmark_node *n = node;
|
36
|
+
while (n && !ext) {
|
37
|
+
ext = n->extension;
|
38
|
+
if (!ext)
|
39
|
+
n = n->parent;
|
40
|
+
}
|
41
|
+
if (ext && !ext->commonmark_escape_func)
|
42
|
+
ext = NULL;
|
43
|
+
|
44
|
+
wrap = wrap && !renderer->no_linebreaks;
|
45
|
+
|
46
|
+
if (renderer->in_tight_list_item && renderer->need_cr > 1) {
|
47
|
+
renderer->need_cr = 1;
|
48
|
+
}
|
49
|
+
while (renderer->need_cr) {
|
50
|
+
if (k < 0 || renderer->buffer->ptr[k] == '\n') {
|
51
|
+
k -= 1;
|
52
|
+
} else {
|
53
|
+
cmark_strbuf_putc(renderer->buffer, '\n');
|
54
|
+
if (renderer->need_cr > 1) {
|
55
|
+
cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
|
56
|
+
renderer->prefix->size);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
renderer->column = 0;
|
60
|
+
renderer->last_breakable = 0;
|
61
|
+
renderer->begin_line = true;
|
62
|
+
renderer->begin_content = true;
|
63
|
+
renderer->need_cr -= 1;
|
64
|
+
}
|
65
|
+
|
66
|
+
while (i < length) {
|
67
|
+
if (renderer->begin_line) {
|
68
|
+
cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
|
69
|
+
renderer->prefix->size);
|
70
|
+
// note: this assumes prefix is ascii:
|
71
|
+
renderer->column = renderer->prefix->size;
|
72
|
+
}
|
73
|
+
|
74
|
+
len = cmark_utf8proc_iterate((const uint8_t *)source + i, length - i, &c);
|
75
|
+
if (len == -1) { // error condition
|
76
|
+
return; // return without rendering rest of string
|
77
|
+
}
|
78
|
+
|
79
|
+
if (ext && ext->commonmark_escape_func(ext, node, c))
|
80
|
+
cmark_strbuf_putc(renderer->buffer, '\\');
|
81
|
+
|
82
|
+
nextc = source[i + len];
|
83
|
+
if (c == 32 && wrap) {
|
84
|
+
if (!renderer->begin_line) {
|
85
|
+
last_nonspace = renderer->buffer->size;
|
86
|
+
cmark_strbuf_putc(renderer->buffer, ' ');
|
87
|
+
renderer->column += 1;
|
88
|
+
renderer->begin_line = false;
|
89
|
+
renderer->begin_content = false;
|
90
|
+
// skip following spaces
|
91
|
+
while (source[i + 1] == ' ') {
|
92
|
+
i++;
|
93
|
+
}
|
94
|
+
// We don't allow breaks that make a digit the first character
|
95
|
+
// because this causes problems with commonmark output.
|
96
|
+
if (!cmark_isdigit(source[i + 1])) {
|
97
|
+
renderer->last_breakable = last_nonspace;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
} else if (escape == LITERAL) {
|
102
|
+
if (c == 10) {
|
103
|
+
cmark_strbuf_putc(renderer->buffer, '\n');
|
104
|
+
renderer->column = 0;
|
105
|
+
renderer->begin_line = true;
|
106
|
+
renderer->begin_content = true;
|
107
|
+
renderer->last_breakable = 0;
|
108
|
+
} else {
|
109
|
+
cmark_render_code_point(renderer, c);
|
110
|
+
renderer->begin_line = false;
|
111
|
+
// we don't set 'begin_content' to false til we've
|
112
|
+
// finished parsing a digit. Reason: in commonmark
|
113
|
+
// we need to escape a potential list marker after
|
114
|
+
// a digit:
|
115
|
+
renderer->begin_content =
|
116
|
+
renderer->begin_content && cmark_isdigit((char)c) == 1;
|
117
|
+
}
|
118
|
+
} else {
|
119
|
+
(renderer->outc)(renderer, node, escape, c, nextc);
|
120
|
+
renderer->begin_line = false;
|
121
|
+
renderer->begin_content =
|
122
|
+
renderer->begin_content && cmark_isdigit((char)c) == 1;
|
123
|
+
}
|
124
|
+
|
125
|
+
// If adding the character went beyond width, look for an
|
126
|
+
// earlier place where the line could be broken:
|
127
|
+
if (renderer->width > 0 && renderer->column > renderer->width &&
|
128
|
+
!renderer->begin_line && renderer->last_breakable > 0) {
|
129
|
+
|
130
|
+
// copy from last_breakable to remainder
|
131
|
+
cmark_chunk_set_cstr(renderer->mem, &remainder,
|
132
|
+
(char *)renderer->buffer->ptr +
|
133
|
+
renderer->last_breakable + 1);
|
134
|
+
// truncate at last_breakable
|
135
|
+
cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable);
|
136
|
+
// add newline, prefix, and remainder
|
137
|
+
cmark_strbuf_putc(renderer->buffer, '\n');
|
138
|
+
cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr,
|
139
|
+
renderer->prefix->size);
|
140
|
+
cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len);
|
141
|
+
renderer->column = renderer->prefix->size + remainder.len;
|
142
|
+
cmark_chunk_free(renderer->mem, &remainder);
|
143
|
+
renderer->last_breakable = 0;
|
144
|
+
renderer->begin_line = false;
|
145
|
+
renderer->begin_content = false;
|
146
|
+
}
|
147
|
+
|
148
|
+
i += len;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
// Assumes no newlines, assumes ascii content:
|
153
|
+
void cmark_render_ascii(cmark_renderer *renderer, const char *s) {
|
154
|
+
int origsize = renderer->buffer->size;
|
155
|
+
cmark_strbuf_puts(renderer->buffer, s);
|
156
|
+
renderer->column += renderer->buffer->size - origsize;
|
157
|
+
}
|
158
|
+
|
159
|
+
void cmark_render_code_point(cmark_renderer *renderer, uint32_t c) {
|
160
|
+
cmark_utf8proc_encode_char(c, renderer->buffer);
|
161
|
+
renderer->column += 1;
|
162
|
+
}
|
163
|
+
|
164
|
+
char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width,
|
165
|
+
void (*outc)(cmark_renderer *, cmark_node *,
|
166
|
+
cmark_escaping, int32_t,
|
167
|
+
unsigned char),
|
168
|
+
int (*render_node)(cmark_renderer *renderer,
|
169
|
+
cmark_node *node,
|
170
|
+
cmark_event_type ev_type, int options)) {
|
171
|
+
cmark_strbuf pref = CMARK_BUF_INIT(mem);
|
172
|
+
cmark_strbuf buf = CMARK_BUF_INIT(mem);
|
173
|
+
cmark_node *cur;
|
174
|
+
cmark_event_type ev_type;
|
175
|
+
char *result;
|
176
|
+
cmark_iter *iter = cmark_iter_new(root);
|
177
|
+
|
178
|
+
cmark_renderer renderer = {mem, &buf, &pref, 0, width,
|
179
|
+
0, 0, true, true, false,
|
180
|
+
false, outc, S_cr, S_blankline, S_out,
|
181
|
+
0};
|
182
|
+
|
183
|
+
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
|
184
|
+
cur = cmark_iter_get_node(iter);
|
185
|
+
if (!render_node(&renderer, cur, ev_type, options)) {
|
186
|
+
// a false value causes us to skip processing
|
187
|
+
// the node's contents. this is used for
|
188
|
+
// autolinks.
|
189
|
+
cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT);
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
// ensure final newline
|
194
|
+
if (renderer.buffer->size == 0 || renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') {
|
195
|
+
cmark_strbuf_putc(renderer.buffer, '\n');
|
196
|
+
}
|
197
|
+
|
198
|
+
result = (char *)cmark_strbuf_detach(renderer.buffer);
|
199
|
+
|
200
|
+
cmark_iter_free(iter);
|
201
|
+
cmark_strbuf_free(renderer.prefix);
|
202
|
+
cmark_strbuf_free(renderer.buffer);
|
203
|
+
|
204
|
+
return result;
|
205
|
+
}
|
data/ext/markly/render.h
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#ifndef CMARK_RENDER_H
|
2
|
+
#define CMARK_RENDER_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
#include <stdlib.h>
|
9
|
+
#include "buffer.h"
|
10
|
+
#include "chunk.h"
|
11
|
+
|
12
|
+
typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
|
13
|
+
|
14
|
+
struct cmark_renderer {
|
15
|
+
cmark_mem *mem;
|
16
|
+
cmark_strbuf *buffer;
|
17
|
+
cmark_strbuf *prefix;
|
18
|
+
int column;
|
19
|
+
int width;
|
20
|
+
int need_cr;
|
21
|
+
bufsize_t last_breakable;
|
22
|
+
bool begin_line;
|
23
|
+
bool begin_content;
|
24
|
+
bool no_linebreaks;
|
25
|
+
bool in_tight_list_item;
|
26
|
+
void (*outc)(struct cmark_renderer *, cmark_node *, cmark_escaping, int32_t, unsigned char);
|
27
|
+
void (*cr)(struct cmark_renderer *);
|
28
|
+
void (*blankline)(struct cmark_renderer *);
|
29
|
+
void (*out)(struct cmark_renderer *, cmark_node *, const char *, bool, cmark_escaping);
|
30
|
+
unsigned int footnote_ix;
|
31
|
+
};
|
32
|
+
|
33
|
+
typedef struct cmark_renderer cmark_renderer;
|
34
|
+
|
35
|
+
struct cmark_html_renderer {
|
36
|
+
cmark_strbuf *html;
|
37
|
+
cmark_node *plain;
|
38
|
+
cmark_llist *filter_extensions;
|
39
|
+
unsigned int footnote_ix;
|
40
|
+
unsigned int written_footnote_ix;
|
41
|
+
void *opaque;
|
42
|
+
};
|
43
|
+
|
44
|
+
typedef struct cmark_html_renderer cmark_html_renderer;
|
45
|
+
|
46
|
+
void cmark_render_ascii(cmark_renderer *renderer, const char *s);
|
47
|
+
|
48
|
+
void cmark_render_code_point(cmark_renderer *renderer, uint32_t c);
|
49
|
+
|
50
|
+
char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width,
|
51
|
+
void (*outc)(cmark_renderer *, cmark_node *,
|
52
|
+
cmark_escaping, int32_t,
|
53
|
+
unsigned char),
|
54
|
+
int (*render_node)(cmark_renderer *renderer,
|
55
|
+
cmark_node *node,
|
56
|
+
cmark_event_type ev_type, int options));
|
57
|
+
|
58
|
+
#ifdef __cplusplus
|
59
|
+
}
|
60
|
+
#endif
|
61
|
+
|
62
|
+
#endif
|