aboutsummaryrefslogtreecommitdiff
path: root/src/print.c
blob: 643c262d15d3f080b30516eb87a15b20bed3009a (plain)
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "cmark.h"
  5. #include "node.h"
  6. #define INDENT 2
  7. static void print_str(const unsigned char *s, int len)
  8. {
  9. int i;
  10. if (len < 0)
  11. len = strlen((char *)s);
  12. putchar('"');
  13. for (i = 0; i < len; ++i) {
  14. unsigned char c = s[i];
  15. switch (c) {
  16. case '\n':
  17. printf("\\n");
  18. break;
  19. case '"':
  20. printf("\\\"");
  21. break;
  22. case '\\':
  23. printf("\\\\");
  24. break;
  25. default:
  26. putchar((int)c);
  27. }
  28. }
  29. putchar('"');
  30. }
  31. // Prettyprint an inline list, for debugging.
  32. static void print_nodes(cmark_node* node, int indent)
  33. {
  34. int i;
  35. cmark_list *data;
  36. while(node != NULL) {
  37. for (i=0; i < indent; i++) {
  38. putchar(' ');
  39. }
  40. switch(node->type) {
  41. case NODE_DOCUMENT:
  42. print_nodes(node->first_child, 0);
  43. break;
  44. case NODE_BLOCK_QUOTE:
  45. printf("block_quote\n");
  46. print_nodes(node->first_child, indent + INDENT);
  47. break;
  48. case NODE_LIST_ITEM:
  49. printf("list_item\n");
  50. print_nodes(node->first_child, indent + INDENT);
  51. break;
  52. case NODE_LIST:
  53. data = &(node->as.list);
  54. if (data->list_type == CMARK_ORDERED_LIST) {
  55. printf("list (type=ordered tight=%s start=%d delim=%s)\n",
  56. (data->tight ? "true" : "false"),
  57. data->start,
  58. (data->delimiter == CMARK_PAREN_DELIM ? "parens" : "period"));
  59. } else {
  60. printf("list (type=bullet tight=%s bullet_char=%c)\n",
  61. (data->tight ? "true" : "false"),
  62. data->bullet_char);
  63. }
  64. print_nodes(node->first_child, indent + INDENT);
  65. break;
  66. case NODE_HEADER:
  67. printf("setext_header (level=%d)\n", node->as.header.level);
  68. print_nodes(node->first_child, indent + INDENT);
  69. break;
  70. case NODE_PARAGRAPH:
  71. printf("paragraph\n");
  72. print_nodes(node->first_child, indent + INDENT);
  73. break;
  74. case NODE_HRULE:
  75. printf("hrule\n");
  76. break;
  77. case NODE_CODE_BLOCK:
  78. printf("code block info=");
  79. print_str(node->as.code.info.ptr, -1);
  80. putchar(' ');
  81. print_str(node->string_content.ptr, -1);
  82. putchar('\n');
  83. break;
  84. case NODE_HTML:
  85. printf("html_block ");
  86. print_str(node->string_content.ptr, -1);
  87. putchar('\n');
  88. break;
  89. case NODE_REFERENCE_DEF:
  90. printf("reference_def\n");
  91. break;
  92. case NODE_TEXT:
  93. printf("text ");
  94. print_str(node->as.literal.data, node->as.literal.len);
  95. putchar('\n');
  96. break;
  97. case NODE_LINEBREAK:
  98. printf("linebreak\n");
  99. break;
  100. case NODE_SOFTBREAK:
  101. printf("softbreak\n");
  102. break;
  103. case NODE_INLINE_CODE:
  104. printf("code ");
  105. print_str(node->as.literal.data, node->as.literal.len);
  106. putchar('\n');
  107. break;
  108. case NODE_INLINE_HTML:
  109. printf("html ");
  110. print_str(node->as.literal.data, node->as.literal.len);
  111. putchar('\n');
  112. break;
  113. case NODE_LINK:
  114. case NODE_IMAGE:
  115. printf("%s url=", node->type == NODE_LINK ? "link" : "image");
  116. if (node->as.link.url)
  117. print_str(node->as.link.url, -1);
  118. if (node->as.link.title) {
  119. printf(" title=");
  120. print_str(node->as.link.title, -1);
  121. }
  122. putchar('\n');
  123. print_nodes(node->first_child, indent + INDENT);
  124. break;
  125. case NODE_STRONG:
  126. printf("strong\n");
  127. print_nodes(node->first_child, indent + INDENT);
  128. break;
  129. case NODE_EMPH:
  130. printf("emph\n");
  131. print_nodes(node->first_child, indent + INDENT);
  132. break;
  133. default:
  134. break;
  135. }
  136. node = node->next;
  137. }
  138. }
  139. void cmark_debug_print(cmark_node *root)
  140. {
  141. print_nodes(root, 0);
  142. }