aboutsummaryrefslogtreecommitdiff
path: root/src/cmark.h
blob: ef9bdfbe1f18ff2bcade3bce1b48876e8e6654a7 (plain)
  1. #ifndef _CMARK_H_
  2. #define _CMARK_H_
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include "buffer.h"
  6. #include "chunk.h"
  7. #include "references.h"
  8. #include "cmark_export.h"
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. #define CMARK_VERSION "0.1"
  13. #define CMARK_CODE_INDENT 4
  14. #define CMARK_MAX_LINK_LABEL_LENGTH 1000
  15. struct cmark_node_inl {
  16. enum {
  17. CMARK_INL_STRING,
  18. CMARK_INL_SOFTBREAK,
  19. CMARK_INL_LINEBREAK,
  20. CMARK_INL_CODE,
  21. CMARK_INL_RAW_HTML,
  22. CMARK_INL_EMPH,
  23. CMARK_INL_STRONG,
  24. CMARK_INL_LINK,
  25. CMARK_INL_IMAGE
  26. } tag;
  27. union {
  28. cmark_chunk literal;
  29. struct cmark_node_inl *inlines;
  30. struct {
  31. struct cmark_node_inl *label;
  32. unsigned char *url;
  33. unsigned char *title;
  34. } linkable;
  35. } content;
  36. struct cmark_node_inl *next;
  37. };
  38. typedef struct cmark_node_inl cmark_node_inl;
  39. // Types for blocks
  40. struct cmark_ListData {
  41. enum {
  42. bullet,
  43. ordered
  44. } list_type;
  45. int marker_offset;
  46. int padding;
  47. int start;
  48. enum {
  49. period,
  50. parens
  51. } delimiter;
  52. unsigned char bullet_char;
  53. bool tight;
  54. };
  55. struct cmark_FencedCodeData {
  56. int fence_length;
  57. int fence_offset;
  58. unsigned char fence_char;
  59. cmark_strbuf info;
  60. };
  61. struct cmark_node_block {
  62. enum {
  63. CMARK_BLOCK_DOCUMENT,
  64. CMARK_BLOCK_BQUOTE,
  65. CMARK_BLOCK_LIST,
  66. CMARK_BLOCK_LIST_ITEM,
  67. CMARK_BLOCK_FENCED_CODE,
  68. CMARK_BLOCK_INDENTED_CODE,
  69. CMARK_BLOCK_HTML,
  70. CMARK_BLOCK_PARAGRAPH,
  71. CMARK_BLOCK_ATX_HEADER,
  72. CMARK_BLOCK_SETEXT_HEADER,
  73. CMARK_BLOCK_HRULE,
  74. CMARK_BLOCK_REFERENCE_DEF
  75. } tag;
  76. int start_line;
  77. int start_column;
  78. int end_line;
  79. bool open;
  80. bool last_line_blank;
  81. struct cmark_node_block* children;
  82. struct cmark_node_block* last_child;
  83. struct cmark_node_block* parent;
  84. struct cmark_node_block* top;
  85. cmark_strbuf string_content;
  86. cmark_node_inl* inline_content;
  87. union {
  88. struct cmark_ListData list;
  89. struct cmark_FencedCodeData code;
  90. struct {
  91. int level;
  92. } header;
  93. struct {
  94. cmark_reference_map *refmap;
  95. } document;
  96. } as;
  97. struct cmark_node_block *next;
  98. struct cmark_node_block *prev;
  99. };
  100. typedef struct cmark_node_block cmark_node_block;
  101. struct cmark_doc_parser {
  102. cmark_node_block* head;
  103. cmark_node_block* current;
  104. int line_number;
  105. cmark_strbuf *curline;
  106. };
  107. typedef struct cmark_doc_parser cmark_doc_parser;
  108. CMARK_EXPORT
  109. void cmark_free_blocks(cmark_node_block *e);
  110. CMARK_EXPORT
  111. void cmark_free_inlines(cmark_node_inl* e);
  112. CMARK_EXPORT
  113. cmark_node_inl* cmark_append_inlines(cmark_node_inl* a, cmark_node_inl* b);
  114. CMARK_EXPORT
  115. cmark_node_block* cmark_append_blocks(cmark_node_block* a, cmark_node_block* b);
  116. CMARK_EXPORT
  117. cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
  118. CMARK_EXPORT
  119. cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
  120. CMARK_EXPORT
  121. cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
  122. CMARK_EXPORT
  123. cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
  124. CMARK_EXPORT
  125. cmark_node_inl* cmark_make_simple(int t);
  126. // Macros for creating various kinds of simple.
  127. #define cmark_make_str(s) cmark_make_literal(INL_STRING, s)
  128. #define cmark_make_code(s) cmark_make_literal(INL_CODE, s)
  129. #define cmark_make_raw_html(s) cmark_make_literal(INL_RAW_HTML, s)
  130. #define cmark_make_linebreak() cmark_make_simple(INL_LINEBREAK)
  131. #define cmark_make_softbreak() cmark_make_simple(INL_SOFTBREAK)
  132. #define cmark_make_emph(contents) cmark_make_inlines(INL_EMPH, contents)
  133. #define cmark_make_strong(contents) cmark_make_inlines(INL_STRONG, contents)
  134. CMARK_EXPORT
  135. cmark_doc_parser *cmark_new_doc_parser();
  136. CMARK_EXPORT
  137. void cmark_free_doc_parser(cmark_doc_parser *parser);
  138. CMARK_EXPORT
  139. cmark_node_block *cmark_finish(cmark_doc_parser *parser);
  140. CMARK_EXPORT
  141. void cmark_process_line(cmark_doc_parser *parser, const unsigned char *buffer, size_t bytes);
  142. CMARK_EXPORT
  143. cmark_node_block *cmark_finish(cmark_doc_parser *parser);
  144. CMARK_EXPORT
  145. cmark_node_block *cmark_parse_document(const unsigned char *buffer, size_t len);
  146. CMARK_EXPORT
  147. cmark_node_block *cmark_parse_file(FILE *f);
  148. CMARK_EXPORT
  149. void cmark_debug_print(cmark_node_block *root);
  150. CMARK_EXPORT
  151. void cmark_render_html(cmark_strbuf *html, cmark_node_block *root);
  152. CMARK_EXPORT
  153. unsigned char *cmark_markdown_to_html(unsigned char *text, int len);
  154. #ifndef CMARK_NO_SHORT_NAMES
  155. #define VERSION CMARK_VERSION
  156. #define CODE_INDENT CMARK_CODE_INDENT
  157. #define MAX_LINK_LABEL_LENGTH CMARK_MAX_LINK_LABEL_LENGTH
  158. #define node_inl cmark_node_inl
  159. #define INL_STRING CMARK_INL_STRING
  160. #define INL_SOFTBREAK CMARK_INL_SOFTBREAK
  161. #define INL_LINEBREAK CMARK_INL_LINEBREAK
  162. #define INL_CODE CMARK_INL_CODE
  163. #define INL_RAW_HTML CMARK_INL_RAW_HTML
  164. #define INL_EMPH CMARK_INL_EMPH
  165. #define INL_STRONG CMARK_INL_STRONG
  166. #define INL_LINK CMARK_INL_LINK
  167. #define INL_IMAGE CMARK_INL_IMAGE
  168. #define ListData cmark_ListData
  169. #define FencedCodeData cmark_FencedCodeData
  170. #define node_block cmark_node_block
  171. #define BLOCK_DOCUMENT CMARK_BLOCK_DOCUMENT
  172. #define BLOCK_BQUOTE CMARK_BLOCK_BQUOTE
  173. #define BLOCK_LIST CMARK_BLOCK_LIST
  174. #define BLOCK_LIST_ITEM CMARK_BLOCK_LIST_ITEM
  175. #define BLOCK_FENCED_CODE CMARK_BLOCK_FENCED_CODE
  176. #define BLOCK_INDENTED_CODE CMARK_BLOCK_INDENTED_CODE
  177. #define BLOCK_HTML CMARK_BLOCK_HTML
  178. #define BLOCK_PARAGRAPH CMARK_BLOCK_PARAGRAPH
  179. #define BLOCK_ATX_HEADER CMARK_BLOCK_ATX_HEADER
  180. #define BLOCK_SETEXT_HEADER CMARK_BLOCK_SETEXT_HEADER
  181. #define BLOCK_HRULE CMARK_BLOCK_HRULE
  182. #define BLOCK_REFERENCE_DEF CMARK_BLOCK_REFERENCE_DEF
  183. #define free_simple cmark_free_simple
  184. #define free_blocks cmark_free_blocks
  185. #define append_simple cmark_append_simple
  186. #define make_link cmark_make_link
  187. #define make_autolink cmark_make_autolink
  188. #define make_str cmark_make_str
  189. #define make_code cmark_make_code
  190. #define make_raw_html cmark_make_raw_html
  191. #define make_linebreak cmark_make_linebreak
  192. #define make_softbreak cmark_make_softbreak
  193. #define make_emph cmark_make_emph
  194. #define make_strong cmark_make_strong
  195. #define make_simple cmark_make_simple
  196. #define make_simple cmark_make_simple
  197. #define make_simple cmark_make_simple
  198. #define doc_parser cmark_doc_parser
  199. #define new_doc_parser cmark_new_doc_parser
  200. #define free_doc_parser cmark_free_doc_parser
  201. #define process_line cmark_process_line
  202. #define finish cmark_finish
  203. #endif
  204. #ifdef __cplusplus
  205. }
  206. #endif
  207. #endif