aboutsummaryrefslogtreecommitdiff
path: root/src/node.h
blob: 27c815ddfc67e07066549b8ee9d8882ebebd5485 (plain)
  1. #ifndef CMARK_NODE_H
  2. #define CMARK_NODE_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #include "cmark.h"
  7. #include "buffer.h"
  8. typedef enum {
  9. // Block
  10. CMARK_NODE_DOCUMENT,
  11. CMARK_NODE_BQUOTE,
  12. CMARK_NODE_LIST,
  13. CMARK_NODE_LIST_ITEM,
  14. CMARK_NODE_FENCED_CODE,
  15. CMARK_NODE_INDENTED_CODE,
  16. CMARK_NODE_HTML,
  17. CMARK_NODE_PARAGRAPH,
  18. CMARK_NODE_ATX_HEADER,
  19. CMARK_NODE_SETEXT_HEADER,
  20. CMARK_NODE_HRULE,
  21. CMARK_NODE_REFERENCE_DEF,
  22. CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT,
  23. CMARK_NODE_LAST_BLOCK = CMARK_NODE_REFERENCE_DEF,
  24. // Inline
  25. CMARK_NODE_STRING,
  26. CMARK_NODE_SOFTBREAK,
  27. CMARK_NODE_LINEBREAK,
  28. CMARK_NODE_INLINE_CODE,
  29. CMARK_NODE_INLINE_HTML,
  30. CMARK_NODE_EMPH,
  31. CMARK_NODE_STRONG,
  32. CMARK_NODE_LINK,
  33. CMARK_NODE_IMAGE,
  34. CMARK_NODE_FIRST_INLINE = CMARK_NODE_STRING,
  35. CMARK_NODE_LAST_INLINE = CMARK_NODE_IMAGE,
  36. // Other
  37. CMARK_NODE_LINK_LABEL
  38. } cmark_node_type;
  39. typedef struct {
  40. cmark_list_type list_type;
  41. int marker_offset;
  42. int padding;
  43. int start;
  44. cmark_delim_type delimiter;
  45. unsigned char bullet_char;
  46. bool tight;
  47. } cmark_list;
  48. typedef struct {
  49. int fence_length;
  50. int fence_offset;
  51. unsigned char fence_char;
  52. cmark_strbuf info;
  53. } cmark_fenced_code;
  54. typedef struct {
  55. int level;
  56. } cmark_header;
  57. typedef struct {
  58. struct cmark_node *label;
  59. unsigned char *url;
  60. unsigned char *title;
  61. } cmark_link;
  62. struct cmark_node {
  63. cmark_node_type type;
  64. struct cmark_node *next;
  65. struct cmark_node *prev;
  66. struct cmark_node *parent;
  67. struct cmark_node *first_child;
  68. struct cmark_node *last_child;
  69. int start_line;
  70. int start_column;
  71. int end_line;
  72. bool open;
  73. bool last_line_blank;
  74. // Temp
  75. cmark_node_inl *inline_content;
  76. cmark_strbuf string_content;
  77. union {
  78. cmark_list list;
  79. cmark_fenced_code code;
  80. cmark_header header;
  81. cmark_link link;
  82. } as;
  83. };
  84. CMARK_EXPORT cmark_node_type
  85. cmark_node_get_type(cmark_node *node);
  86. // Tree traversal
  87. CMARK_EXPORT cmark_node*
  88. cmark_node_next(cmark_node *node);
  89. CMARK_EXPORT cmark_node*
  90. cmark_node_previous(cmark_node *node);
  91. CMARK_EXPORT cmark_node*
  92. cmark_node_parent(cmark_node *node);
  93. CMARK_EXPORT cmark_node*
  94. cmark_node_first_child(cmark_node *node);
  95. CMARK_EXPORT cmark_node*
  96. cmark_node_last_child(cmark_node *node);
  97. // Tree manipulation
  98. CMARK_EXPORT void
  99. cmark_node_unlink(cmark_node *node);
  100. CMARK_EXPORT int
  101. cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
  102. CMARK_EXPORT int
  103. cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
  104. CMARK_EXPORT int
  105. cmark_node_prepend_child(cmark_node *node, cmark_node *child);
  106. CMARK_EXPORT int
  107. cmark_node_append_child(cmark_node *node, cmark_node *child);
  108. #define NODE_DOCUMENT CMARK_NODE_DOCUMENT
  109. #define NODE_BQUOTE CMARK_NODE_BQUOTE
  110. #define NODE_LIST CMARK_NODE_LIST
  111. #define NODE_LIST_ITEM CMARK_NODE_LIST_ITEM
  112. #define NODE_FENCED_CODE CMARK_NODE_FENCED_CODE
  113. #define NODE_INDENTED_CODE CMARK_NODE_INDENTED_CODE
  114. #define NODE_HTML CMARK_NODE_HTML
  115. #define NODE_PARAGRAPH CMARK_NODE_PARAGRAPH
  116. #define NODE_ATX_HEADER CMARK_NODE_ATX_HEADER
  117. #define NODE_SETEXT_HEADER CMARK_NODE_SETEXT_HEADER
  118. #define NODE_HRULE CMARK_NODE_HRULE
  119. #define NODE_REFERENCE_DEF CMARK_NODE_REFERENCE_DEF
  120. #define NODE_STRING CMARK_NODE_STRING
  121. #define NODE_SOFTBREAK CMARK_NODE_SOFTBREAK
  122. #define NODE_LINEBREAK CMARK_NODE_LINEBREAK
  123. #define NODE_INLINE_CODE CMARK_NODE_INLINE_CODE
  124. #define NODE_INLINE_HTML CMARK_NODE_INLINE_HTML
  125. #define NODE_EMPH CMARK_NODE_EMPH
  126. #define NODE_STRONG CMARK_NODE_STRONG
  127. #define NODE_LINK CMARK_NODE_LINK
  128. #define NODE_IMAGE CMARK_NODE_IMAGE
  129. #define NODE_LINK_LABEL CMARK_NODE_LINK_LABEL
  130. #ifdef __cplusplus
  131. }
  132. #endif
  133. #endif