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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
#ifndef _CMARK_H_
#define _CMARK_H_
#include <stdbool.h>
#include <stdio.h>
#include "buffer.h"
#include "chunk.h"
#include "references.h"
#include "cmark_export.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CMARK_VERSION "0.1"
#define CMARK_CODE_INDENT 4
#define CMARK_MAX_LINK_LABEL_LENGTH 1000
struct cmark_node_inl {
enum {
CMARK_INL_STRING,
CMARK_INL_SOFTBREAK,
CMARK_INL_LINEBREAK,
CMARK_INL_CODE,
CMARK_INL_RAW_HTML,
CMARK_INL_EMPH,
CMARK_INL_STRONG,
CMARK_INL_LINK,
CMARK_INL_IMAGE
} tag;
union {
cmark_chunk literal;
struct cmark_node_inl *inlines;
struct {
struct cmark_node_inl *label;
unsigned char *url;
unsigned char *title;
} linkable;
} content;
struct cmark_node_inl *next;
};
typedef struct cmark_node_inl cmark_node_inl;
// Types for blocks
struct cmark_ListData {
enum {
bullet,
ordered
} list_type;
int marker_offset;
int padding;
int start;
enum {
period,
parens
} delimiter;
unsigned char bullet_char;
bool tight;
};
struct cmark_FencedCodeData {
int fence_length;
int fence_offset;
unsigned char fence_char;
cmark_strbuf info;
};
struct cmark_node_block {
enum {
CMARK_BLOCK_DOCUMENT,
CMARK_BLOCK_BQUOTE,
CMARK_BLOCK_LIST,
CMARK_BLOCK_LIST_ITEM,
CMARK_BLOCK_FENCED_CODE,
CMARK_BLOCK_INDENTED_CODE,
CMARK_BLOCK_HTML,
CMARK_BLOCK_PARAGRAPH,
CMARK_BLOCK_ATX_HEADER,
CMARK_BLOCK_SETEXT_HEADER,
CMARK_BLOCK_HRULE,
CMARK_BLOCK_REFERENCE_DEF
} tag;
int start_line;
int start_column;
int end_line;
bool open;
bool last_line_blank;
struct cmark_node_block* children;
struct cmark_node_block* last_child;
struct cmark_node_block* parent;
struct cmark_node_block* top;
cmark_strbuf string_content;
cmark_node_inl* inline_content;
union {
struct cmark_ListData list;
struct cmark_FencedCodeData code;
struct {
int level;
} header;
struct {
cmark_reference_map *refmap;
} document;
} as;
struct cmark_node_block *next;
struct cmark_node_block *prev;
};
typedef struct cmark_node_block cmark_node_block;
struct cmark_doc_parser {
cmark_node_block* head;
cmark_node_block* current;
int line_number;
cmark_strbuf *curline;
};
typedef struct cmark_doc_parser cmark_doc_parser;
CMARK_EXPORT
void cmark_free_blocks(cmark_node_block *e);
CMARK_EXPORT
void cmark_free_inlines(cmark_node_inl* e);
CMARK_EXPORT
cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
CMARK_EXPORT
cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
CMARK_EXPORT
cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
CMARK_EXPORT
cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
CMARK_EXPORT
cmark_node_inl* cmark_make_simple(int t);
// Macros for creating various kinds of simple.
#define cmark_make_str(s) cmark_make_literal(INL_STRING, s)
#define cmark_make_code(s) cmark_make_literal(INL_CODE, s)
#define cmark_make_raw_html(s) cmark_make_literal(INL_RAW_HTML, s)
#define cmark_make_linebreak() cmark_make_simple(INL_LINEBREAK)
#define cmark_make_softbreak() cmark_make_simple(INL_SOFTBREAK)
#define cmark_make_emph(contents) cmark_make_inlines(INL_EMPH, contents)
#define cmark_make_strong(contents) cmark_make_inlines(INL_STRONG, contents)
CMARK_EXPORT
cmark_doc_parser *cmark_new_doc_parser();
CMARK_EXPORT
void cmark_free_doc_parser(cmark_doc_parser *parser);
CMARK_EXPORT
cmark_node_block *cmark_finish(cmark_doc_parser *parser);
CMARK_EXPORT
void cmark_process_line(cmark_doc_parser *parser, const unsigned char *buffer, size_t bytes);
CMARK_EXPORT
cmark_node_block *cmark_finish(cmark_doc_parser *parser);
CMARK_EXPORT
cmark_node_block *cmark_parse_document(const unsigned char *buffer, size_t len);
CMARK_EXPORT
cmark_node_block *cmark_parse_file(FILE *f);
CMARK_EXPORT
void cmark_debug_print(cmark_node_block *root);
CMARK_EXPORT
void cmark_render_html(cmark_strbuf *html, cmark_node_block *root);
CMARK_EXPORT
unsigned char *cmark_markdown_to_html(unsigned char *text, int len);
#ifndef CMARK_NO_SHORT_NAMES
#define VERSION CMARK_VERSION
#define CODE_INDENT CMARK_CODE_INDENT
#define MAX_LINK_LABEL_LENGTH CMARK_MAX_LINK_LABEL_LENGTH
#define node_inl cmark_node_inl
#define INL_STRING CMARK_INL_STRING
#define INL_SOFTBREAK CMARK_INL_SOFTBREAK
#define INL_LINEBREAK CMARK_INL_LINEBREAK
#define INL_CODE CMARK_INL_CODE
#define INL_RAW_HTML CMARK_INL_RAW_HTML
#define INL_EMPH CMARK_INL_EMPH
#define INL_STRONG CMARK_INL_STRONG
#define INL_LINK CMARK_INL_LINK
#define INL_IMAGE CMARK_INL_IMAGE
#define ListData cmark_ListData
#define FencedCodeData cmark_FencedCodeData
#define node_block cmark_node_block
#define BLOCK_DOCUMENT CMARK_BLOCK_DOCUMENT
#define BLOCK_BQUOTE CMARK_BLOCK_BQUOTE
#define BLOCK_LIST CMARK_BLOCK_LIST
#define BLOCK_LIST_ITEM CMARK_BLOCK_LIST_ITEM
#define BLOCK_FENCED_CODE CMARK_BLOCK_FENCED_CODE
#define BLOCK_INDENTED_CODE CMARK_BLOCK_INDENTED_CODE
#define BLOCK_HTML CMARK_BLOCK_HTML
#define BLOCK_PARAGRAPH CMARK_BLOCK_PARAGRAPH
#define BLOCK_ATX_HEADER CMARK_BLOCK_ATX_HEADER
#define BLOCK_SETEXT_HEADER CMARK_BLOCK_SETEXT_HEADER
#define BLOCK_HRULE CMARK_BLOCK_HRULE
#define BLOCK_REFERENCE_DEF CMARK_BLOCK_REFERENCE_DEF
#define free_simple cmark_free_simple
#define free_blocks cmark_free_blocks
#define make_link cmark_make_link
#define make_autolink cmark_make_autolink
#define make_str cmark_make_str
#define make_code cmark_make_code
#define make_raw_html cmark_make_raw_html
#define make_linebreak cmark_make_linebreak
#define make_softbreak cmark_make_softbreak
#define make_emph cmark_make_emph
#define make_strong cmark_make_strong
#define make_simple cmark_make_simple
#define make_literal cmark_make_literal
#define make_inlines cmark_make_inlines
#define doc_parser cmark_doc_parser
#define new_doc_parser cmark_new_doc_parser
#define free_doc_parser cmark_free_doc_parser
#define process_line cmark_process_line
#define finish cmark_finish
#endif
#ifdef __cplusplus
}
#endif
#endif
|