1 #ifndef CMARK_H
2 #define CMARK_H
3 
4 #include <stdio.h>
5 #include "cmark_export.h"
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 /** .SH NAME
12  *
13  * .B cmark
14  * \- CommonMark parsing, manipulating, and rendering
15  */
16 
17 /** .SH SIMPLE INTERFACE
18  */
19 
20 /** Current version of library.
21  */
22 #define CMARK_VERSION "0.1"
23 
24 /** Convert 'text' (assumed to be a UTF-8 encoded string with length
25  * 'len' from CommonMark Markdown to HTML, returning a null-terminated,
26  * UTF-8-encoded string.
27  */
28 CMARK_EXPORT
29 char *cmark_markdown_to_html(const char *text, int len);
30 
31 /** .SH NODE STRUCTURE
32  */
33 
34 /**
35  */
36 typedef enum {
37 	/* Block */
38 	CMARK_NODE_DOCUMENT,
39 	CMARK_NODE_BLOCK_QUOTE,
40 	CMARK_NODE_LIST,
41 	CMARK_NODE_LIST_ITEM,
42 	CMARK_NODE_CODE_BLOCK,
43 	CMARK_NODE_HTML,
44 	CMARK_NODE_PARAGRAPH,
45 	CMARK_NODE_HEADER,
46 	CMARK_NODE_HRULE,
47 	CMARK_NODE_REFERENCE_DEF,
48 
49 	CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT,
50 	CMARK_NODE_LAST_BLOCK  = CMARK_NODE_REFERENCE_DEF,
51 
52 	/* Inline */
53 	CMARK_NODE_TEXT,
54 	CMARK_NODE_SOFTBREAK,
55 	CMARK_NODE_LINEBREAK,
56 	CMARK_NODE_INLINE_CODE,
57 	CMARK_NODE_INLINE_HTML,
58 	CMARK_NODE_EMPH,
59 	CMARK_NODE_STRONG,
60 	CMARK_NODE_LINK,
61 	CMARK_NODE_IMAGE,
62 
63 	CMARK_NODE_FIRST_INLINE = CMARK_NODE_TEXT,
64 	CMARK_NODE_LAST_INLINE  = CMARK_NODE_IMAGE,
65 } cmark_node_type;
66 
67 
68 /**
69  */
70 typedef enum {
71 	CMARK_NO_LIST,
72 	CMARK_BULLET_LIST,
73 	CMARK_ORDERED_LIST
74 }  cmark_list_type;
75 
76 /**
77  */
78 typedef enum {
79 	CMARK_PERIOD_DELIM,
80 	CMARK_PAREN_DELIM
81 } cmark_delim_type;
82 
83 typedef struct cmark_node cmark_node;
84 typedef struct cmark_parser cmark_parser;
85 
86 /**
87  * .SH CREATING AND DESTROYING NODES
88  */
89 
90 /**
91  */
92 CMARK_EXPORT cmark_node*
93 cmark_node_new(cmark_node_type type);
94 
95 /**
96  */
97 CMARK_EXPORT void
98 cmark_node_free(cmark_node *node);
99 
100 /**
101  * .SH TREE TRAVERSAL
102  */
103 CMARK_EXPORT cmark_node*
104 cmark_node_next(cmark_node *node);
105 
106 /**
107  */
108 CMARK_EXPORT cmark_node*
109 cmark_node_previous(cmark_node *node);
110 
111 /**
112  */
113 CMARK_EXPORT cmark_node*
114 cmark_node_parent(cmark_node *node);
115 
116 /**
117  */
118 CMARK_EXPORT cmark_node*
119 cmark_node_first_child(cmark_node *node);
120 
121 /**
122  */
123 CMARK_EXPORT cmark_node*
124 cmark_node_last_child(cmark_node *node);
125 
126 /**
127  * .SH ACCESSORS
128  */
129 
130 /**
131  */
132 CMARK_EXPORT cmark_node_type
133 cmark_node_get_type(cmark_node *node);
134 
135 /**
136  */
137 CMARK_EXPORT const char*
138 cmark_node_get_string_content(cmark_node *node);
139 
140 /**
141  */
142 CMARK_EXPORT int
143 cmark_node_set_string_content(cmark_node *node, const char *content);
144 
145 /**
146  */
147 CMARK_EXPORT int
148 cmark_node_get_header_level(cmark_node *node);
149 
150 /**
151  */
152 CMARK_EXPORT int
153 cmark_node_set_header_level(cmark_node *node, int level);
154 
155 /**
156  */
157 CMARK_EXPORT cmark_list_type
158 cmark_node_get_list_type(cmark_node *node);
159 
160 /**
161  */
162 CMARK_EXPORT int
163 cmark_node_set_list_type(cmark_node *node, cmark_list_type type);
164 
165 /**
166  */
167 CMARK_EXPORT int
168 cmark_node_get_list_start(cmark_node *node);
169 
170 /**
171  */
172 CMARK_EXPORT int
173 cmark_node_set_list_start(cmark_node *node, int start);
174 
175 /**
176  */
177 CMARK_EXPORT int
178 cmark_node_get_list_tight(cmark_node *node);
179 
180 /**
181  */
182 CMARK_EXPORT int
183 cmark_node_set_list_tight(cmark_node *node, int tight);
184 
185 /**
186  */
187 CMARK_EXPORT const char*
188 cmark_node_get_fence_info(cmark_node *node);
189 
190 /**
191  */
192 CMARK_EXPORT int
193 cmark_node_set_fence_info(cmark_node *node, const char *info);
194 
195 /**
196  */
197 CMARK_EXPORT const char*
198 cmark_node_get_url(cmark_node *node);
199 
200 /**
201  */
202 CMARK_EXPORT int
203 cmark_node_set_url(cmark_node *node, const char *url);
204 
205 /**
206  */
207 CMARK_EXPORT const char*
208 cmark_node_get_title(cmark_node *node);
209 
210 /**
211  */
212 CMARK_EXPORT int
213 cmark_node_set_title(cmark_node *node, const char *title);
214 
215 /**
216  */
217 CMARK_EXPORT int
218 cmark_node_get_start_line(cmark_node *node);
219 
220 /**
221  */
222 CMARK_EXPORT int
223 cmark_node_get_start_column(cmark_node *node);
224 
225 /**
226  */
227 CMARK_EXPORT int
228 cmark_node_get_end_line(cmark_node *node);
229 
230 /**
231  * .SH TREE MANIPULATION
232  */
233 
234 /**
235  */
236 CMARK_EXPORT void
237 cmark_node_unlink(cmark_node *node);
238 
239 /**
240  */
241 CMARK_EXPORT int
242 cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
243 
244 /**
245  */
246 CMARK_EXPORT int
247 cmark_node_insert_after(cmark_node *node, cmark_node *sibling);
248 
249 /**
250  */
251 CMARK_EXPORT int
252 cmark_node_prepend_child(cmark_node *node, cmark_node *child);
253 
254 /**
255  */
256 CMARK_EXPORT int
257 cmark_node_append_child(cmark_node *node, cmark_node *child);
258 
259 /**
260  * .SH PARSING
261  */
262 
263 /**
264  */
265 CMARK_EXPORT
266 cmark_parser *cmark_parser_new();
267 
268 /**
269  */
270 CMARK_EXPORT
271 void cmark_parser_free(cmark_parser *parser);
272 
273 /**
274  */
275 CMARK_EXPORT
276 cmark_node *cmark_parser_finish(cmark_parser *parser);
277 
278 /**
279  */
280 CMARK_EXPORT
281 void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len);
282 
283 /**
284  */
285 CMARK_EXPORT
286 cmark_node *cmark_parse_document(const char *buffer, size_t len);
287 
288 /**
289  */
290 CMARK_EXPORT
291 cmark_node *cmark_parse_file(FILE *f);
292 
293 /**
294  * .SH RENDERING
295  */
296 
297 /**
298  */
299 CMARK_EXPORT
300 char *cmark_render_ast(cmark_node *root);
301 
302 /**
303  */
304 CMARK_EXPORT
305 char *cmark_render_html(cmark_node *root);
306 
307 /** .SH AUTHORS
308  *
309  * John MacFarlane, Vicent Marti,  Kārlis Gaņģis, Nick Wellnhofer.
310  */
311 
312 #ifndef CMARK_NO_SHORT_NAMES
313   #define NODE_DOCUMENT             CMARK_NODE_DOCUMENT
314   #define NODE_BLOCK_QUOTE          CMARK_NODE_BLOCK_QUOTE
315   #define NODE_LIST                 CMARK_NODE_LIST
316   #define NODE_LIST_ITEM            CMARK_NODE_LIST_ITEM
317   #define NODE_CODE_BLOCK           CMARK_NODE_CODE_BLOCK
318   #define NODE_HTML                 CMARK_NODE_HTML
319   #define NODE_PARAGRAPH            CMARK_NODE_PARAGRAPH
320   #define NODE_HEADER		    CMARK_NODE_HEADER
321   #define NODE_HRULE                CMARK_NODE_HRULE
322   #define NODE_REFERENCE_DEF        CMARK_NODE_REFERENCE_DEF
323   #define NODE_TEXT                 CMARK_NODE_TEXT
324   #define NODE_SOFTBREAK            CMARK_NODE_SOFTBREAK
325   #define NODE_LINEBREAK            CMARK_NODE_LINEBREAK
326   #define NODE_INLINE_CODE          CMARK_NODE_INLINE_CODE
327   #define NODE_INLINE_HTML          CMARK_NODE_INLINE_HTML
328   #define NODE_EMPH                 CMARK_NODE_EMPH
329   #define NODE_STRONG               CMARK_NODE_STRONG
330   #define NODE_LINK                 CMARK_NODE_LINK
331   #define NODE_IMAGE                CMARK_NODE_IMAGE
332   #define NODE_LINK_LABEL           CMARK_NODE_LINK_LABEL
333   #define BULLET_LIST               CMARK_BULLET_LIST
334   #define ORDERED_LIST              CMARK_ORDERED_LIST
335   #define PERIOD_DELIM              CMARK_PERIOD_DELIM
336   #define PAREN_DELIM               CMARK_PAREN_DELIM
337 #endif
338 
339 #ifdef __cplusplus
340 }
341 #endif
342 
343 #endif
344