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