aboutsummaryrefslogtreecommitdiff
path: root/src/node.h
blob: 237c4ae1f0b03c50ba12ec14b43b0b5faeed99db (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. cmark_strbuf string_content;
  75. union {
  76. cmark_list list;
  77. cmark_fenced_code code;
  78. cmark_header header;
  79. cmark_link link;
  80. } as;
  81. };
  82. typedef struct cmark_node cmark_node;
  83. CMARK_EXPORT cmark_node_type
  84. cmark_node_get_type(cmark_node *node);
  85. // Tree traversal
  86. CMARK_EXPORT cmark_node*
  87. cmark_node_next(cmark_node *node);
  88. CMARK_EXPORT cmark_node*
  89. cmark_node_previous(cmark_node *node);
  90. CMARK_EXPORT cmark_node*
  91. cmark_node_parent(cmark_node *node);
  92. CMARK_EXPORT cmark_node*
  93. cmark_node_first_child(cmark_node *node);
  94. CMARK_EXPORT cmark_node*
  95. cmark_node_last_child(cmark_node *node);
  96. // Tree manipulation
  97. CMARK_EXPORT void
  98. cmark_node_unlink(cmark_node *node);
  99. CMARK_EXPORT int
  100. cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
  101. CMARK_EXPORT int
  102. cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
  103. CMARK_EXPORT int
  104. cmark_node_prepend_child(cmark_node *node, cmark_node *child);
  105. CMARK_EXPORT int
  106. cmark_node_append_child(cmark_node *node, cmark_node *child);
  107. #ifdef __cplusplus
  108. }
  109. #endif
  110. #endif