apex-ruby 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +119 -0
  3. data/apex-ruby.gemspec +31 -0
  4. data/ext/apex_ext/apex_ext.c +215 -0
  5. data/ext/apex_ext/apex_src/BENCHMARK.md +32 -0
  6. data/ext/apex_ext/apex_src/BENCHMARK_COMPARISON.md +67 -0
  7. data/ext/apex_ext/apex_src/CHANGELOG.md +2454 -0
  8. data/ext/apex_ext/apex_src/CMakeLists.txt +454 -0
  9. data/ext/apex_ext/apex_src/Dockerfile.linux-build +15 -0
  10. data/ext/apex_ext/apex_src/Formula/apex.rb +38 -0
  11. data/ext/apex_ext/apex_src/Info.plist.in +27 -0
  12. data/ext/apex_ext/apex_src/LICENSE +21 -0
  13. data/ext/apex_ext/apex_src/Package.swift +160 -0
  14. data/ext/apex_ext/apex_src/PackageSupport/README.md +17 -0
  15. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark-gfm_export.h +20 -0
  16. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark-gfm_version.h +14 -0
  17. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark_gfm_spm_stub.c +4 -0
  18. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/config.h +41 -0
  19. data/ext/apex_ext/apex_src/README.md +452 -0
  20. data/ext/apex_ext/apex_src/VERSION +1 -0
  21. data/ext/apex_ext/apex_src/apex-header-2-rb@2x.webp +0 -0
  22. data/ext/apex_ext/apex_src/apex-plugins.json.example +20 -0
  23. data/ext/apex_ext/apex_src/apex.pc.in +11 -0
  24. data/ext/apex_ext/apex_src/cli/main.c +2720 -0
  25. data/ext/apex_ext/apex_src/debug_test.sh +22 -0
  26. data/ext/apex_ext/apex_src/docs/API_REFERENCE.md +451 -0
  27. data/ext/apex_ext/apex_src/docs/ARCHITECTURE.md +166 -0
  28. data/ext/apex_ext/apex_src/docs/CMARK_INTEGRATION.md +220 -0
  29. data/ext/apex_ext/apex_src/docs/CRITICMARKUP.md +501 -0
  30. data/ext/apex_ext/apex_src/docs/DEBUGGING.md +73 -0
  31. data/ext/apex_ext/apex_src/docs/FINAL_STATUS.md +391 -0
  32. data/ext/apex_ext/apex_src/docs/FINAL_STATUS_UPDATE.md +237 -0
  33. data/ext/apex_ext/apex_src/docs/FUTURE_FEATURES.md +456 -0
  34. data/ext/apex_ext/apex_src/docs/IAL_FEATURES.md +210 -0
  35. data/ext/apex_ext/apex_src/docs/IAL_STATUS.md +344 -0
  36. data/ext/apex_ext/apex_src/docs/INTEGRATION_EXAMPLE.m +144 -0
  37. data/ext/apex_ext/apex_src/docs/LIMITATIONS_RESOLVED.md +278 -0
  38. data/ext/apex_ext/apex_src/docs/OUTPUT_MODES.md +321 -0
  39. data/ext/apex_ext/apex_src/docs/PROGRESS.md +167 -0
  40. data/ext/apex_ext/apex_src/docs/STANDALONE_FEATURE.md +174 -0
  41. data/ext/apex_ext/apex_src/docs/TABLE_SPANS_STATUS.md +243 -0
  42. data/ext/apex_ext/apex_src/docs/TEST_COVERAGE.md +316 -0
  43. data/ext/apex_ext/apex_src/docs/USER_GUIDE.md +803 -0
  44. data/ext/apex_ext/apex_src/docs/WIKI_LINKS_ISSUE.md +91 -0
  45. data/ext/apex_ext/apex_src/documentation/README.md +160 -0
  46. data/ext/apex_ext/apex_src/documentation/docsets/Apex Command Line Options.cheatsheet.txt +365 -0
  47. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Info.plist +24 -0
  48. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/C-API.html +1737 -0
  49. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Citations.html +1420 -0
  50. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Command-Line-Options.html +3574 -0
  51. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Configuration.html +1603 -0
  52. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Credits.html +910 -0
  53. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Examples.html +1168 -0
  54. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Getting-Started.html +1003 -0
  55. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Header-IDs.html +1308 -0
  56. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Home.html +1078 -0
  57. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Inline-Attribute-Lists.html +1622 -0
  58. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Installation.html +1168 -0
  59. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Limitations-and-Roadmap.html +1698 -0
  60. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Metadata-Transforms.html +1531 -0
  61. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Modes.html +1980 -0
  62. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Multi-File-Documents.html +1368 -0
  63. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Pandoc-Integration.html +1151 -0
  64. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Plugins.html +2861 -0
  65. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Syntax.html +3981 -0
  66. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Troubleshooting.html +1454 -0
  67. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Usage.html +1200 -0
  68. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Xcode-Integration.html +2066 -0
  69. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/docSet.dsidx +0 -0
  70. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  71. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/tempOptimizedIndex.dsidx +0 -0
  72. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Info.plist +22 -0
  73. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans.woff +0 -0
  74. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold.woff +0 -0
  75. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold_Italic.woff +0 -0
  76. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold.woff +0 -0
  77. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold_Italic.woff +0 -0
  78. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Italic.woff +0 -0
  79. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold.woff +0 -0
  80. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold_Italic.woff +0 -0
  81. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/index.html +914 -0
  82. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/style.css +399 -0
  83. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/docSet.dsidx +0 -0
  84. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  85. data/ext/apex_ext/apex_src/documentation/generate_app_docs.rb +772 -0
  86. data/ext/apex_ext/apex_src/documentation/generate_app_docs_ai.rb +678 -0
  87. data/ext/apex_ext/apex_src/documentation/generate_docset.rb +873 -0
  88. data/ext/apex_ext/apex_src/documentation/generate_single_html.rb +733 -0
  89. data/ext/apex_ext/apex_src/documentation/html/apex-docs.html +17073 -0
  90. data/ext/apex_ext/apex_src/documentation/shared_scripts.js +64 -0
  91. data/ext/apex_ext/apex_src/documentation/shared_styles.css +646 -0
  92. data/ext/apex_ext/apex_src/documentation/transform_for_app.example.md +260 -0
  93. data/ext/apex_ext/apex_src/examples/bracketed_spans_demo.md +119 -0
  94. data/ext/apex_ext/apex_src/examples/emoji_span_plugin.yml +11 -0
  95. data/ext/apex_ext/apex_src/examples/example.html +53 -0
  96. data/ext/apex_ext/apex_src/examples/example.md +85 -0
  97. data/ext/apex_ext/apex_src/examples/fenced_divs_demo.md +158 -0
  98. data/ext/apex_ext/apex_src/examples/kbd.md +8 -0
  99. data/ext/apex_ext/apex_src/examples/kbd_plugin.rb +250 -0
  100. data/ext/apex_ext/apex_src/examples/kbd_plugin.yml +9 -0
  101. data/ext/apex_ext/apex_src/icon/apexicon-outline-black.png +0 -0
  102. data/ext/apex_ext/apex_src/icon/apexicon-outline-black@2x.png +0 -0
  103. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark.png +0 -0
  104. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark@2x.png +0 -0
  105. data/ext/apex_ext/apex_src/icon/apexicon-outline-white.png +0 -0
  106. data/ext/apex_ext/apex_src/icon/apexicon-outline-white@2x.png +0 -0
  107. data/ext/apex_ext/apex_src/icon/apexicon.png +0 -0
  108. data/ext/apex_ext/apex_src/icon/apexicon@2x.png +0 -0
  109. data/ext/apex_ext/apex_src/include/apex/apex.h +247 -0
  110. data/ext/apex_ext/apex_src/include/apex/buffer.h +93 -0
  111. data/ext/apex_ext/apex_src/include/apex/module.modulemap +16 -0
  112. data/ext/apex_ext/apex_src/include/apex/parser.h +150 -0
  113. data/ext/apex_ext/apex_src/include/apex/renderer.h +39 -0
  114. data/ext/apex_ext/apex_src/man/apex-config.5 +374 -0
  115. data/ext/apex_ext/apex_src/man/apex-config.5.md +260 -0
  116. data/ext/apex_ext/apex_src/man/apex-plugins.7 +456 -0
  117. data/ext/apex_ext/apex_src/man/apex-plugins.7.md +365 -0
  118. data/ext/apex_ext/apex_src/man/apex.1 +828 -0
  119. data/ext/apex_ext/apex_src/man/apex.1.md +643 -0
  120. data/ext/apex_ext/apex_src/man/apex.1.new +338 -0
  121. data/ext/apex_ext/apex_src/objc/Apex.swift +237 -0
  122. data/ext/apex_ext/apex_src/objc/NSString+Apex.h +117 -0
  123. data/ext/apex_ext/apex_src/objc/NSString+Apex.m +332 -0
  124. data/ext/apex_ext/apex_src/src/_README.md +358 -0
  125. data/ext/apex_ext/apex_src/src/apex.c +6326 -0
  126. data/ext/apex_ext/apex_src/src/buffer.c +93 -0
  127. data/ext/apex_ext/apex_src/src/extensions/abbreviations.c +362 -0
  128. data/ext/apex_ext/apex_src/src/extensions/abbreviations.h +45 -0
  129. data/ext/apex_ext/apex_src/src/extensions/advanced_footnotes.c +184 -0
  130. data/ext/apex_ext/apex_src/src/extensions/advanced_footnotes.h +50 -0
  131. data/ext/apex_ext/apex_src/src/extensions/advanced_tables.c +1897 -0
  132. data/ext/apex_ext/apex_src/src/extensions/advanced_tables.h +42 -0
  133. data/ext/apex_ext/apex_src/src/extensions/callouts.c +215 -0
  134. data/ext/apex_ext/apex_src/src/extensions/callouts.h +53 -0
  135. data/ext/apex_ext/apex_src/src/extensions/citations.c +2042 -0
  136. data/ext/apex_ext/apex_src/src/extensions/citations.h +163 -0
  137. data/ext/apex_ext/apex_src/src/extensions/critic.c +329 -0
  138. data/ext/apex_ext/apex_src/src/extensions/critic.h +48 -0
  139. data/ext/apex_ext/apex_src/src/extensions/definition_list.c +1670 -0
  140. data/ext/apex_ext/apex_src/src/extensions/definition_list.h +42 -0
  141. data/ext/apex_ext/apex_src/src/extensions/emoji.c +710 -0
  142. data/ext/apex_ext/apex_src/src/extensions/emoji.h +38 -0
  143. data/ext/apex_ext/apex_src/src/extensions/emoji_data.h +942 -0
  144. data/ext/apex_ext/apex_src/src/extensions/fenced_divs.c +925 -0
  145. data/ext/apex_ext/apex_src/src/extensions/fenced_divs.h +43 -0
  146. data/ext/apex_ext/apex_src/src/extensions/github-emoji.txt +869 -0
  147. data/ext/apex_ext/apex_src/src/extensions/grid_tables.c +1121 -0
  148. data/ext/apex_ext/apex_src/src/extensions/grid_tables.h +33 -0
  149. data/ext/apex_ext/apex_src/src/extensions/header_ids.c +626 -0
  150. data/ext/apex_ext/apex_src/src/extensions/header_ids.h +60 -0
  151. data/ext/apex_ext/apex_src/src/extensions/highlight.c +135 -0
  152. data/ext/apex_ext/apex_src/src/extensions/highlight.h +16 -0
  153. data/ext/apex_ext/apex_src/src/extensions/html_markdown.c +408 -0
  154. data/ext/apex_ext/apex_src/src/extensions/html_markdown.h +42 -0
  155. data/ext/apex_ext/apex_src/src/extensions/ial.c +4084 -0
  156. data/ext/apex_ext/apex_src/src/extensions/ial.h +145 -0
  157. data/ext/apex_ext/apex_src/src/extensions/includes.c +1536 -0
  158. data/ext/apex_ext/apex_src/src/extensions/includes.h +54 -0
  159. data/ext/apex_ext/apex_src/src/extensions/index.c +967 -0
  160. data/ext/apex_ext/apex_src/src/extensions/index.h +90 -0
  161. data/ext/apex_ext/apex_src/src/extensions/inline_footnotes.c +205 -0
  162. data/ext/apex_ext/apex_src/src/extensions/inline_footnotes.h +34 -0
  163. data/ext/apex_ext/apex_src/src/extensions/inline_tables.c +332 -0
  164. data/ext/apex_ext/apex_src/src/extensions/inline_tables.h +13 -0
  165. data/ext/apex_ext/apex_src/src/extensions/insert.c +248 -0
  166. data/ext/apex_ext/apex_src/src/extensions/insert.h +18 -0
  167. data/ext/apex_ext/apex_src/src/extensions/math.c +279 -0
  168. data/ext/apex_ext/apex_src/src/extensions/math.h +32 -0
  169. data/ext/apex_ext/apex_src/src/extensions/metadata.c +3046 -0
  170. data/ext/apex_ext/apex_src/src/extensions/metadata.h +125 -0
  171. data/ext/apex_ext/apex_src/src/extensions/relaxed_tables.c +1297 -0
  172. data/ext/apex_ext/apex_src/src/extensions/relaxed_tables.h +39 -0
  173. data/ext/apex_ext/apex_src/src/extensions/special_markers.c +194 -0
  174. data/ext/apex_ext/apex_src/src/extensions/special_markers.h +29 -0
  175. data/ext/apex_ext/apex_src/src/extensions/sup_sub.c +405 -0
  176. data/ext/apex_ext/apex_src/src/extensions/sup_sub.h +16 -0
  177. data/ext/apex_ext/apex_src/src/extensions/syntax_highlight.c +468 -0
  178. data/ext/apex_ext/apex_src/src/extensions/syntax_highlight.h +44 -0
  179. data/ext/apex_ext/apex_src/src/extensions/table_html_postprocess.c +2679 -0
  180. data/ext/apex_ext/apex_src/src/extensions/table_html_postprocess.h +23 -0
  181. data/ext/apex_ext/apex_src/src/extensions/toc.c +255 -0
  182. data/ext/apex_ext/apex_src/src/extensions/toc.h +34 -0
  183. data/ext/apex_ext/apex_src/src/extensions/wiki_links.c +624 -0
  184. data/ext/apex_ext/apex_src/src/extensions/wiki_links.h +58 -0
  185. data/ext/apex_ext/apex_src/src/html_renderer.c +2762 -0
  186. data/ext/apex_ext/apex_src/src/html_renderer.h +126 -0
  187. data/ext/apex_ext/apex_src/src/parser.c +227 -0
  188. data/ext/apex_ext/apex_src/src/plugins.c +895 -0
  189. data/ext/apex_ext/apex_src/src/plugins.h +39 -0
  190. data/ext/apex_ext/apex_src/src/plugins_env.c +187 -0
  191. data/ext/apex_ext/apex_src/src/plugins_remote.c +263 -0
  192. data/ext/apex_ext/apex_src/src/pretty_html.c +358 -0
  193. data/ext/apex_ext/apex_src/src/renderer.c +241 -0
  194. data/ext/apex_ext/apex_src/src/utf8.c +56 -0
  195. data/ext/apex_ext/apex_src/test-linux-build.sh +20 -0
  196. data/ext/apex_ext/apex_src/test.html +103 -0
  197. data/ext/apex_ext/apex_src/test_coverage.sh +121 -0
  198. data/ext/apex_ext/apex_src/test_ial_fenced.md +6 -0
  199. data/ext/apex_ext/apex_src/test_math_norm.py +79 -0
  200. data/ext/apex_ext/apex_src/test_pandoc_output.html +48 -0
  201. data/ext/apex_ext/apex_src/test_spm.sh +107 -0
  202. data/ext/apex_ext/apex_src/tests/ApexSPMTest/main.swift +50 -0
  203. data/ext/apex_ext/apex_src/tests/BENCHMARK_RESULTS.md +229 -0
  204. data/ext/apex_ext/apex_src/tests/CMakeLists.txt +24 -0
  205. data/ext/apex_ext/apex_src/tests/README.md +146 -0
  206. data/ext/apex_ext/apex_src/tests/benchmark.sh +113 -0
  207. data/ext/apex_ext/apex_src/tests/benchmark_comparison.sh +166 -0
  208. data/ext/apex_ext/apex_src/tests/compare_header_ids.sh +31 -0
  209. data/ext/apex_ext/apex_src/tests/fixtures/basic/headers.md +25 -0
  210. data/ext/apex_ext/apex_src/tests/fixtures/basic/list-interruption.md +24 -0
  211. data/ext/apex_ext/apex_src/tests/fixtures/basic/misc_markup.md +33 -0
  212. data/ext/apex_ext/apex_src/tests/fixtures/basic/test_basic.md +26 -0
  213. data/ext/apex_ext/apex_src/tests/fixtures/code/code-blocks.md +260 -0
  214. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/SUMMARY.md +6 -0
  215. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/chapter1.md +7 -0
  216. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/index.txt +9 -0
  217. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/intro.md +5 -0
  218. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/section1_1.md +5 -0
  219. data/ext/apex_ext/apex_src/tests/fixtures/comprehensive_test.md +620 -0
  220. data/ext/apex_ext/apex_src/tests/fixtures/debug_ref_image_ial.md +3 -0
  221. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial.md +11 -0
  222. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial_demo.md +177 -0
  223. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji-autocorrect.md +94 -0
  224. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji_test.md +3 -0
  225. data/ext/apex_ext/apex_src/tests/fixtures/extensions/kbd_test.md +3 -0
  226. data/ext/apex_ext/apex_src/tests/fixtures/ial/bracketed_spans_test.md +74 -0
  227. data/ext/apex_ext/apex_src/tests/fixtures/images/image_and_encoding_test.md +27 -0
  228. data/ext/apex_ext/apex_src/tests/fixtures/images/multimarkdown_image_attributes_test.md +60 -0
  229. data/ext/apex_ext/apex_src/tests/fixtures/images/pandoc_ial_image_test.md +27 -0
  230. data/ext/apex_ext/apex_src/tests/fixtures/images/width_height_conversion_test.md +94 -0
  231. data/ext/apex_ext/apex_src/tests/fixtures/img-in-div.md +16 -0
  232. data/ext/apex_ext/apex_src/tests/fixtures/includes/code.py +4 -0
  233. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.csv +5 -0
  234. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.tsv +5 -0
  235. data/ext/apex_ext/apex_src/tests/fixtures/includes/image.png +2 -0
  236. data/ext/apex_ext/apex_src/tests/fixtures/includes/metadata_options.yml +11 -0
  237. data/ext/apex_ext/apex_src/tests/fixtures/includes/nested.md +8 -0
  238. data/ext/apex_ext/apex_src/tests/fixtures/includes/raw.html +4 -0
  239. data/ext/apex_ext/apex_src/tests/fixtures/includes/simple.md +7 -0
  240. data/ext/apex_ext/apex_src/tests/fixtures/includes/test_image.png +0 -0
  241. data/ext/apex_ext/apex_src/tests/fixtures/large_doc.md +1094 -0
  242. data/ext/apex_ext/apex_src/tests/fixtures/metadata_options.yml +11 -0
  243. data/ext/apex_ext/apex_src/tests/fixtures/output/gfm_header_id_test.md +96 -0
  244. data/ext/apex_ext/apex_src/tests/fixtures/output/test_citations.md +43 -0
  245. data/ext/apex_ext/apex_src/tests/fixtures/output/test_def_list_links.md +12 -0
  246. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_mmark.md +53 -0
  247. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_textindex.md +37 -0
  248. data/ext/apex_ext/apex_src/tests/fixtures/tables/advanced_tables_test.md +93 -0
  249. data/ext/apex_ext/apex_src/tests/fixtures/tables/inline_tables_test.md +38 -0
  250. data/ext/apex_ext/apex_src/tests/fixtures/tables/relaxed-table.md +12 -0
  251. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_cr_line_endings.md +15 -0
  252. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_no_trailing_newline.md +15 -0
  253. data/ext/apex_ext/apex_src/tests/generate_gfm_ids.sh +105 -0
  254. data/ext/apex_ext/apex_src/tests/generate_ial_demo.sh +143 -0
  255. data/ext/apex_ext/apex_src/tests/gfm_id_comparison_summary.md +96 -0
  256. data/ext/apex_ext/apex_src/tests/gh_api_test.md +6 -0
  257. data/ext/apex_ext/apex_src/tests/ial_demo.html +186 -0
  258. data/ext/apex_ext/apex_src/tests/include_code.py +19 -0
  259. data/ext/apex_ext/apex_src/tests/include_snippet.md +15 -0
  260. data/ext/apex_ext/apex_src/tests/multi_file_cli_test.sh +64 -0
  261. data/ext/apex_ext/apex_src/tests/sample_data.csv +7 -0
  262. data/ext/apex_ext/apex_src/tests/table_escaped_ltlt.md +4 -0
  263. data/ext/apex_ext/apex_src/tests/test_basic.c +74 -0
  264. data/ext/apex_ext/apex_src/tests/test_extensions.c +2116 -0
  265. data/ext/apex_ext/apex_src/tests/test_helpers.c +183 -0
  266. data/ext/apex_ext/apex_src/tests/test_helpers.h +91 -0
  267. data/ext/apex_ext/apex_src/tests/test_ial.c +282 -0
  268. data/ext/apex_ext/apex_src/tests/test_links.c +418 -0
  269. data/ext/apex_ext/apex_src/tests/test_marked_integration.c +265 -0
  270. data/ext/apex_ext/apex_src/tests/test_metadata.c +908 -0
  271. data/ext/apex_ext/apex_src/tests/test_output.c +1118 -0
  272. data/ext/apex_ext/apex_src/tests/test_plugins.c +219 -0
  273. data/ext/apex_ext/apex_src/tests/test_refs.bib +31 -0
  274. data/ext/apex_ext/apex_src/tests/test_runner.c +244 -0
  275. data/ext/apex_ext/apex_src/tests/test_syntax_highlight.c +198 -0
  276. data/ext/apex_ext/apex_src/tests/test_tables.c +862 -0
  277. data/ext/apex_ext/apex_src/tests/update_benchmarks.sh +9 -0
  278. data/ext/apex_ext/apex_src/tests/yaml_test.md +13 -0
  279. data/ext/apex_ext/apex_src/tests.rb +39 -0
  280. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CMakeLists.txt +48 -0
  281. data/ext/apex_ext/apex_src/vendor/cmark-gfm/COPYING +170 -0
  282. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.c +14 -0
  283. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.cmake +43 -0
  284. data/ext/apex_ext/apex_src/vendor/cmark-gfm/FindAsan.cmake +74 -0
  285. data/ext/apex_ext/apex_src/vendor/cmark-gfm/Makefile.nmake +38 -0
  286. data/ext/apex_ext/apex_src/vendor/cmark-gfm/README.md +206 -0
  287. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/CMakeLists.txt +30 -0
  288. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.cpp +15 -0
  289. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.h +16 -0
  290. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.c +111 -0
  291. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.h +35 -0
  292. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/main.c +1169 -0
  293. data/ext/apex_ext/apex_src/vendor/cmark-gfm/appveyor.yml +21 -0
  294. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-flat.md +16 -0
  295. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-nested.md +13 -0
  296. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-code.md +11 -0
  297. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-fences.md +14 -0
  298. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-heading.md +9 -0
  299. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-hr.md +10 -0
  300. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-html.md +32 -0
  301. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-lheading.md +8 -0
  302. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-flat.md +67 -0
  303. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-nested.md +36 -0
  304. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-flat.md +15 -0
  305. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-nested.md +17 -0
  306. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-autolink.md +14 -0
  307. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-backticks.md +3 -0
  308. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-flat.md +5 -0
  309. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-nested.md +5 -0
  310. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-worst.md +5 -0
  311. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-entity.md +11 -0
  312. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-escape.md +15 -0
  313. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-html.md +44 -0
  314. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-flat.md +23 -0
  315. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-nested.md +13 -0
  316. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-newlines.md +24 -0
  317. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/lorem1.md +13 -0
  318. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/rawtabs.md +18 -0
  319. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/statistics.py +595 -0
  320. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/stats.py +19 -0
  321. data/ext/apex_ext/apex_src/vendor/cmark-gfm/benchmarks.md +33 -0
  322. data/ext/apex_ext/apex_src/vendor/cmark-gfm/changelog.txt +1245 -0
  323. data/ext/apex_ext/apex_src/vendor/cmark-gfm/data/CaseFolding.txt +1495 -0
  324. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/CMakeLists.txt +119 -0
  325. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/autolink.c +508 -0
  326. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/autolink.h +8 -0
  327. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/cmark-gfm-core-extensions.h +54 -0
  328. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/core-extensions.c +27 -0
  329. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.c +879 -0
  330. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.h +24 -0
  331. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.re +92 -0
  332. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/strikethrough.c +167 -0
  333. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/strikethrough.h +9 -0
  334. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/table.c +917 -0
  335. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/table.h +12 -0
  336. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tagfilter.c +60 -0
  337. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tagfilter.h +8 -0
  338. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tasklist.c +156 -0
  339. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tasklist.h +8 -0
  340. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/CMakeLists.txt +22 -0
  341. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/README.md +12 -0
  342. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic.c +91 -0
  343. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic_brackets.c +110 -0
  344. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzzloop.sh +28 -0
  345. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/CMakeLists.txt +10 -0
  346. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/make_man_page.py +133 -0
  347. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man1/cmark-gfm.1 +78 -0
  348. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man3/cmark-gfm.3 +1041 -0
  349. data/ext/apex_ext/apex_src/vendor/cmark-gfm/nmake.bat +1 -0
  350. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/CMakeLists.txt +230 -0
  351. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/arena.c +104 -0
  352. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/blocks.c +1622 -0
  353. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/buffer.c +278 -0
  354. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/buffer.h +116 -0
  355. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/case_fold_switch.inc +4327 -0
  356. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/chunk.h +135 -0
  357. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm-extension_api.h +737 -0
  358. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm.h +833 -0
  359. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm_version.h.in +7 -0
  360. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark.c +55 -0
  361. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark_ctype.c +44 -0
  362. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark_ctype.h +33 -0
  363. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/commonmark.c +514 -0
  364. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/config.h.in +76 -0
  365. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/entities.inc +2138 -0
  366. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/footnotes.c +63 -0
  367. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/footnotes.h +27 -0
  368. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini.h +57 -0
  369. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_href_e.c +100 -0
  370. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_html_e.c +66 -0
  371. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_html_u.c +149 -0
  372. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/html.c +502 -0
  373. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/html.h +27 -0
  374. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/inlines.c +1788 -0
  375. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/inlines.h +29 -0
  376. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/iterator.c +159 -0
  377. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/iterator.h +26 -0
  378. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/latex.c +468 -0
  379. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/libcmark-gfm.pc.in +10 -0
  380. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/linked_list.c +37 -0
  381. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/main.c +328 -0
  382. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/man.c +274 -0
  383. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/map.c +129 -0
  384. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/map.h +44 -0
  385. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/node.c +1045 -0
  386. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/node.h +167 -0
  387. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/parser.h +59 -0
  388. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plaintext.c +218 -0
  389. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plugin.c +36 -0
  390. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plugin.h +34 -0
  391. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/references.c +43 -0
  392. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/references.h +26 -0
  393. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/registry.c +63 -0
  394. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/registry.h +24 -0
  395. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/render.c +213 -0
  396. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/render.h +62 -0
  397. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.c +14056 -0
  398. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.h +70 -0
  399. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.re +365 -0
  400. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/syntax_extension.c +149 -0
  401. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/syntax_extension.h +34 -0
  402. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/utf8.c +317 -0
  403. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/utf8.h +35 -0
  404. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/xml.c +182 -0
  405. data/ext/apex_ext/apex_src/vendor/cmark-gfm/suppressions +10 -0
  406. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/CMakeLists.txt +114 -0
  407. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/afl_test_cases/test.md +49 -0
  408. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark-fuzz.c +58 -0
  409. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark.py +105 -0
  410. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/entity_tests.py +67 -0
  411. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-full-info-string.txt +0 -0
  412. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-table-prefer-style-attributes.txt +38 -0
  413. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions.txt +920 -0
  414. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/fuzzing_dictionary +67 -0
  415. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/normalize.py +194 -0
  416. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/pathological_tests.py +160 -0
  417. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/regression.txt +375 -0
  418. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/roundtrip_tests.py +50 -0
  419. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/run-cmark-fuzz +4 -0
  420. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/smart_punct.txt +177 -0
  421. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec.txt +10212 -0
  422. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec_tests.py +152 -0
  423. data/ext/apex_ext/apex_src/vendor/cmark-gfm/toolchain-mingw32.cmake +17 -0
  424. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/Dockerfile +41 -0
  425. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/appveyor-build.bat +13 -0
  426. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/make_entities_inc.py +32 -0
  427. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/mkcasefold.pl +22 -0
  428. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md.xsl +319 -0
  429. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md_gfm.xsl +80 -0
  430. data/ext/apex_ext/apex_src/vendor/cmark-gfm/why-cmark-and-not-x.md +104 -0
  431. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.js +6 -0
  432. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.py +37 -0
  433. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rb +15 -0
  434. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rkt +208 -0
  435. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper_ext.py +109 -0
  436. data/ext/apex_ext/apex_src/vendor/libyaml/CMakeLists.txt +160 -0
  437. data/ext/apex_ext/apex_src/vendor/libyaml/Changes +372 -0
  438. data/ext/apex_ext/apex_src/vendor/libyaml/License +20 -0
  439. data/ext/apex_ext/apex_src/vendor/libyaml/Makefile.am +51 -0
  440. data/ext/apex_ext/apex_src/vendor/libyaml/ReadMe.md +46 -0
  441. data/ext/apex_ext/apex_src/vendor/libyaml/announcement.msg +89 -0
  442. data/ext/apex_ext/apex_src/vendor/libyaml/bootstrap +3 -0
  443. data/ext/apex_ext/apex_src/vendor/libyaml/cmake/config.h.in +4 -0
  444. data/ext/apex_ext/apex_src/vendor/libyaml/configure.ac +73 -0
  445. data/ext/apex_ext/apex_src/vendor/libyaml/doc/doxygen.cfg +222 -0
  446. data/ext/apex_ext/apex_src/vendor/libyaml/docker/README.mkd +17 -0
  447. data/ext/apex_ext/apex_src/vendor/libyaml/docker/alpine-3.7 +26 -0
  448. data/ext/apex_ext/apex_src/vendor/libyaml/docker/fedora-25 +26 -0
  449. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-14.04 +29 -0
  450. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-16.04 +24 -0
  451. data/ext/apex_ext/apex_src/vendor/libyaml/examples/anchors.yaml +10 -0
  452. data/ext/apex_ext/apex_src/vendor/libyaml/examples/array.yaml +2 -0
  453. data/ext/apex_ext/apex_src/vendor/libyaml/examples/global-tag.yaml +14 -0
  454. data/ext/apex_ext/apex_src/vendor/libyaml/examples/json.yaml +1 -0
  455. data/ext/apex_ext/apex_src/vendor/libyaml/examples/mapping.yaml +2 -0
  456. data/ext/apex_ext/apex_src/vendor/libyaml/examples/numbers.yaml +1 -0
  457. data/ext/apex_ext/apex_src/vendor/libyaml/examples/strings.yaml +7 -0
  458. data/ext/apex_ext/apex_src/vendor/libyaml/examples/tags.yaml +7 -0
  459. data/ext/apex_ext/apex_src/vendor/libyaml/examples/yaml-version.yaml +3 -0
  460. data/ext/apex_ext/apex_src/vendor/libyaml/include/Makefile.am +17 -0
  461. data/ext/apex_ext/apex_src/vendor/libyaml/include/yaml.h +1999 -0
  462. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/ReadMe.md +77 -0
  463. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/Dockerfile +32 -0
  464. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/output/ReadMe +1 -0
  465. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/scripts/libyaml-dist.sh +23 -0
  466. data/ext/apex_ext/apex_src/vendor/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml +1 -0
  467. data/ext/apex_ext/apex_src/vendor/libyaml/src/Makefile.am +4 -0
  468. data/ext/apex_ext/apex_src/vendor/libyaml/src/api.c +1393 -0
  469. data/ext/apex_ext/apex_src/vendor/libyaml/src/dumper.c +394 -0
  470. data/ext/apex_ext/apex_src/vendor/libyaml/src/emitter.c +2358 -0
  471. data/ext/apex_ext/apex_src/vendor/libyaml/src/loader.c +544 -0
  472. data/ext/apex_ext/apex_src/vendor/libyaml/src/parser.c +1416 -0
  473. data/ext/apex_ext/apex_src/vendor/libyaml/src/reader.c +469 -0
  474. data/ext/apex_ext/apex_src/vendor/libyaml/src/scanner.c +3598 -0
  475. data/ext/apex_ext/apex_src/vendor/libyaml/src/writer.c +141 -0
  476. data/ext/apex_ext/apex_src/vendor/libyaml/src/yaml_private.h +684 -0
  477. data/ext/apex_ext/apex_src/vendor/libyaml/tests/CMakeLists.txt +27 -0
  478. data/ext/apex_ext/apex_src/vendor/libyaml/tests/Makefile.am +9 -0
  479. data/ext/apex_ext/apex_src/vendor/libyaml/tests/ReadMe.md +63 -0
  480. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor-alt.c +800 -0
  481. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor.c +1127 -0
  482. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter-alt.c +217 -0
  483. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter.c +202 -0
  484. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-all-tests.sh +29 -0
  485. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-dumper.c +314 -0
  486. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter-test-suite.c +290 -0
  487. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter.c +327 -0
  488. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-loader.c +63 -0
  489. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser-test-suite.c +196 -0
  490. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser.c +88 -0
  491. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-scanner.c +63 -0
  492. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-reader.c +354 -0
  493. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-version.c +29 -0
  494. data/ext/apex_ext/apex_src/vendor/libyaml/yaml-0.1.pc.in +10 -0
  495. data/ext/apex_ext/apex_src/vendor/libyaml/yamlConfig.cmake.in +16 -0
  496. data/ext/apex_ext/extconf.rb +103 -0
  497. data/lib/apex/configurable.rb +46 -0
  498. data/lib/apex/document.rb +66 -0
  499. data/lib/apex/version.rb +15 -0
  500. data/lib/apex.rb +28 -0
  501. metadata +544 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Grid Tables Extension for Apex
3
+ *
4
+ * Preprocessing extension that converts Pandoc grid table syntax to
5
+ * pipe table format before the regular cmark parser runs.
6
+ *
7
+ * Grid tables are detected by lines starting with '+' followed by '-'
8
+ * or '=' characters (e.g., '+---+', '+===+').
9
+ */
10
+
11
+ #ifndef APEX_GRID_TABLES_H
12
+ #define APEX_GRID_TABLES_H
13
+
14
+ #include <stddef.h>
15
+
16
+ #ifdef __cplusplus
17
+ extern "C" {
18
+ #endif
19
+
20
+ /**
21
+ * Preprocess grid tables in markdown text
22
+ * Converts grid table syntax to pipe table format
23
+ *
24
+ * @param text Input markdown text
25
+ * @return Newly allocated text with grid tables converted (must be freed), or NULL on error
26
+ */
27
+ char *apex_preprocess_grid_tables(const char *text);
28
+
29
+ #ifdef __cplusplus
30
+ }
31
+ #endif
32
+
33
+ #endif /* APEX_GRID_TABLES_H */
@@ -0,0 +1,626 @@
1
+ /**
2
+ * Header ID Generation Extension
3
+ * Implementation
4
+ */
5
+
6
+ #include "header_ids.h"
7
+ #include "cmark-gfm.h"
8
+ #include "emoji.h"
9
+ #include <string.h>
10
+ #include <stdlib.h>
11
+ #include <ctype.h>
12
+
13
+ /**
14
+ * Convert diacritic characters to ASCII equivalents
15
+ * Handles common Latin diacritics
16
+ */
17
+ static char normalize_char(unsigned char c) {
18
+ /* Basic ASCII alphanumeric */
19
+ if (isalnum(c)) {
20
+ return tolower(c);
21
+ }
22
+
23
+ /* Common diacritics → ASCII */
24
+ /* This is a simplified mapping - full Unicode normalization would require ICU */
25
+ switch (c) {
26
+ /* Latin-1 Supplement */
27
+ case 0xC0: case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: return 'a'; /* ÀÁÂÃÄÅ */
28
+ case 0xE0: case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: return 'a'; /* àáâãäå */
29
+ case 0xC7: return 'c'; /* Ç */
30
+ case 0xE7: return 'c'; /* ç */
31
+ case 0xC8: case 0xC9: case 0xCA: case 0xCB: return 'e'; /* ÈÉÊË */
32
+ case 0xE8: case 0xE9: case 0xEA: case 0xEB: return 'e'; /* èéêë */
33
+ case 0xCC: case 0xCD: case 0xCE: case 0xCF: return 'i'; /* ÌÍÎÏ */
34
+ case 0xEC: case 0xED: case 0xEE: case 0xEF: return 'i'; /* ìíîï */
35
+ case 0xD1: return 'n'; /* Ñ */
36
+ case 0xF1: return 'n'; /* ñ */
37
+ case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD8: return 'o'; /* ÒÓÔÕÖØ */
38
+ case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF8: return 'o'; /* òóôõöø */
39
+ case 0xD9: case 0xDA: case 0xDB: case 0xDC: return 'u'; /* ÙÚÛÜ */
40
+ case 0xF9: case 0xFA: case 0xFB: case 0xFC: return 'u'; /* ùúûü */
41
+ case 0xDD: case 0xFD: case 0xFF: return 'y'; /* Ýýÿ */
42
+ case 0xDF: return 's'; /* ß */
43
+ default: return 0; /* Not a valid character to keep */
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Generate header ID from text
49
+ */
50
+ char *apex_generate_header_id(const char *text, apex_id_format_t format) {
51
+ if (!text) return strdup("");
52
+
53
+ size_t len = strlen(text);
54
+ size_t capacity = len * 3 + 1; /* Extra space for UTF-8 expansion */
55
+ char *id = malloc(capacity);
56
+ if (!id) return strdup("");
57
+
58
+ char *write = id;
59
+ bool last_was_dash = false;
60
+ bool first_char = true;
61
+ bool last_was_punct_dash = false; /* Track if last dash came from punctuation (for kramdown) */
62
+
63
+ for (const char *read = text; *read; read++) {
64
+ unsigned char c = (unsigned char)*read;
65
+
66
+ /* Skip if already processed as part of UTF-8 sequence */
67
+ if ((c & 0xC0) == 0x80) continue;
68
+
69
+ /* Check for em dash (—) U+2014: 0xE2 0x80 0x94 */
70
+ if (c == 0xE2 && read[1] != '\0' && read[2] != '\0' &&
71
+ (unsigned char)read[1] == 0x80 && (unsigned char)read[2] == 0x94) {
72
+ if (format == APEX_ID_FORMAT_MMD) {
73
+ /* MMD: preserve em dash as-is */
74
+ *write++ = 0xE2;
75
+ *write++ = 0x80;
76
+ *write++ = 0x94;
77
+ last_was_dash = false;
78
+ first_char = false;
79
+ }
80
+ /* GFM and Kramdown: remove em dash (skip it) */
81
+ read += 2; /* Skip the next 2 bytes (for loop will increment past 0x94) */
82
+ continue;
83
+ }
84
+
85
+ /* Check for en dash (–) U+2013: 0xE2 0x80 0x93 */
86
+ if (c == 0xE2 && read[1] != '\0' && read[2] != '\0' &&
87
+ (unsigned char)read[1] == 0x80 && (unsigned char)read[2] == 0x93) {
88
+ if (format == APEX_ID_FORMAT_MMD) {
89
+ /* MMD: preserve en dash as-is */
90
+ *write++ = 0xE2;
91
+ *write++ = 0x80;
92
+ *write++ = 0x93;
93
+ last_was_dash = false;
94
+ first_char = false;
95
+ }
96
+ /* GFM and Kramdown: remove en dash (skip it) */
97
+ read += 2; /* Skip the next 2 bytes (for loop will increment past 0x93) */
98
+ continue;
99
+ }
100
+
101
+ if (format == APEX_ID_FORMAT_MMD) {
102
+ /* MMD format: preserve dashes, lowercase alphanumerics, preserve diacritics, skip spaces/punctuation */
103
+ if (c == '-') {
104
+ /* Regular dash: preserve as-is */
105
+ *write++ = '-';
106
+ last_was_dash = false;
107
+ first_char = false;
108
+ } else if (isalnum((unsigned char)c)) {
109
+ /* ASCII alphanumeric: lowercase */
110
+ *write++ = tolower(c);
111
+ last_was_dash = false;
112
+ first_char = false;
113
+ } else if (c == ' ') {
114
+ /* Space: skip (remove) */
115
+ /* Do nothing */
116
+ } else if (c < 0x80) {
117
+ /* ASCII non-alphanumeric (punctuation, etc.): skip */
118
+ /* Do nothing */
119
+ } else {
120
+ /* UTF-8 character (diacritics, etc.): preserve as-is, but lowercase if it's a letter */
121
+ /* Check if this is the start of a UTF-8 sequence */
122
+ int utf8_len = 0;
123
+ if ((c & 0xE0) == 0xC0) utf8_len = 2; /* 2-byte sequence */
124
+ else if ((c & 0xF0) == 0xE0) utf8_len = 3; /* 3-byte sequence */
125
+ else if ((c & 0xF8) == 0xF0) utf8_len = 4; /* 4-byte sequence */
126
+
127
+ if (utf8_len > 0) {
128
+ /* Copy the entire UTF-8 sequence */
129
+ for (int i = 0; i < utf8_len && read[i] != '\0'; i++) {
130
+ *write++ = read[i];
131
+ }
132
+ read += utf8_len - 1; /* -1 because for loop will increment */
133
+ last_was_dash = false;
134
+ first_char = false;
135
+ } else {
136
+ /* Invalid UTF-8 or single byte: skip */
137
+ }
138
+ }
139
+ } else if (format == APEX_ID_FORMAT_KRAMDOWN) {
140
+ /* Kramdown format: spaces→dashes (not collapsed), remove diacritics, remove em/en dashes */
141
+ /* Trailing punctuation is removed, not converted to dash */
142
+ /* If punctuation is followed by space, skip the space */
143
+ const char *next = read + 1;
144
+ while (*next && (*next == ' ' || *next == '\t' || *next == '\n' || *next == '\r')) next++;
145
+ bool is_trailing = (*next == '\0');
146
+
147
+ if (c == '-') {
148
+ /* Regular dash: preserve as-is */
149
+ *write++ = '-';
150
+ last_was_dash = false;
151
+ last_was_punct_dash = false;
152
+ first_char = false;
153
+ } else if (isalnum((unsigned char)c)) {
154
+ /* ASCII alphanumeric: lowercase */
155
+ *write++ = tolower(c);
156
+ last_was_dash = false;
157
+ last_was_punct_dash = false;
158
+ first_char = false;
159
+ } else if (c == ' ') {
160
+ /* Space: check if it follows punctuation that became a dash */
161
+ if (last_was_punct_dash) {
162
+ /* Space after punctuation: skip (don't convert to dash) */
163
+ last_was_punct_dash = false;
164
+ /* Do nothing */
165
+ } else {
166
+ /* Regular space: convert to dash (don't collapse multiple spaces) */
167
+ *write++ = '-';
168
+ last_was_dash = false;
169
+ last_was_punct_dash = false;
170
+ first_char = false;
171
+ }
172
+ } else if (c < 0x80) {
173
+ /* ASCII non-alphanumeric (punctuation, etc.) */
174
+ if (is_trailing) {
175
+ /* Trailing punctuation: remove (skip) */
176
+ last_was_punct_dash = false;
177
+ /* Do nothing */
178
+ } else {
179
+ /* Middle punctuation: convert to dash */
180
+ *write++ = '-';
181
+ last_was_dash = false;
182
+ last_was_punct_dash = true; /* Mark that this dash came from punctuation */
183
+ first_char = false;
184
+ }
185
+ } else {
186
+ /* UTF-8 character (diacritics, etc.): remove (skip) */
187
+ /* Check if this is the start of a UTF-8 sequence */
188
+ int utf8_len = 0;
189
+ if ((c & 0xE0) == 0xC0) utf8_len = 2; /* 2-byte sequence */
190
+ else if ((c & 0xF0) == 0xE0) utf8_len = 3; /* 3-byte sequence */
191
+ else if ((c & 0xF8) == 0xF0) utf8_len = 4; /* 4-byte sequence */
192
+
193
+ if (utf8_len > 0) {
194
+ /* Skip the entire UTF-8 sequence */
195
+ read += utf8_len - 1; /* -1 because for loop will increment */
196
+ }
197
+ /* Otherwise skip the byte */
198
+ }
199
+ } else {
200
+ /* GFM format: spaces become dashes, other whitespace/punctuation removed, normalize diacritics */
201
+ /* Check for emoji (UTF-8 sequences) and replace with name */
202
+ bool emoji_found = false;
203
+ if (c >= 0x80) {
204
+ /* Potential UTF-8 sequence - check if it's an emoji */
205
+ int utf8_len = 0;
206
+ if ((c & 0xE0) == 0xC0) utf8_len = 2; /* 2-byte sequence */
207
+ else if ((c & 0xF0) == 0xE0) utf8_len = 3; /* 3-byte sequence */
208
+ else if ((c & 0xF8) == 0xF0) utf8_len = 4; /* 4-byte sequence */
209
+
210
+ if (utf8_len > 0) {
211
+ /* Check if we have enough bytes */
212
+ bool has_enough_bytes = true;
213
+ for (int i = 1; i < utf8_len; i++) {
214
+ if (read[i] == '\0' || ((unsigned char)read[i] & 0xC0) != 0x80) {
215
+ has_enough_bytes = false;
216
+ break;
217
+ }
218
+ }
219
+
220
+ if (has_enough_bytes) {
221
+ /* Try to find emoji name */
222
+ const char *emoji_name = apex_find_emoji_name(read, utf8_len);
223
+ if (emoji_name) {
224
+ /* Replace emoji with its name */
225
+ size_t name_len = strlen(emoji_name);
226
+ /* Ensure we have enough space */
227
+ size_t current_pos = write - id;
228
+ size_t needed = current_pos + name_len + 1;
229
+ if (needed > capacity) {
230
+ /* Reallocate if needed */
231
+ size_t old_pos = write - id;
232
+ size_t new_cap = needed * 2;
233
+ char *new_id = realloc(id, new_cap);
234
+ if (new_id) {
235
+ id = new_id;
236
+ write = id + old_pos;
237
+ capacity = new_cap;
238
+ }
239
+ }
240
+ /* Write emoji name */
241
+ memcpy(write, emoji_name, name_len);
242
+ write += name_len;
243
+ read += utf8_len - 1; /* -1 because for loop will increment */
244
+ last_was_dash = false;
245
+ first_char = false;
246
+ emoji_found = true;
247
+ } else {
248
+ /* Valid UTF-8 sequence but not an emoji - check if it's a diacritic */
249
+ /* Check for diacritics before skipping */
250
+ char normalized = 0;
251
+ if (utf8_len == 2 && (c & 0xE0) == 0xC0) {
252
+ /* 2-byte UTF-8 sequence - check for common Latin diacritics */
253
+ if (read[1] != '\0' && ((unsigned char)read[1] & 0xC0) == 0x80) {
254
+ unsigned char byte2 = (unsigned char)read[1];
255
+ /* Check for É (0xC3 0x89) */
256
+ if (c == 0xC3 && byte2 == 0x89) {
257
+ normalized = 'e';
258
+ } else if (c == 0xC3 && byte2 >= 0x80 && byte2 <= 0x85) {
259
+ /* ÀÁÂÃÄÅ (0xC3 0x80-0x85) */
260
+ normalized = 'a';
261
+ } else if (c == 0xC3 && (byte2 == 0x87 || byte2 == 0xA7)) {
262
+ /* Ç (0xC7) or ç (0xE7) */
263
+ normalized = 'c';
264
+ } else if (c == 0xC3 && byte2 >= 0x88 && byte2 <= 0x8B) {
265
+ /* ÈÉÊË (0xC8-0xCB) */
266
+ normalized = 'e';
267
+ } else if (c == 0xC3 && byte2 >= 0x8C && byte2 <= 0x8F) {
268
+ /* ÌÍÎÏ (0xCC-0xCF) */
269
+ normalized = 'i';
270
+ } else if (c == 0xC3 && (byte2 == 0x91 || byte2 == 0xB1)) {
271
+ /* Ñ (0xD1) or ñ (0xF1) */
272
+ normalized = 'n';
273
+ } else if (c == 0xC3 && byte2 >= 0x92 && byte2 <= 0x98) {
274
+ /* ÒÓÔÕÖØ (0xD2-0xD8) */
275
+ normalized = 'o';
276
+ } else if (c == 0xC3 && byte2 >= 0x99 && byte2 <= 0x9C) {
277
+ /* ÙÚÛÜ (0xD9-0xDC) */
278
+ normalized = 'u';
279
+ } else if (c == 0xC3 && (byte2 == 0x9D || byte2 == 0xBD || byte2 == 0xFF)) {
280
+ /* Ýýÿ (0xDD, 0xFD, 0xFF) */
281
+ normalized = 'y';
282
+ } else if (c == 0xC3 && byte2 == 0x9F) {
283
+ /* ß (0xDF) */
284
+ normalized = 's';
285
+ }
286
+ }
287
+ }
288
+
289
+ if (normalized) {
290
+ /* Found a diacritic - write the normalized character */
291
+ *write++ = normalized;
292
+ read += utf8_len - 1; /* -1 because for loop will increment */
293
+ last_was_dash = false;
294
+ first_char = false;
295
+ emoji_found = true; /* Mark as found so we don't process it again */
296
+ } else {
297
+ /* Not an emoji and not a diacritic - skip it (GFM removes non-ASCII non-emoji) */
298
+ read += utf8_len - 1; /* -1 because for loop will increment */
299
+ emoji_found = true; /* Mark as found so we don't process it */
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }
305
+
306
+ if (!emoji_found) {
307
+ /* Check for ASCII diacritics (single-byte) or other characters */
308
+ char normalized = 0;
309
+ if (c < 0x80) {
310
+ /* ASCII character - use normalize_char */
311
+ normalized = normalize_char(c);
312
+ }
313
+
314
+ if (normalized) {
315
+ /* Valid alphanumeric character (normalized diacritic) */
316
+ *write++ = normalized;
317
+ last_was_dash = false;
318
+ first_char = false;
319
+ } else if (isalnum(c)) {
320
+ /* ASCII alphanumeric not in our diacritic map */
321
+ *write++ = tolower(c);
322
+ last_was_dash = false;
323
+ first_char = false;
324
+ } else if (c == ' ') {
325
+ /* Space: convert to dash (collapsed) */
326
+ if (!last_was_dash && !first_char) {
327
+ *write++ = '-';
328
+ last_was_dash = true;
329
+ }
330
+ } else if (c == '-') {
331
+ /* Regular dash: preserve (but don't add multiple consecutive) */
332
+ if (!last_was_dash && !first_char) {
333
+ *write++ = '-';
334
+ last_was_dash = true;
335
+ }
336
+ } else {
337
+ /* Other whitespace and punctuation: remove (skip) */
338
+ /* Do nothing */
339
+ }
340
+ }
341
+ }
342
+ }
343
+
344
+ *write = '\0';
345
+
346
+ /* Trim dashes from start and end */
347
+ if (format == APEX_ID_FORMAT_GFM) {
348
+ /* GFM: trim both leading and trailing dashes */
349
+ char *start = id;
350
+ char *end = write - 1;
351
+
352
+ while (*start == '-') start++;
353
+ while (end > start && *end == '-') end--;
354
+
355
+ if (start > id) {
356
+ size_t new_len = end - start + 1;
357
+ memmove(id, start, new_len);
358
+ id[new_len] = '\0';
359
+ } else if (end < write - 1) {
360
+ *(end + 1) = '\0';
361
+ }
362
+ } else if (format == APEX_ID_FORMAT_KRAMDOWN) {
363
+ /* Kramdown: trim only leading dashes, preserve trailing */
364
+ char *start = id;
365
+ while (*start == '-') start++;
366
+
367
+ if (start > id) {
368
+ size_t new_len = write - start;
369
+ memmove(id, start, new_len);
370
+ id[new_len] = '\0';
371
+ }
372
+ }
373
+ /* MMD format: preserve leading/trailing dashes */
374
+
375
+ /* If result is empty, use "header" */
376
+ if (strlen(id) == 0) {
377
+ free(id);
378
+ return strdup("header");
379
+ }
380
+
381
+ return id;
382
+ }
383
+
384
+ /**
385
+ * Extract text content from a heading node
386
+ */
387
+ char *apex_extract_heading_text(cmark_node *heading_node) {
388
+ if (!heading_node || cmark_node_get_type(heading_node) != CMARK_NODE_HEADING) {
389
+ return strdup("");
390
+ }
391
+
392
+ /* Walk children and collect text */
393
+ size_t capacity = 256;
394
+ char *text = malloc(capacity);
395
+ if (!text) return strdup("");
396
+
397
+ char *write = text;
398
+ size_t remaining = capacity;
399
+
400
+ cmark_node *child = cmark_node_first_child(heading_node);
401
+ while (child) {
402
+ cmark_node_type type = cmark_node_get_type(child);
403
+
404
+ if (type == CMARK_NODE_TEXT) {
405
+ const char *literal = cmark_node_get_literal(child);
406
+ if (literal) {
407
+ size_t len = strlen(literal);
408
+ if (len >= remaining) {
409
+ size_t new_capacity = capacity * 2;
410
+ char *new_text = realloc(text, new_capacity);
411
+ if (!new_text) {
412
+ free(text);
413
+ return strdup("");
414
+ }
415
+ write = new_text + (write - text);
416
+ text = new_text;
417
+ remaining = new_capacity - (write - text);
418
+ }
419
+ memcpy(write, literal, len);
420
+ write += len;
421
+ remaining -= len;
422
+ }
423
+ } else if (type == CMARK_NODE_CODE) {
424
+ const char *literal = cmark_node_get_literal(child);
425
+ if (literal) {
426
+ size_t len = strlen(literal);
427
+ if (len >= remaining) {
428
+ size_t new_capacity = capacity * 2;
429
+ char *new_text = realloc(text, new_capacity);
430
+ if (!new_text) {
431
+ free(text);
432
+ return strdup("");
433
+ }
434
+ write = new_text + (write - text);
435
+ text = new_text;
436
+ remaining = new_capacity - (write - text);
437
+ }
438
+ memcpy(write, literal, len);
439
+ write += len;
440
+ remaining -= len;
441
+ }
442
+ }
443
+ /* Skip other inline elements for ID generation */
444
+
445
+ child = cmark_node_next(child);
446
+ }
447
+
448
+ *write = '\0';
449
+ return text;
450
+ }
451
+
452
+ /**
453
+ * Extract manual header ID from heading text
454
+ * Supports:
455
+ * - MultiMarkdown: "Heading [id]" -> returns "id", removes "[id]" from text
456
+ * - Kramdown: "Heading {#id}" -> returns "id", removes "{#id}" from text
457
+ *
458
+ * Note: IAL format "Heading {: #id}" is handled separately by IAL processor
459
+ *
460
+ * @param heading_text Heading text (will be modified to remove ID syntax)
461
+ * @param manual_id_out Output parameter for extracted ID (must be freed by caller)
462
+ * @return true if manual ID was found and extracted
463
+ */
464
+ bool apex_extract_manual_header_id(char **heading_text, char **manual_id_out) {
465
+ if (!heading_text || !*heading_text || !manual_id_out) {
466
+ return false;
467
+ }
468
+
469
+ char *text = *heading_text;
470
+ size_t len = strlen(text);
471
+ if (len == 0) return false;
472
+
473
+ /* Try MultiMarkdown format: [id] at the end */
474
+ const char *mmd_start = strrchr(text, '[');
475
+ if (mmd_start) {
476
+ const char *mmd_end = strchr(mmd_start, ']');
477
+ if (mmd_end && mmd_end > mmd_start + 1) {
478
+ /* Skip if content starts with % (metadata variable like [%title]) */
479
+ if (mmd_start[1] == '%') {
480
+ /* This is a metadata variable, not a header ID */
481
+ mmd_start = NULL;
482
+ }
483
+ }
484
+ if (mmd_start && mmd_end && mmd_end > mmd_start + 1) {
485
+ /* Check nothing after ] except whitespace */
486
+ const char *after = mmd_end + 1;
487
+ while (*after && isspace((unsigned char)*after)) after++;
488
+ if (*after == '\0') {
489
+ /* Extract ID */
490
+ size_t id_len = mmd_end - mmd_start - 1;
491
+ if (id_len > 0) {
492
+ *manual_id_out = malloc(id_len + 1);
493
+ if (*manual_id_out) {
494
+ memcpy(*manual_id_out, mmd_start + 1, id_len);
495
+ (*manual_id_out)[id_len] = '\0';
496
+
497
+ /* Remove [id] from text */
498
+ size_t prefix_len = mmd_start - text;
499
+ char *new_text = malloc(prefix_len + 1);
500
+ if (new_text) {
501
+ memcpy(new_text, text, prefix_len);
502
+ new_text[prefix_len] = '\0';
503
+
504
+ /* Trim trailing whitespace */
505
+ char *end = new_text + prefix_len - 1;
506
+ while (end >= new_text && isspace((unsigned char)*end)) *end-- = '\0';
507
+
508
+ free(*heading_text);
509
+ *heading_text = new_text;
510
+ return true;
511
+ } else {
512
+ free(*manual_id_out);
513
+ *manual_id_out = NULL;
514
+ }
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+
521
+ /* Try Kramdown format: {#id} at the end */
522
+ const char *kramdown_start = strrchr(text, '{');
523
+ if (kramdown_start && kramdown_start[1] == '#') {
524
+ const char *kramdown_end = strchr(kramdown_start, '}');
525
+ if (kramdown_end && kramdown_end > kramdown_start + 2) {
526
+ /* Check nothing after } except whitespace */
527
+ const char *after = kramdown_end + 1;
528
+ while (*after && isspace((unsigned char)*after)) after++;
529
+ if (*after == '\0') {
530
+ /* Extract ID */
531
+ size_t id_len = kramdown_end - kramdown_start - 2; /* Skip {# */
532
+ if (id_len > 0) {
533
+ *manual_id_out = malloc(id_len + 1);
534
+ if (*manual_id_out) {
535
+ memcpy(*manual_id_out, kramdown_start + 2, id_len);
536
+ (*manual_id_out)[id_len] = '\0';
537
+
538
+ /* Remove {#id} from text */
539
+ size_t prefix_len = kramdown_start - text;
540
+ char *new_text = malloc(prefix_len + 1);
541
+ if (new_text) {
542
+ memcpy(new_text, text, prefix_len);
543
+ new_text[prefix_len] = '\0';
544
+
545
+ /* Trim trailing whitespace */
546
+ char *end = new_text + prefix_len - 1;
547
+ while (end >= new_text && isspace((unsigned char)*end)) *end-- = '\0';
548
+
549
+ free(*heading_text);
550
+ *heading_text = new_text;
551
+ return true;
552
+ } else {
553
+ free(*manual_id_out);
554
+ *manual_id_out = NULL;
555
+ }
556
+ }
557
+ }
558
+ }
559
+ }
560
+ }
561
+
562
+ return false;
563
+ }
564
+
565
+ /**
566
+ * Process manual header IDs in a heading node
567
+ * Extracts MMD [id] or Kramdown {#id} syntax and stores ID in user_data
568
+ * Updates the heading text node to remove the manual ID syntax
569
+ */
570
+ bool apex_process_manual_header_id(cmark_node *heading_node) {
571
+ if (!heading_node || cmark_node_get_type(heading_node) != CMARK_NODE_HEADING) {
572
+ return false;
573
+ }
574
+
575
+ /* Get the text node inside the heading */
576
+ cmark_node *text_node = cmark_node_first_child(heading_node);
577
+ if (!text_node || cmark_node_get_type(text_node) != CMARK_NODE_TEXT) {
578
+ return false;
579
+ }
580
+
581
+ const char *text = cmark_node_get_literal(text_node);
582
+ if (!text) return false;
583
+
584
+ /* Extract text and try to find manual ID */
585
+ char *text_copy = strdup(text);
586
+ if (!text_copy) return false;
587
+
588
+ char *manual_id = NULL;
589
+ bool found = apex_extract_manual_header_id(&text_copy, &manual_id);
590
+
591
+ if (found && manual_id) {
592
+ /* Store ID in user_data as id="..." */
593
+ char *id_attr = malloc(strlen(manual_id) + 6); /* id="" + null */
594
+ if (id_attr) {
595
+ sprintf(id_attr, "id=\"%s\"", manual_id);
596
+
597
+ /* Merge with existing user_data if present */
598
+ char *existing = (char *)cmark_node_get_user_data(heading_node);
599
+ if (existing) {
600
+ /* Append to existing */
601
+ char *combined = malloc(strlen(existing) + strlen(id_attr) + 2); /* + space + null */
602
+ if (combined) {
603
+ sprintf(combined, "%s %s", existing, id_attr);
604
+ cmark_node_set_user_data(heading_node, combined);
605
+ free(id_attr);
606
+ } else {
607
+ cmark_node_set_user_data(heading_node, id_attr);
608
+ }
609
+ } else {
610
+ cmark_node_set_user_data(heading_node, id_attr);
611
+ }
612
+ }
613
+
614
+ /* Update the text node to remove manual ID syntax */
615
+ cmark_node_set_literal(text_node, text_copy);
616
+
617
+ free(manual_id);
618
+ free(text_copy);
619
+ return true;
620
+ }
621
+
622
+ free(text_copy);
623
+ if (manual_id) free(manual_id);
624
+ return false;
625
+ }
626
+