aboutsummaryrefslogtreecommitdiff
path: root/src/node.h
blob: 64a9fcec37ee5a646fc58dc94679753c8c1ce92f (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. #include "chunk.h"
  9. typedef enum {
  10. // Block
  11. CMARK_NODE_DOCUMENT,
  12. CMARK_NODE_BQUOTE,
  13. CMARK_NODE_LIST,
  14. CMARK_NODE_LIST_ITEM,
  15. CMARK_NODE_FENCED_CODE,
  16. CMARK_NODE_INDENTED_CODE,
  17. CMARK_NODE_HTML,
  18. CMARK_NODE_PARAGRAPH,
  19. CMARK_NODE_ATX_HEADER,
  20. CMARK_NODE_SETEXT_HEADER,
  21. CMARK_NODE_HRULE,
  22. CMARK_NODE_REFERENCE_DEF,
  23. CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT,
  24. CMARK_NODE_LAST_BLOCK = CMARK_NODE_REFERENCE_DEF,
  25. // Inline
  26. CMARK_NODE_STRING,
  27. CMARK_NODE_SOFTBREAK,
  28. CMARK_NODE_LINEBREAK,
  29. CMARK_NODE_INLINE_CODE,
  30. CMARK_NODE_INLINE_HTML,
  31. CMARK_NODE_EMPH,
  32. CMARK_NODE_STRONG,
  33. CMARK_NODE_LINK,
  34. CMARK_NODE_IMAGE,
  35. CMARK_NODE_FIRST_INLINE = CMARK_NODE_STRING,
  36. CMARK_NODE_LAST_INLINE = CMARK_NODE_IMAGE,
  37. // Other
  38. CMARK_NODE_LINK_LABEL
  39. } cmark_node_type;
  40. typedef struct {
  41. cmark_list_type list_type;
  42. int marker_offset;
  43. int padding;
  44. int start;
  45. cmark_delim_type delimiter;
  46. unsigned char bullet_char;
  47. bool tight;
  48. } cmark_list;
  49. typedef struct {
  50. int fence_length;
  51. int fence_offset;
  52. unsigned char fence_char;
  53. cmark_strbuf info;
  54. } cmark_fenced_code;
  55. typedef struct {
  56. int level;
  57. } cmark_header;
  58. typedef struct {
  59. struct cmark_node *label;
  60. unsigned char *url;
  61. unsigned char *title;
  62. } cmark_link;
  63. struct cmark_node {
  64. cmark_node_type type;
  65. struct cmark_node *next;
  66. struct cmark_node *prev;
  67. struct cmark_node *parent;
  68. struct cmark_node *first_child;
  69. struct cmark_node *last_child;
  70. int start_line;
  71. int start_column;
  72. int end_line;
  73. bool open;
  74. bool last_line_blank;
  75. cmark_strbuf string_content;
  76. union {
  77. cmark_chunk literal;
  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