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