aboutsummaryrefslogtreecommitdiff
path: root/src/cmark.c
blob: f779e803a9e404939bdd2cfa329ed21c4e7e956e (plain)
  1. #include <stdlib.h>
  2. #include <assert.h>
  3. #include <stdio.h>
  4. #include "node.h"
  5. #include "references.h"
  6. #include "html/houdini.h"
  7. #include "cmark.h"
  8. #include "buffer.h"
  9. #include "ast.h"
  10. unsigned char *cmark_markdown_to_html(unsigned char *text, int len)
  11. {
  12. cmark_node *blocks;
  13. unsigned char *result;
  14. blocks = cmark_parse_document(text, len);
  15. result = cmark_render_html(blocks);
  16. cmark_free_nodes(blocks);
  17. return result;
  18. }
  19. // Utility function used by cmark_free_nodes
  20. static void splice_into_list(cmark_node* e, cmark_node* children) {
  21. cmark_node * tmp;
  22. if (children) {
  23. tmp = children;
  24. // Find last child
  25. while (tmp->next) {
  26. tmp = tmp->next;
  27. }
  28. // Splice children into list
  29. tmp->next = e->next;
  30. e->next = children;
  31. }
  32. return ;
  33. }
  34. // Free a cmark_node list and any children.
  35. void cmark_free_nodes(cmark_node *e)
  36. {
  37. cmark_node *next;
  38. while (e != NULL) {
  39. strbuf_free(&e->string_content);
  40. switch (e->type){
  41. case NODE_FENCED_CODE:
  42. strbuf_free(&e->as.code.info);
  43. break;
  44. case NODE_STRING:
  45. case NODE_INLINE_HTML:
  46. case NODE_INLINE_CODE:
  47. cmark_chunk_free(&e->as.literal);
  48. break;
  49. case NODE_LINK:
  50. case NODE_IMAGE:
  51. free(e->as.link.url);
  52. free(e->as.link.title);
  53. splice_into_list(e, e->as.link.label);
  54. break;
  55. default:
  56. break;
  57. }
  58. if (e->last_child) {
  59. // Splice children into list
  60. e->last_child->next = e->next;
  61. e->next = e->first_child;
  62. }
  63. next = e->next;
  64. free(e);
  65. e = next;
  66. }
  67. }