2
0

glue.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. Copyright (c) 2023 Bruce A Henderson
  3. Permission is hereby granted, free of charge, to any person obtaining a copy
  4. of this software and associated documentation files (the "Software"), to deal
  5. in the Software without restriction, including without limitation the rights
  6. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in
  10. all copies or substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  17. THE SOFTWARE.
  18. */
  19. #include "md4c.h"
  20. #include "md4c-html.h"
  21. #include "brl.mod/blitz.mod/blitz.h"
  22. int text_markdown_TMarkdown__EnterBlock(BBObject * obj, MD_BLOCKTYPE type, void * detail);
  23. int text_markdown_TMarkdown__LeaveBlock(BBObject * obj, MD_BLOCKTYPE type, void * detail);
  24. int text_markdown_TMarkdown__EnterSpan(BBObject * obj, MD_SPANTYPE type, void * detail);
  25. int text_markdown_TMarkdown__LeaveSpan(BBObject * obj, MD_SPANTYPE type, void * detail);
  26. int text_markdown_TMarkdown__Text(BBObject * obj, MD_TEXTTYPE type, BBString * text);
  27. void text_markdown_TMarkdown__HtmlOutput(const MD_CHAR * txt, MD_SIZE size, BBObject * ob );
  28. int text_markdown_TMarkdown__EnterCodeBlock(BBObject * obj, MD_BLOCKTYPE type, void * detail);
  29. int text_markdown_TMarkdown__LeaveCodeBlock(BBObject * obj, MD_BLOCKTYPE type, void * detail);
  30. int text_markdown_TMarkdown__CodeBlockText(BBObject * obj, MD_TEXTTYPE type, BBString * text);
  31. int bmx_md_cb_enter_block(MD_BLOCKTYPE type, void* detail, void* userdata) {
  32. return text_markdown_TMarkdown__EnterBlock((BBObject *)userdata, type, detail);
  33. }
  34. int bmx_md_cb_leave_block(MD_BLOCKTYPE type, void* detail, void* userdata) {
  35. return text_markdown_TMarkdown__LeaveBlock((BBObject *)userdata, type, detail);
  36. }
  37. int bmx_md_cb_enter_span(MD_SPANTYPE type, void* detail, void* userdata) {
  38. return text_markdown_TMarkdown__EnterSpan((BBObject *)userdata, type, detail);
  39. }
  40. int bmx_md_cb_leave_span(MD_SPANTYPE type, void* detail, void* userdata) {
  41. return text_markdown_TMarkdown__LeaveSpan((BBObject *)userdata, type, detail);
  42. }
  43. int bmx_md_cb_text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata) {
  44. BBString * txt = bbStringFromUTF8Bytes((unsigned char*)text, size);
  45. return text_markdown_TMarkdown__Text((BBObject *)userdata, type, txt);
  46. }
  47. void bmx_md_cb_html_output(const MD_CHAR * txt, MD_SIZE size, void * userdata) {
  48. text_markdown_TMarkdown__HtmlOutput(txt, size, (BBObject*)userdata);
  49. }
  50. int bmx_md_cb_enter_codeblock(MD_BLOCKTYPE type, void* detail, void* userdata) {
  51. return text_markdown_TMarkdown__EnterCodeBlock((BBObject *)userdata, type, detail);
  52. }
  53. int bmx_md_cb_leave_codeblock(MD_BLOCKTYPE type, void* detail, void* userdata) {
  54. return text_markdown_TMarkdown__LeaveCodeBlock((BBObject *)userdata, type, detail);
  55. }
  56. int bmx_md_cb_codeblock_text(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdata) {
  57. BBString * txt = bbStringFromUTF8Bytes((unsigned char*)text, size);
  58. return text_markdown_TMarkdown__CodeBlockText((BBObject *)userdata, type, txt);
  59. }
  60. int bmx_md_parse(BBObject * obj, BBString * txt, int flags) {
  61. MD_PARSER parser = {
  62. 1,
  63. flags,
  64. bmx_md_cb_enter_block,
  65. bmx_md_cb_leave_block,
  66. bmx_md_cb_enter_span,
  67. bmx_md_cb_leave_span,
  68. bmx_md_cb_text,
  69. 0,
  70. 0
  71. };
  72. char * t = bbStringToUTF8String(txt);
  73. MD_SIZE size = strlen(t);
  74. int res = md_parse(t, size, &parser, obj);
  75. bbMemFree(t);
  76. return res;
  77. }
  78. int bmx_md_html(BBString * text, BBObject * output, int parserFlags, int rendererFlags, int depth, char * ph, BBObject * codeHilite) {
  79. MD_TOC_OPTIONS tocOptions = {
  80. depth,
  81. ph
  82. };
  83. char * t = bbStringToUTF8String(text);
  84. MD_SIZE size = strlen(t);
  85. int res;
  86. if (codeHilite == &bbNullObject) {
  87. res = md_html(t, size, bmx_md_cb_html_output, output, parserFlags, rendererFlags, &tocOptions, 0);
  88. } else {
  89. MD_HTML_CODE_HILITE hilite = {
  90. codeHilite,
  91. 0,
  92. bmx_md_cb_enter_codeblock,
  93. bmx_md_cb_leave_codeblock,
  94. bmx_md_cb_codeblock_text
  95. };
  96. res = md_html(t, size, bmx_md_cb_html_output, output, parserFlags, rendererFlags, &tocOptions, &hilite);
  97. }
  98. bbMemFree(t);
  99. return res;
  100. }
  101. int bmx_md_blockul_istight(MD_BLOCK_UL_DETAIL * detail) {
  102. return detail->is_tight;
  103. }
  104. int bmx_md_blockul_mark(MD_BLOCK_UL_DETAIL * detail) {
  105. return detail->mark;
  106. }
  107. unsigned int bmx_md_blockol_start(MD_BLOCK_OL_DETAIL * detail) {
  108. return detail->start;
  109. }
  110. int bmx_md_blockol_istight(MD_BLOCK_OL_DETAIL * detail) {
  111. return detail->is_tight;
  112. }
  113. int bmx_md_blockol_markdelimiter(MD_BLOCK_OL_DETAIL * detail) {
  114. return detail->mark_delimiter;
  115. }
  116. int bmx_md_blockli_istask(MD_BLOCK_LI_DETAIL * detail) {
  117. return detail->is_task;
  118. }
  119. int bmx_md_blockli_taskmark(MD_BLOCK_LI_DETAIL * detail) {
  120. return detail->task_mark;
  121. }
  122. unsigned int bmx_md_blockli_taskmarkoffset(MD_BLOCK_LI_DETAIL * detail) {
  123. return detail->task_mark_offset;
  124. }
  125. unsigned int bmx_md_blockh_level(MD_BLOCK_H_DETAIL * detail) {
  126. return detail->level;
  127. }
  128. MD_ATTRIBUTE bmx_md_blockh_identifier(MD_BLOCK_H_DETAIL * detail) {
  129. return detail->identifier;
  130. }
  131. MD_ATTRIBUTE bmx_md_blockcode_info(MD_BLOCK_CODE_DETAIL * detail) {
  132. return detail->info;
  133. }
  134. MD_ATTRIBUTE bmx_md_blockcode_lang(MD_BLOCK_CODE_DETAIL * detail) {
  135. return detail->lang;
  136. }
  137. int bmx_md_blockcode_fencechar(MD_BLOCK_CODE_DETAIL * detail) {
  138. return detail->fence_char;
  139. }
  140. unsigned int bmx_md_blocktable_colcount(MD_BLOCK_TABLE_DETAIL * detail) {
  141. return detail->col_count;
  142. }
  143. unsigned int bmx_md_blocktable_headrowcount(MD_BLOCK_TABLE_DETAIL * detail) {
  144. return detail->head_row_count;
  145. }
  146. unsigned int bmx_md_blocktable_bodyrowcount(MD_BLOCK_TABLE_DETAIL * detail) {
  147. return detail->body_row_count;
  148. }
  149. MD_ALIGN bmx_md_blocktd_align(MD_BLOCK_TD_DETAIL * detail) {
  150. return detail->align;
  151. }
  152. MD_ATTRIBUTE bmx_md_spana_href(MD_SPAN_A_DETAIL * detail) {
  153. return detail->href;
  154. }
  155. MD_ATTRIBUTE bmx_md_spana_title(MD_SPAN_A_DETAIL * detail) {
  156. return detail->title;
  157. }
  158. MD_ATTRIBUTE bmx_md_spanimg_src(MD_SPAN_IMG_DETAIL * detail) {
  159. return detail->src;
  160. }
  161. MD_ATTRIBUTE bmx_md_spanimg_title(MD_SPAN_IMG_DETAIL * detail) {
  162. return detail->title;
  163. }
  164. MD_ATTRIBUTE bmx_md_spanwikilink_target(MD_SPAN_WIKILINK_DETAIL * detail) {
  165. return detail->target;
  166. }
  167. BBArray * bmx_md_attribute_substostringarray(MD_ATTRIBUTE * attr) {
  168. if (attr->size == 0) {
  169. return &bbEmptyArray;
  170. }
  171. int n = 0;
  172. while (attr->substr_offsets[n+1] != attr->size) {
  173. n++;
  174. }
  175. n++;
  176. BBArray *p = bbArrayNew1D("$", n);
  177. BBString **s = (BBString**)BBARRAYDATA(p, p->dims);
  178. for (int i = 0; i < n; i++) {
  179. int start_offset = attr->substr_offsets[i];
  180. int end_offset = attr->substr_offsets[i+1];
  181. int substr_length = end_offset - start_offset;
  182. const MD_CHAR *substr_start = attr->text + start_offset;
  183. s[i] = bbStringFromUTF8Bytes((const unsigned char*)substr_start, substr_length);
  184. }
  185. return p;
  186. }