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,624 @@
1
+ /**
2
+ * Wiki Links Extension for Apex
3
+ * Implementation
4
+ */
5
+
6
+ #include "wiki_links.h"
7
+ #include <string.h>
8
+ #include <stdlib.h>
9
+ #include <ctype.h>
10
+ #include <stdbool.h>
11
+
12
+ #include "parser.h"
13
+ #include "inlines.h"
14
+ #include "html.h"
15
+
16
+ /* Special inline character for wiki links */
17
+ __attribute__((unused))
18
+ static const char WIKI_OPEN_CHAR = '[';
19
+
20
+ /* Default configuration */
21
+ static wiki_link_config default_config = {
22
+ .base_path = "",
23
+ .extension = "",
24
+ .space_mode = WIKILINK_SPACE_DASH, /* Default: convert spaces to dashes */
25
+ .sanitize = false
26
+ };
27
+
28
+ /**
29
+ * Check if we have a wiki link at the current position
30
+ * Returns the number of characters consumed, or 0 if not a wiki link
31
+ */
32
+ static int scan_wiki_link(const char *input, int len) {
33
+ if (len < 4) return 0; /* Need at least [[x]] */
34
+
35
+ /* Must start with [[ */
36
+ if (input[0] != '[' || input[1] != '[') return 0;
37
+
38
+ /* Find the closing ]] */
39
+ for (int i = 2; i < len - 1; i++) {
40
+ if (input[i] == ']' && input[i + 1] == ']') {
41
+ /* Found closing ]] */
42
+ return i + 2; /* Return position after ]] */
43
+ }
44
+ }
45
+
46
+ return 0; /* No closing ]] found */
47
+ }
48
+
49
+ /**
50
+ * Parse wiki link content
51
+ * Format: PageName or PageName|DisplayText or PageName#Section
52
+ */
53
+ static void parse_wiki_link(const char *content, int len,
54
+ char **page, char **display, char **section) {
55
+ *page = NULL;
56
+ *display = NULL;
57
+ *section = NULL;
58
+
59
+ if (len <= 0) return;
60
+
61
+ /* Copy content for parsing */
62
+ char *text = malloc(len + 1);
63
+ if (!text) return;
64
+ memcpy(text, content, len);
65
+ text[len] = '\0';
66
+
67
+ /* Check for | separator (display text) */
68
+ char *pipe = strchr(text, '|');
69
+ if (pipe) {
70
+ *pipe = '\0';
71
+ *page = strdup(text);
72
+ *display = strdup(pipe + 1);
73
+ } else {
74
+ *page = strdup(text);
75
+ }
76
+
77
+ /* Check for # separator (section) */
78
+ if (*page) {
79
+ char *hash = strchr(*page, '#');
80
+ if (hash) {
81
+ *hash = '\0';
82
+ *section = strdup(hash + 1);
83
+ }
84
+ }
85
+
86
+ free(text);
87
+ }
88
+
89
+ /**
90
+ * Map Latin-1 supplement accented characters (U+00C0 - U+00FF) to ASCII base.
91
+ * Returns the ASCII base letter for accented chars, or 0 if not applicable.
92
+ * The index is the low byte (0x80-0xFF) of the 2-byte UTF-8 sequence 0xC3 0xXX.
93
+ */
94
+ static char latin1_to_ascii(unsigned char low_byte) {
95
+ /* Latin-1 supplement: UTF-8 0xC3 0x80-0xBF maps to U+00C0-U+00FF */
96
+ /* This covers: À-Ö (0x80-0x96), Ø-ö (0x98-0xB6), ø-ÿ (0xB8-0xBF) */
97
+ static const char map[64] = {
98
+ /* À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï */
99
+ 'a', 'a', 'a', 'a', 'a', 'a', 0 , 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
100
+ /* Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß */
101
+ 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , 'o', 'u', 'u', 'u', 'u', 'y', 0 , 0 ,
102
+ /* à á â ã ä å æ ç è é ê ë ì í î ï */
103
+ 'a', 'a', 'a', 'a', 'a', 'a', 0 , 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
104
+ /* ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ */
105
+ 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , 'o', 'u', 'u', 'u', 'u', 'y', 0 , 'y',
106
+ };
107
+ if (low_byte >= 0x80 && low_byte <= 0xBF) {
108
+ return map[low_byte - 0x80];
109
+ }
110
+ return 0;
111
+ }
112
+
113
+ /**
114
+ * Convert page name to URL
115
+ *
116
+ * When sanitize is enabled:
117
+ * - Removes apostrophes
118
+ * - Converts A-Z to a-z
119
+ * - Removes accents from Latin-1 characters (both NFC and NFD forms)
120
+ * - Replaces non-alphanumeric characters with the space_mode character
121
+ * - Removes duplicate space_mode characters
122
+ * - Removes leading and trailing space_mode characters
123
+ */
124
+ static char *page_to_url(const char *page, const char *section, wiki_link_config *config) {
125
+ if (!page) return NULL;
126
+
127
+ /* Default configuration if none provided */
128
+ if (!config) config = &default_config;
129
+
130
+ /* Calculate URL length - worst case: all spaces become dashes/underscores */
131
+ size_t page_len = strlen(page);
132
+ size_t url_len = strlen(config->base_path) + page_len +
133
+ (section ? strlen(section) + 1 : 0) +
134
+ (config->extension ? strlen(config->extension) : 0) + 10;
135
+
136
+ char *url = malloc(url_len);
137
+ if (!url) return NULL;
138
+
139
+ char *p = url;
140
+
141
+ /* Add base path */
142
+ strcpy(p, config->base_path);
143
+ p += strlen(config->base_path);
144
+
145
+ char *page_start = p; /* Remember where page name starts for trailing trim */
146
+
147
+ if (config->sanitize) {
148
+ /* Sanitize in one pass */
149
+ char space_char;
150
+ switch (config->space_mode) {
151
+ case WIKILINK_SPACE_DASH: space_char = '-'; break;
152
+ case WIKILINK_SPACE_NONE: space_char = '\0'; break;
153
+ case WIKILINK_SPACE_UNDERSCORE: space_char = '_'; break;
154
+ case WIKILINK_SPACE_SPACE: space_char = ' '; break;
155
+ default: space_char = '-'; break;
156
+ }
157
+ bool last_was_space_char = true; /* Start true to skip leading space chars */
158
+
159
+ for (const char *s = page; *s; s++) {
160
+ unsigned char c = (unsigned char)*s;
161
+
162
+ /* Remove apostrophes, quotes, and similar punctuation (ASCII and Unicode) */
163
+ if (c == '\'' || c == '"' || c == '`') {
164
+ continue;
165
+ }
166
+ /* Skip acute accent: ´ (U+00B4) = 0xC2 0xB4 */
167
+ if (c == 0xC2 && s[1] && (unsigned char)s[1] == 0xB4) {
168
+ s += 1; /* Skip the 2-byte sequence (loop will advance 1 more) */
169
+ continue;
170
+ }
171
+ /* Skip curly apostrophes and quotes (3-byte UTF-8 sequences starting with 0xE2 0x80):
172
+ * ' (U+2018) = 0xE2 0x80 0x98, ' (U+2019) = 0xE2 0x80 0x99
173
+ * " (U+201C) = 0xE2 0x80 0x9C, " (U+201D) = 0xE2 0x80 0x9D */
174
+ if (c == 0xE2 && s[1] && s[2] &&
175
+ (unsigned char)s[1] == 0x80 &&
176
+ ((unsigned char)s[2] == 0x98 || (unsigned char)s[2] == 0x99 ||
177
+ (unsigned char)s[2] == 0x9C || (unsigned char)s[2] == 0x9D)) {
178
+ s += 2; /* Skip the 3-byte sequence (loop will advance 1 more) */
179
+ continue;
180
+ }
181
+
182
+ /* Handle NFD: Skip combining diacritical marks (U+0300-U+036F).
183
+ * In UTF-8: 0xCC 0x80-0xBF (U+0300-U+033F) and 0xCD 0x80-0xAF (U+0340-U+036F) */
184
+ if (c == 0xCC && s[1] && (unsigned char)s[1] >= 0x80 && (unsigned char)s[1] <= 0xBF) {
185
+ s += 1; /* Skip combining mark */
186
+ continue;
187
+ }
188
+ if (c == 0xCD && s[1] && (unsigned char)s[1] >= 0x80 && (unsigned char)s[1] <= 0xAF) {
189
+ s += 1; /* Skip combining mark */
190
+ continue;
191
+ }
192
+
193
+ /* Handle NFC: Convert Latin-1 supplement accented chars to ASCII base.
194
+ * UTF-8 sequence 0xC3 0x80-0xBF maps to U+00C0-U+00FF */
195
+ if (c == 0xC3 && s[1]) {
196
+ unsigned char next = (unsigned char)s[1];
197
+
198
+ /* Handle ligatures that expand to multiple characters:
199
+ * Æ (U+00C6) = 0xC3 0x86 → "ae"
200
+ * æ (U+00E6) = 0xC3 0xA6 → "ae"
201
+ * ß (U+00DF) = 0xC3 0x9F → "ss"
202
+ * note that the utf-8 encoded latin=-1 ligatures and the two
203
+ * ASCII characters always take up the same number of bytes
204
+ * so there's no risk of buffer overflow */
205
+ if (next == 0x86 || next == 0xA6) {
206
+ s += 1; /* Skip the 2-byte sequence */
207
+ *p++ = 'a';
208
+ *p++ = 'e';
209
+ last_was_space_char = false;
210
+ continue;
211
+ }
212
+ if (next == 0x9F) {
213
+ s += 1; /* Skip the 2-byte sequence */
214
+ *p++ = 's';
215
+ *p++ = 's';
216
+ last_was_space_char = false;
217
+ continue;
218
+ }
219
+
220
+ char base = latin1_to_ascii(next);
221
+ if (base) {
222
+ s += 1; /* Skip the 2-byte sequence (loop advances 1 more) */
223
+ c = (unsigned char)base;
224
+ /* Fall through to normal processing */
225
+ } else {
226
+ /* Unknown Latin-1 char, skip both bytes and treat as space */
227
+ s += 1;
228
+ if (space_char != '\0' && !last_was_space_char) {
229
+ *p++ = space_char;
230
+ last_was_space_char = true;
231
+ }
232
+ continue;
233
+ }
234
+ }
235
+
236
+ /* Lowercase A-Z */
237
+ if (c >= 'A' && c <= 'Z') {
238
+ c = (unsigned char)(c + ('a' - 'A'));
239
+ }
240
+
241
+ /* Replace non-alphanumeric with space_mode char (except / and .) */
242
+ if (!isalnum(c) && c != '/' && c != '.') {
243
+ if (space_char == '\0') {
244
+ /* WIKILINK_SPACE_NONE: skip non-alphanumeric entirely */
245
+ continue;
246
+ }
247
+ c = space_char;
248
+ }
249
+
250
+ /* Remove duplicate space_mode characters */
251
+ if (space_char != '\0' && c == space_char) {
252
+ if (last_was_space_char) {
253
+ continue; /* Skip duplicate */
254
+ }
255
+ last_was_space_char = true;
256
+ } else {
257
+ last_was_space_char = false;
258
+ }
259
+
260
+ *p++ = c;
261
+ }
262
+
263
+ /* Remove trailing space_mode character */
264
+ if (space_char != '\0' && p > page_start && *(p - 1) == space_char) {
265
+ p--;
266
+ }
267
+ } else {
268
+ /* basic behavior: only handle spaces */
269
+ for (const char *s = page; *s; s++) {
270
+ if (*s == ' ') {
271
+ switch (config->space_mode) {
272
+ case WIKILINK_SPACE_DASH:
273
+ *p++ = '-';
274
+ break;
275
+ case WIKILINK_SPACE_NONE:
276
+ /* Skip space - don't add anything */
277
+ break;
278
+ case WIKILINK_SPACE_UNDERSCORE:
279
+ *p++ = '_';
280
+ break;
281
+ case WIKILINK_SPACE_SPACE:
282
+ *p++ = ' ';
283
+ break;
284
+ }
285
+ } else {
286
+ *p++ = *s;
287
+ }
288
+ }
289
+ }
290
+
291
+ /* Add extension (with leading dot if provided) */
292
+ if (config->extension && config->extension[0] != '\0') {
293
+ /* If extension doesn't start with dot, add one */
294
+ if (config->extension[0] != '.') {
295
+ *p++ = '.';
296
+ }
297
+ strcpy(p, config->extension);
298
+ p += strlen(config->extension);
299
+ }
300
+
301
+ /* Add section anchor */
302
+ if (section) {
303
+ *p++ = '#';
304
+ strcpy(p, section);
305
+ } else {
306
+ *p = '\0';
307
+ }
308
+
309
+ return url;
310
+ }
311
+
312
+ /**
313
+ * Match function - called when we encounter [
314
+ * Need to check for [[ specifically to avoid conflicting with standard markdown links
315
+ */
316
+ __attribute__((unused))
317
+ static cmark_node *match_wiki_link(cmark_syntax_extension *self,
318
+ cmark_parser *parser,
319
+ cmark_node *parent,
320
+ unsigned char character,
321
+ cmark_inline_parser *inline_parser) {
322
+ (void)self;
323
+ (void)parent;
324
+ if (character != '[') return NULL;
325
+
326
+ /* Get current position and remaining input */
327
+ int pos = cmark_inline_parser_get_offset(inline_parser);
328
+ cmark_chunk *chunk = cmark_inline_parser_get_chunk(inline_parser);
329
+
330
+ if (pos >= chunk->len) return NULL;
331
+
332
+ const char *input = (const char *)chunk->data + pos;
333
+ int remaining = chunk->len - pos;
334
+
335
+ /* CRITICAL: Must check for [[ to distinguish from regular markdown links [text](url) */
336
+ if (remaining < 2 || input[0] != '[' || input[1] != '[') {
337
+ return NULL; /* Not a wiki link, let standard link parser handle it */
338
+ }
339
+
340
+ /* Check if this is a wiki link */
341
+ int consumed = scan_wiki_link(input, remaining);
342
+ if (consumed == 0) return NULL;
343
+
344
+ /* Extract the content between [[ and ]] */
345
+ const char *content = input + 2; /* Skip [[ */
346
+ int content_len = consumed - 4; /* Remove [[ and ]] */
347
+
348
+ if (content_len <= 0) return NULL;
349
+
350
+ /* Parse the wiki link */
351
+ char *page = NULL;
352
+ char *display = NULL;
353
+ char *section = NULL;
354
+ parse_wiki_link(content, content_len, &page, &display, &section);
355
+
356
+ if (!page) return NULL;
357
+
358
+ /* Get configuration */
359
+ wiki_link_config *config = (wiki_link_config *)cmark_syntax_extension_get_private(self);
360
+ if (!config) config = &default_config;
361
+
362
+ /* Create URL */
363
+ char *url = page_to_url(page, section, config);
364
+ if (!url) {
365
+ free(page);
366
+ free(display);
367
+ free(section);
368
+ return NULL;
369
+ }
370
+
371
+ /* Create link node using parser memory */
372
+ cmark_node *link = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem);
373
+ cmark_node_set_url(link, url);
374
+
375
+ /* Create text node for display */
376
+ cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem);
377
+ const char *link_text = display ? display : page;
378
+ cmark_node_set_literal(text, link_text);
379
+
380
+ /* Add text as child of link */
381
+ cmark_node_append_child(link, text);
382
+
383
+ /* Set line/column info */
384
+ link->start_line = text->start_line =
385
+ link->end_line = text->end_line = cmark_inline_parser_get_line(inline_parser);
386
+ link->start_column = text->start_column = cmark_inline_parser_get_column(inline_parser) - 1;
387
+ link->end_column = text->end_column = cmark_inline_parser_get_column(inline_parser) + consumed - 1;
388
+
389
+ /* Advance the parser by setting new offset */
390
+ cmark_inline_parser_set_offset(inline_parser, pos + consumed);
391
+
392
+ /* Clean up */
393
+ free(page);
394
+ free(display);
395
+ free(section);
396
+ free(url);
397
+
398
+ return link;
399
+ }
400
+
401
+ /**
402
+ * Set wiki link configuration
403
+ */
404
+ void wiki_links_set_config(cmark_syntax_extension *ext, wiki_link_config *config) {
405
+ if (ext && config) {
406
+ cmark_syntax_extension_set_private(ext, config, NULL);
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Process wiki links in text nodes via AST walking (postprocessing approach)
412
+ * This avoids conflicts with standard markdown link syntax
413
+ */
414
+ void apex_process_wiki_links_in_tree(cmark_node *node, wiki_link_config *config) {
415
+ if (!node) return;
416
+
417
+ /* Process current node if it's text */
418
+ if (cmark_node_get_type(node) == CMARK_NODE_TEXT) {
419
+ const char *literal = cmark_node_get_literal(node);
420
+ if (!literal) goto recurse;
421
+
422
+ /* Fast path: no wiki markers present */
423
+ const char *first_marker = strstr(literal, "[[");
424
+ if (!first_marker) goto recurse;
425
+
426
+ /* Default configuration if none provided */
427
+ if (!config) config = &default_config;
428
+
429
+ /* Rebuild this text node in a single pass to avoid repeated rescans */
430
+ const char *cursor = literal;
431
+ cmark_node *insert_after = NULL;
432
+ bool changed = false;
433
+
434
+ while (1) {
435
+ const char *open = strstr(cursor, "[[");
436
+ if (!open) {
437
+ /* Append any trailing text */
438
+ size_t tail_len = strlen(cursor);
439
+ if (tail_len > 0) {
440
+ char *tail = malloc(tail_len + 1);
441
+ if (tail) {
442
+ memcpy(tail, cursor, tail_len);
443
+ tail[tail_len] = '\0';
444
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
445
+ cmark_node_set_literal(text, tail);
446
+ free(tail);
447
+ if (!insert_after) {
448
+ cmark_node_insert_before(node, text);
449
+ } else {
450
+ cmark_node_insert_after(insert_after, text);
451
+ }
452
+ insert_after = text;
453
+ changed = true;
454
+ }
455
+ }
456
+ break;
457
+ }
458
+
459
+ /* Copy text preceding the wiki link */
460
+ size_t prefix_len = (size_t)(open - cursor);
461
+ if (prefix_len > 0) {
462
+ char *prefix = malloc(prefix_len + 1);
463
+ if (prefix) {
464
+ memcpy(prefix, cursor, prefix_len);
465
+ prefix[prefix_len] = '\0';
466
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
467
+ cmark_node_set_literal(text, prefix);
468
+ free(prefix);
469
+ if (!insert_after) {
470
+ cmark_node_insert_before(node, text);
471
+ } else {
472
+ cmark_node_insert_after(insert_after, text);
473
+ }
474
+ insert_after = text;
475
+ changed = true;
476
+ }
477
+ }
478
+
479
+ /* Look for closing marker after [[ */
480
+ const char *close = strstr(open + 2, "]]");
481
+ if (!close) {
482
+ /* No closing marker - treat the rest as plain text */
483
+ size_t remaining_len = strlen(open);
484
+ char *remaining = malloc(remaining_len + 1);
485
+ if (remaining) {
486
+ memcpy(remaining, open, remaining_len);
487
+ remaining[remaining_len] = '\0';
488
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
489
+ cmark_node_set_literal(text, remaining);
490
+ free(remaining);
491
+ if (!insert_after) {
492
+ cmark_node_insert_before(node, text);
493
+ } else {
494
+ cmark_node_insert_after(insert_after, text);
495
+ }
496
+ insert_after = text;
497
+ changed = true;
498
+ }
499
+ break;
500
+ }
501
+
502
+ size_t content_len = (size_t)(close - (open + 2));
503
+
504
+ /* If empty content, keep literal text and continue */
505
+ if (content_len == 0) {
506
+ size_t raw_len = (size_t)((close + 2) - open);
507
+ char *raw = malloc(raw_len + 1);
508
+ if (raw) {
509
+ memcpy(raw, open, raw_len);
510
+ raw[raw_len] = '\0';
511
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
512
+ cmark_node_set_literal(text, raw);
513
+ free(raw);
514
+ if (!insert_after) {
515
+ cmark_node_insert_before(node, text);
516
+ } else {
517
+ cmark_node_insert_after(insert_after, text);
518
+ }
519
+ insert_after = text;
520
+ changed = true;
521
+ }
522
+ cursor = close + 2;
523
+ continue;
524
+ }
525
+
526
+ /* Parse wiki link content */
527
+ char *page = NULL;
528
+ char *display = NULL;
529
+ char *section = NULL;
530
+ parse_wiki_link(open + 2, (int)content_len, &page, &display, &section);
531
+
532
+ if (page) {
533
+ char *url = page_to_url(page, section, config);
534
+ if (url) {
535
+ cmark_node *link = cmark_node_new(CMARK_NODE_LINK);
536
+ cmark_node_set_url(link, url);
537
+
538
+ cmark_node *link_text = cmark_node_new(CMARK_NODE_TEXT);
539
+ cmark_node_set_literal(link_text, display ? display : page);
540
+ cmark_node_append_child(link, link_text);
541
+
542
+ if (!insert_after) {
543
+ cmark_node_insert_before(node, link);
544
+ } else {
545
+ cmark_node_insert_after(insert_after, link);
546
+ }
547
+ insert_after = link;
548
+ changed = true;
549
+ free(url);
550
+ } else {
551
+ /* Fallback: keep literal text if URL creation fails */
552
+ size_t raw_len = (size_t)((close + 2) - open);
553
+ char *raw = malloc(raw_len + 1);
554
+ if (raw) {
555
+ memcpy(raw, open, raw_len);
556
+ raw[raw_len] = '\0';
557
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
558
+ cmark_node_set_literal(text, raw);
559
+ free(raw);
560
+ if (!insert_after) {
561
+ cmark_node_insert_before(node, text);
562
+ } else {
563
+ cmark_node_insert_after(insert_after, text);
564
+ }
565
+ insert_after = text;
566
+ changed = true;
567
+ }
568
+ }
569
+ } else {
570
+ /* Fallback: keep literal text if parsing fails */
571
+ size_t raw_len = (size_t)((close + 2) - open);
572
+ char *raw = malloc(raw_len + 1);
573
+ if (raw) {
574
+ memcpy(raw, open, raw_len);
575
+ raw[raw_len] = '\0';
576
+ cmark_node *text = cmark_node_new(CMARK_NODE_TEXT);
577
+ cmark_node_set_literal(text, raw);
578
+ free(raw);
579
+ if (!insert_after) {
580
+ cmark_node_insert_before(node, text);
581
+ } else {
582
+ cmark_node_insert_after(insert_after, text);
583
+ }
584
+ insert_after = text;
585
+ changed = true;
586
+ }
587
+ }
588
+
589
+ free(page);
590
+ free(display);
591
+ free(section);
592
+
593
+ /* Move past the current wiki link */
594
+ cursor = close + 2;
595
+ }
596
+
597
+ if (changed) {
598
+ /* Remove the original text node after rebuilding */
599
+ /* Unlink the node first, then free it. Since we're returning immediately
600
+ * and the parent iteration already has the next sibling, this is safe. */
601
+ cmark_node_unlink(node);
602
+ cmark_node_free(node);
603
+ return; /* Don't recurse into children after modifying tree */
604
+ }
605
+ }
606
+
607
+ recurse:
608
+ /* Recursively process children */
609
+ /* Get next sibling before processing to avoid issues if child modifies/frees tree */
610
+ for (cmark_node *child = cmark_node_first_child(node); child; ) {
611
+ cmark_node *next = cmark_node_next(child);
612
+ apex_process_wiki_links_in_tree(child, config);
613
+ child = next;
614
+ }
615
+ }
616
+
617
+ /**
618
+ * Create the wiki links extension (simplified - actual processing done via postprocessing)
619
+ */
620
+ cmark_syntax_extension *create_wiki_links_extension(void) {
621
+ /* Return NULL - we handle wiki links via postprocessing now */
622
+ return NULL;
623
+ }
624
+
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Wiki Links Extension for Apex
3
+ *
4
+ * Supports wiki-style link syntax:
5
+ * [[Page Name]] -> link to page
6
+ * [[Page Name|Display Text]] -> link with custom text
7
+ * [[Page Name#Section]] -> link to section
8
+ */
9
+
10
+ #ifndef APEX_WIKI_LINKS_H
11
+ #define APEX_WIKI_LINKS_H
12
+
13
+ #include <stdbool.h>
14
+ #include "cmark-gfm.h"
15
+ #include "cmark-gfm-extension_api.h"
16
+
17
+ #ifdef __cplusplus
18
+ extern "C" {
19
+ #endif
20
+
21
+ /* Space replacement modes for wiki links */
22
+ typedef enum {
23
+ WIKILINK_SPACE_DASH = 0, /* Convert spaces to dashes: "Home Page" -> "Home-Page" */
24
+ WIKILINK_SPACE_NONE = 1, /* Remove spaces: "Home Page" -> "HomePage" */
25
+ WIKILINK_SPACE_UNDERSCORE = 2, /* Convert spaces to underscores: "Home Page" -> "Home_Page" */
26
+ WIKILINK_SPACE_SPACE = 3 /* Keep spaces: "Home Page" -> "Home Page" */
27
+ } wikilink_space_mode_t;
28
+
29
+ /* Configuration for wiki link behavior */
30
+ typedef struct {
31
+ const char *base_path; /* Base path for wiki links (e.g., "/wiki/") */
32
+ const char *extension; /* File extension to append (e.g., ".html") */
33
+ wikilink_space_mode_t space_mode; /* How to handle spaces in page names */
34
+ bool sanitize; /* Enable URL sanitization */
35
+ } wiki_link_config;
36
+
37
+ /**
38
+ * Create and return the wiki links extension (returns NULL - uses postprocessing)
39
+ */
40
+ cmark_syntax_extension *create_wiki_links_extension(void);
41
+
42
+ /**
43
+ * Set wiki link configuration for an extension
44
+ */
45
+ void wiki_links_set_config(cmark_syntax_extension *ext, wiki_link_config *config);
46
+
47
+ /**
48
+ * Process wiki links in an AST via postprocessing
49
+ * Call this after parsing but before rendering
50
+ */
51
+ void apex_process_wiki_links_in_tree(cmark_node *document, wiki_link_config *config);
52
+
53
+ #ifdef __cplusplus
54
+ }
55
+ #endif
56
+
57
+ #endif /* APEX_WIKI_LINKS_H */
58
+