apex-ruby 1.0.30 → 1.0.31

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 (490) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -8
  3. data/apex-ruby.gemspec +14 -3
  4. data/ext/apex_ext/apex_src/include/apex/apex.h +11 -2
  5. data/ext/apex_ext/apex_src/src/apex.c +64 -5
  6. data/ext/apex_ext/apex_src/src/ast_terminal.c +2 -4
  7. data/ext/apex_ext/apex_src/src/extensions/callouts.c +103 -63
  8. data/ext/apex_ext/apex_src/src/extensions/callouts.h +3 -2
  9. data/ext/apex_ext/apex_src/src/extensions/citations.c +15 -2
  10. data/ext/apex_ext/apex_src/src/extensions/emoji.c +73 -7
  11. data/ext/apex_ext/apex_src/src/extensions/html_markdown.c +25 -4
  12. data/ext/apex_ext/apex_src/src/extensions/html_markdown.h +4 -1
  13. data/ext/apex_ext/apex_src/src/extensions/insert.c +49 -0
  14. data/ext/apex_ext/apex_src/src/extensions/metadata.c +275 -55
  15. data/ext/apex_ext/apex_src/src/extensions/metadata.h +9 -0
  16. data/ext/apex_ext/apex_src/src/extensions/relaxed_tables.c +172 -254
  17. data/ext/apex_ext/apex_src/src/extensions/table_html_postprocess.c +36 -127
  18. data/ext/apex_ext/apex_src/src/html_renderer.c +99 -157
  19. data/ext/apex_ext/extconf.rb +31 -79
  20. data/lib/apex/version.rb +1 -1
  21. metadata +1 -470
  22. data/ext/apex_ext/apex_src/AGENTS.md +0 -41
  23. data/ext/apex_ext/apex_src/BENCHMARK.md +0 -32
  24. data/ext/apex_ext/apex_src/BENCHMARK_COMPARISON.md +0 -67
  25. data/ext/apex_ext/apex_src/CHANGELOG.md +0 -3373
  26. data/ext/apex_ext/apex_src/CMakeLists.txt +0 -481
  27. data/ext/apex_ext/apex_src/Dockerfile.linux-build +0 -15
  28. data/ext/apex_ext/apex_src/Formula/apex.rb +0 -43
  29. data/ext/apex_ext/apex_src/Info.plist.in +0 -27
  30. data/ext/apex_ext/apex_src/Package.swift +0 -192
  31. data/ext/apex_ext/apex_src/PackageSupport/README.md +0 -17
  32. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark_gfm_spm_stub.c +0 -4
  33. data/ext/apex_ext/apex_src/README.md +0 -536
  34. data/ext/apex_ext/apex_src/ROADMAP.md +0 -5
  35. data/ext/apex_ext/apex_src/VERSION +0 -1
  36. data/ext/apex_ext/apex_src/apex-debug.log +0 -4
  37. data/ext/apex_ext/apex_src/apex-header-2-rb@2x.webp +0 -0
  38. data/ext/apex_ext/apex_src/apex-plugins.json.example +0 -20
  39. data/ext/apex_ext/apex_src/apex.code-workspace +0 -38
  40. data/ext/apex_ext/apex_src/apex.pc.in +0 -11
  41. data/ext/apex_ext/apex_src/apex.taskpaper +0 -12
  42. data/ext/apex_ext/apex_src/apex_deflist_debug.log +0 -25
  43. data/ext/apex_ext/apex_src/buildnotes.md +0 -1435
  44. data/ext/apex_ext/apex_src/cli/main.c +0 -4588
  45. data/ext/apex_ext/apex_src/debug.log +0 -7
  46. data/ext/apex_ext/apex_src/debug_test.sh +0 -22
  47. data/ext/apex_ext/apex_src/docs/API_REFERENCE.md +0 -451
  48. data/ext/apex_ext/apex_src/docs/ARCHITECTURE.md +0 -166
  49. data/ext/apex_ext/apex_src/docs/CITATIONS_EXAMPLES.md +0 -274
  50. data/ext/apex_ext/apex_src/docs/CITATIONS_IMPLEMENTATION_PLAN.md +0 -749
  51. data/ext/apex_ext/apex_src/docs/CITATIONS_PLAN.md +0 -744
  52. data/ext/apex_ext/apex_src/docs/CMARK_INTEGRATION.md +0 -220
  53. data/ext/apex_ext/apex_src/docs/CRITICMARKUP.md +0 -501
  54. data/ext/apex_ext/apex_src/docs/DEBUGGING.md +0 -73
  55. data/ext/apex_ext/apex_src/docs/FINAL_STATUS.md +0 -391
  56. data/ext/apex_ext/apex_src/docs/FINAL_STATUS_UPDATE.md +0 -237
  57. data/ext/apex_ext/apex_src/docs/IAL_FEATURES.md +0 -210
  58. data/ext/apex_ext/apex_src/docs/IAL_STATUS.md +0 -344
  59. data/ext/apex_ext/apex_src/docs/INDEX_IMPLEMENTATION_ANALYSIS.md +0 -382
  60. data/ext/apex_ext/apex_src/docs/INTEGRATION_EXAMPLE.m +0 -144
  61. data/ext/apex_ext/apex_src/docs/LIMITATIONS_RESOLVED.md +0 -278
  62. data/ext/apex_ext/apex_src/docs/OUTPUT_MODES.md +0 -321
  63. data/ext/apex_ext/apex_src/docs/PROGRESS.md +0 -167
  64. data/ext/apex_ext/apex_src/docs/STANDALONE_FEATURE.md +0 -174
  65. data/ext/apex_ext/apex_src/docs/TABLE_SPANS_STATUS.md +0 -243
  66. data/ext/apex_ext/apex_src/docs/TEST_COVERAGE.md +0 -316
  67. data/ext/apex_ext/apex_src/docs/USER_GUIDE.md +0 -803
  68. data/ext/apex_ext/apex_src/docs/WIKI_LINKS_ISSUE.md +0 -91
  69. data/ext/apex_ext/apex_src/docs/index.md +0 -459
  70. data/ext/apex_ext/apex_src/docs/plans/2025-02-27-man-page-output-implementation.md +0 -351
  71. data/ext/apex_ext/apex_src/docs/superpowers/plans/2026-07-12-toc-output-format.md +0 -745
  72. data/ext/apex_ext/apex_src/docs/superpowers/plans/2026-07-18-bear-image-attributes.md +0 -829
  73. data/ext/apex_ext/apex_src/docs/superpowers/plans/2026-07-19-apex-node-npm.md +0 -1148
  74. data/ext/apex_ext/apex_src/docs/superpowers/specs/2026-07-12-toc-output-format-design.md +0 -161
  75. data/ext/apex_ext/apex_src/docs/superpowers/specs/2026-07-18-bear-image-attributes-design.md +0 -184
  76. data/ext/apex_ext/apex_src/docs/superpowers/specs/2026-07-19-apex-node-npm-design.md +0 -211
  77. data/ext/apex_ext/apex_src/documentation/README.md +0 -160
  78. data/ext/apex_ext/apex_src/documentation/app-settings-table.md +0 -67
  79. data/ext/apex_ext/apex_src/documentation/app-transformed/Citations.md +0 -340
  80. data/ext/apex_ext/apex_src/documentation/app-transformed/Credits.md +0 -11
  81. data/ext/apex_ext/apex_src/documentation/app-transformed/Header-IDs.md +0 -234
  82. data/ext/apex_ext/apex_src/documentation/app-transformed/Inline-Attribute-Lists.md +0 -516
  83. data/ext/apex_ext/apex_src/documentation/app-transformed/Metadata-Transforms.md +0 -461
  84. data/ext/apex_ext/apex_src/documentation/app-transformed/Modes.md +0 -193
  85. data/ext/apex_ext/apex_src/documentation/app-transformed/Multi-File-Documents.md +0 -201
  86. data/ext/apex_ext/apex_src/documentation/app-transformed/Plugins.md +0 -678
  87. data/ext/apex_ext/apex_src/documentation/app-transformed/Syntax.md +0 -1367
  88. data/ext/apex_ext/apex_src/documentation/docsets/Apex Command Line Options.cheatsheet.txt +0 -371
  89. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Info.plist +0 -24
  90. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/C-API.html +0 -2211
  91. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Callouts.html +0 -1194
  92. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Citations.html +0 -1620
  93. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Command-Line-Options.html +0 -6024
  94. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Configuration.html +0 -1877
  95. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Credits.html +0 -1040
  96. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Examples.html +0 -1402
  97. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Filters.html +0 -1656
  98. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Generating-Man-Pages.html +0 -1226
  99. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Getting-Started.html +0 -1148
  100. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Header-IDs.html +0 -1478
  101. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Home.html +0 -1225
  102. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Indices.html +0 -2327
  103. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Inline-Attribute-Lists.html +0 -2041
  104. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Installation.html +0 -1314
  105. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Limitations-and-Roadmap.html +0 -1868
  106. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Metadata-Transforms.html +0 -1731
  107. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Modes.html +0 -2242
  108. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Multi-File-Documents.html +0 -1533
  109. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Multi-Format-Images.html +0 -1362
  110. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Pandoc-Integration.html +0 -1338
  111. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Plugins.html +0 -3188
  112. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Quarto-Mode.html +0 -1405
  113. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Rendering-Markdown-In-Terminal.html +0 -1902
  114. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Syntax.html +0 -4222
  115. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Tables.html +0 -1781
  116. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Troubleshooting.html +0 -1629
  117. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Usage.html +0 -1394
  118. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Using-Apex-with-Jekyll.html +0 -1132
  119. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Writing-Tests.html +0 -1754
  120. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Xcode-Integration.html +0 -2562
  121. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/docSet.dsidx +0 -0
  122. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  123. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Info.plist +0 -22
  124. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans.woff +0 -0
  125. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold.woff +0 -0
  126. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold_Italic.woff +0 -0
  127. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold.woff +0 -0
  128. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold_Italic.woff +0 -0
  129. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Italic.woff +0 -0
  130. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold.woff +0 -0
  131. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold_Italic.woff +0 -0
  132. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/index.html +0 -914
  133. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/style.css +0 -399
  134. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/docSet.dsidx +0 -0
  135. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  136. data/ext/apex_ext/apex_src/documentation/generate_app_docs.rb +0 -772
  137. data/ext/apex_ext/apex_src/documentation/generate_app_docs_ai.rb +0 -678
  138. data/ext/apex_ext/apex_src/documentation/generate_docset.rb +0 -873
  139. data/ext/apex_ext/apex_src/documentation/generate_single_html.rb +0 -733
  140. data/ext/apex_ext/apex_src/documentation/html/apex-app-docs.html +0 -8746
  141. data/ext/apex_ext/apex_src/documentation/html/apex-docs.html +0 -17073
  142. data/ext/apex_ext/apex_src/documentation/shared_scripts.js +0 -64
  143. data/ext/apex_ext/apex_src/documentation/shared_styles.css +0 -651
  144. data/ext/apex_ext/apex_src/documentation/transform_for_app.example.md +0 -260
  145. data/ext/apex_ext/apex_src/documentation/transform_for_app.md +0 -55
  146. data/ext/apex_ext/apex_src/escaping-repro.md +0 -103
  147. data/ext/apex_ext/apex_src/examples/bracketed_spans_demo.md +0 -119
  148. data/ext/apex_ext/apex_src/examples/emoji_span_plugin.yml +0 -11
  149. data/ext/apex_ext/apex_src/examples/example.html +0 -53
  150. data/ext/apex_ext/apex_src/examples/example.md +0 -85
  151. data/ext/apex_ext/apex_src/examples/fenced_divs_demo.md +0 -158
  152. data/ext/apex_ext/apex_src/examples/kbd.md +0 -8
  153. data/ext/apex_ext/apex_src/examples/kbd_plugin.rb +0 -250
  154. data/ext/apex_ext/apex_src/examples/kbd_plugin.yml +0 -9
  155. data/ext/apex_ext/apex_src/examples/quick-actions/Markdown to RTF.workflow/Contents/Info.plist +0 -8
  156. data/ext/apex_ext/apex_src/examples/quick-actions/Markdown to RTF.workflow/Contents/QuickLook/Preview.png +0 -0
  157. data/ext/apex_ext/apex_src/examples/quick-actions/Markdown to RTF.workflow/Contents/document.wflow +0 -547
  158. data/ext/apex_ext/apex_src/examples/quick-actions/Markdown-to-RTF.workflow.zip +0 -0
  159. data/ext/apex_ext/apex_src/examples/quick-actions/README.md +0 -33
  160. data/ext/apex_ext/apex_src/ial.html +0 -24
  161. data/ext/apex_ext/apex_src/icon/apexicon-outline-black.png +0 -0
  162. data/ext/apex_ext/apex_src/icon/apexicon-outline-black@2x.png +0 -0
  163. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark.png +0 -0
  164. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark@2x.png +0 -0
  165. data/ext/apex_ext/apex_src/icon/apexicon-outline-white.png +0 -0
  166. data/ext/apex_ext/apex_src/icon/apexicon-outline-white@2x.png +0 -0
  167. data/ext/apex_ext/apex_src/icon/apexicon.png +0 -0
  168. data/ext/apex_ext/apex_src/icon/apexicon@2x.png +0 -0
  169. data/ext/apex_ext/apex_src/man/apex-config.5 +0 -455
  170. data/ext/apex_ext/apex_src/man/apex-config.5.md +0 -262
  171. data/ext/apex_ext/apex_src/man/apex-plugins.7 +0 -541
  172. data/ext/apex_ext/apex_src/man/apex-plugins.7.md +0 -365
  173. data/ext/apex_ext/apex_src/man/apex.1 +0 -583
  174. data/ext/apex_ext/apex_src/man/apex.1.html +0 -703
  175. data/ext/apex_ext/apex_src/man/apex.1.md +0 -803
  176. data/ext/apex_ext/apex_src/man/apex.1.new +0 -338
  177. data/ext/apex_ext/apex_src/objc/Apex.swift +0 -316
  178. data/ext/apex_ext/apex_src/objc/ApexPlugins.swift +0 -79
  179. data/ext/apex_ext/apex_src/objc/NSString+Apex.h +0 -207
  180. data/ext/apex_ext/apex_src/objc/NSString+Apex.m +0 -584
  181. data/ext/apex_ext/apex_src/objc/NSString+ApexPlugins.h +0 -76
  182. data/ext/apex_ext/apex_src/objc/NSString+ApexPlugins.m +0 -169
  183. data/ext/apex_ext/apex_src/output.html +0 -87
  184. data/ext/apex_ext/apex_src/pages/index.md +0 -459
  185. data/ext/apex_ext/apex_src/plans/quarto-mode.md +0 -442
  186. data/ext/apex_ext/apex_src/src/_README.md +0 -413
  187. data/ext/apex_ext/apex_src/src/extensions/github-emoji.txt +0 -869
  188. data/ext/apex_ext/apex_src/test-linux-build.sh +0 -20
  189. data/ext/apex_ext/apex_src/test.html +0 -103
  190. data/ext/apex_ext/apex_src/test_coverage.sh +0 -121
  191. data/ext/apex_ext/apex_src/test_ial_fenced.md +0 -6
  192. data/ext/apex_ext/apex_src/test_math_norm.py +0 -79
  193. data/ext/apex_ext/apex_src/test_pandoc_output.html +0 -48
  194. data/ext/apex_ext/apex_src/test_spm.sh +0 -107
  195. data/ext/apex_ext/apex_src/tests/ApexSPMTest/main.swift +0 -50
  196. data/ext/apex_ext/apex_src/tests/BENCHMARK_RESULTS.md +0 -229
  197. data/ext/apex_ext/apex_src/tests/CMakeLists.txt +0 -25
  198. data/ext/apex_ext/apex_src/tests/README.md +0 -152
  199. data/ext/apex_ext/apex_src/tests/benchmark.sh +0 -113
  200. data/ext/apex_ext/apex_src/tests/benchmark_comparison.sh +0 -166
  201. data/ext/apex_ext/apex_src/tests/compare_header_ids.sh +0 -31
  202. data/ext/apex_ext/apex_src/tests/fixtures/basic/headers.md +0 -25
  203. data/ext/apex_ext/apex_src/tests/fixtures/basic/list-interruption.md +0 -24
  204. data/ext/apex_ext/apex_src/tests/fixtures/basic/misc_markup.md +0 -33
  205. data/ext/apex_ext/apex_src/tests/fixtures/basic/test_basic.md +0 -26
  206. data/ext/apex_ext/apex_src/tests/fixtures/code/code-blocks.md +0 -260
  207. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/SUMMARY.md +0 -6
  208. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/chapter1.md +0 -7
  209. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/index.txt +0 -9
  210. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/intro.md +0 -5
  211. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/section1_1.md +0 -5
  212. data/ext/apex_ext/apex_src/tests/fixtures/comprehensive_test.md +0 -652
  213. data/ext/apex_ext/apex_src/tests/fixtures/debug_ref_image_ial.md +0 -3
  214. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial.md +0 -11
  215. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial_demo.md +0 -177
  216. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji-autocorrect.md +0 -94
  217. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji_test.md +0 -3
  218. data/ext/apex_ext/apex_src/tests/fixtures/extensions/kbd_test.md +0 -3
  219. data/ext/apex_ext/apex_src/tests/fixtures/filters/filter_output_with_rawblock.json +0 -1
  220. data/ext/apex_ext/apex_src/tests/fixtures/filters/unwrap.md +0 -7
  221. data/ext/apex_ext/apex_src/tests/fixtures/ial/bracketed_spans_test.md +0 -74
  222. data/ext/apex_ext/apex_src/tests/fixtures/images/auto-wildcard.md +0 -8
  223. data/ext/apex_ext/apex_src/tests/fixtures/images/bear_image_attributes.md +0 -10
  224. data/ext/apex_ext/apex_src/tests/fixtures/images/image_and_encoding_test.md +0 -27
  225. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu.avif +0 -0
  226. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu.jpg +0 -0
  227. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu.webp +0 -0
  228. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu@2x.avif +0 -0
  229. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu@2x.jpg +0 -0
  230. data/ext/apex_ext/apex_src/tests/fixtures/images/img/app-pass-1-profile-menu@2x.webp +0 -0
  231. data/ext/apex_ext/apex_src/tests/fixtures/images/media_formats_test.md +0 -63
  232. data/ext/apex_ext/apex_src/tests/fixtures/images/multimarkdown_image_attributes_test.md +0 -60
  233. data/ext/apex_ext/apex_src/tests/fixtures/images/pandoc_ial_image_test.md +0 -27
  234. data/ext/apex_ext/apex_src/tests/fixtures/images/width_height_conversion_test.md +0 -94
  235. data/ext/apex_ext/apex_src/tests/fixtures/img-in-div.md +0 -16
  236. data/ext/apex_ext/apex_src/tests/fixtures/includes/code.py +0 -4
  237. data/ext/apex_ext/apex_src/tests/fixtures/includes/data-semi.csv +0 -3
  238. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.csv +0 -5
  239. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.tsv +0 -5
  240. data/ext/apex_ext/apex_src/tests/fixtures/includes/image.png +0 -2
  241. data/ext/apex_ext/apex_src/tests/fixtures/includes/metadata_options.yml +0 -11
  242. data/ext/apex_ext/apex_src/tests/fixtures/includes/nested.md +0 -8
  243. data/ext/apex_ext/apex_src/tests/fixtures/includes/raw.html +0 -4
  244. data/ext/apex_ext/apex_src/tests/fixtures/includes/sections.md +0 -19
  245. data/ext/apex_ext/apex_src/tests/fixtures/includes/sections.txt +0 -11
  246. data/ext/apex_ext/apex_src/tests/fixtures/includes/simple.md +0 -7
  247. data/ext/apex_ext/apex_src/tests/fixtures/includes/test_image.png +0 -0
  248. data/ext/apex_ext/apex_src/tests/fixtures/includes/with space.txt +0 -1
  249. data/ext/apex_ext/apex_src/tests/fixtures/large_doc.md +0 -1094
  250. data/ext/apex_ext/apex_src/tests/fixtures/metadata/mmd-metadata.md +0 -5
  251. data/ext/apex_ext/apex_src/tests/fixtures/metadata/pandoc-meta.md +0 -4
  252. data/ext/apex_ext/apex_src/tests/fixtures/metadata/yaml-frontmatter.md +0 -6
  253. data/ext/apex_ext/apex_src/tests/fixtures/metadata_options.yml +0 -11
  254. data/ext/apex_ext/apex_src/tests/fixtures/minimal_pb.md +0 -2
  255. data/ext/apex_ext/apex_src/tests/fixtures/obsidian-callouts.md +0 -46
  256. data/ext/apex_ext/apex_src/tests/fixtures/output/gfm_header_id_test.md +0 -96
  257. data/ext/apex_ext/apex_src/tests/fixtures/output/test_citations.md +0 -43
  258. data/ext/apex_ext/apex_src/tests/fixtures/output/test_def_list_links.md +0 -12
  259. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_mmark.md +0 -53
  260. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_textindex.md +0 -37
  261. data/ext/apex_ext/apex_src/tests/fixtures/pagebreak_html_repro.md +0 -5
  262. data/ext/apex_ext/apex_src/tests/fixtures/python-callouts.md +0 -47
  263. data/ext/apex_ext/apex_src/tests/fixtures/quarto/callouts.md +0 -3
  264. data/ext/apex_ext/apex_src/tests/fixtures/quarto/code-attrs.md +0 -3
  265. data/ext/apex_ext/apex_src/tests/fixtures/quarto/diagrams.md +0 -8
  266. data/ext/apex_ext/apex_src/tests/fixtures/quarto/lists.md +0 -19
  267. data/ext/apex_ext/apex_src/tests/fixtures/quarto/raw-content.md +0 -5
  268. data/ext/apex_ext/apex_src/tests/fixtures/quarto/shortcodes.md +0 -7
  269. data/ext/apex_ext/apex_src/tests/fixtures/quarto/smoke.md +0 -81
  270. data/ext/apex_ext/apex_src/tests/fixtures/quarto/spans.md +0 -5
  271. data/ext/apex_ext/apex_src/tests/fixtures/quarto-callouts.md +0 -47
  272. data/ext/apex_ext/apex_src/tests/fixtures/speed.md +0 -192
  273. data/ext/apex_ext/apex_src/tests/fixtures/tables/advanced_tables_test.md +0 -93
  274. data/ext/apex_ext/apex_src/tests/fixtures/tables/grid-tables.md +0 -37
  275. data/ext/apex_ext/apex_src/tests/fixtures/tables/inline_tables_test.md +0 -41
  276. data/ext/apex_ext/apex_src/tests/fixtures/tables/relaxed-table.md +0 -12
  277. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_cr_line_endings.md +0 -15
  278. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_no_trailing_newline.md +0 -15
  279. data/ext/apex_ext/apex_src/tests/generate_gfm_ids.sh +0 -105
  280. data/ext/apex_ext/apex_src/tests/generate_ial_demo.sh +0 -143
  281. data/ext/apex_ext/apex_src/tests/gfm_id_comparison_summary.md +0 -96
  282. data/ext/apex_ext/apex_src/tests/gh_api_test.md +0 -6
  283. data/ext/apex_ext/apex_src/tests/ial_demo.html +0 -186
  284. data/ext/apex_ext/apex_src/tests/include_code.py +0 -19
  285. data/ext/apex_ext/apex_src/tests/include_snippet.md +0 -15
  286. data/ext/apex_ext/apex_src/tests/metadata_cli_test.sh +0 -119
  287. data/ext/apex_ext/apex_src/tests/multi_file_cli_test.sh +0 -64
  288. data/ext/apex_ext/apex_src/tests/paginate_cli_test.sh +0 -80
  289. data/ext/apex_ext/apex_src/tests/sample_data.csv +0 -7
  290. data/ext/apex_ext/apex_src/tests/table_escaped_ltlt.md +0 -4
  291. data/ext/apex_ext/apex_src/tests/terminal_width_test.sh +0 -29
  292. data/ext/apex_ext/apex_src/tests/test-swift-package.sh +0 -14
  293. data/ext/apex_ext/apex_src/tests/test_basic.c +0 -74
  294. data/ext/apex_ext/apex_src/tests/test_bear_image_attrs.c +0 -301
  295. data/ext/apex_ext/apex_src/tests/test_cmark_callback.c +0 -189
  296. data/ext/apex_ext/apex_src/tests/test_concordance.tsv +0 -4
  297. data/ext/apex_ext/apex_src/tests/test_custom_plugins.c +0 -78
  298. data/ext/apex_ext/apex_src/tests/test_escaping_repro.c +0 -82
  299. data/ext/apex_ext/apex_src/tests/test_extensions.c +0 -3337
  300. data/ext/apex_ext/apex_src/tests/test_helpers.c +0 -183
  301. data/ext/apex_ext/apex_src/tests/test_helpers.h +0 -91
  302. data/ext/apex_ext/apex_src/tests/test_ial.c +0 -289
  303. data/ext/apex_ext/apex_src/tests/test_links.c +0 -418
  304. data/ext/apex_ext/apex_src/tests/test_marked_integration.c +0 -290
  305. data/ext/apex_ext/apex_src/tests/test_metadata.c +0 -1147
  306. data/ext/apex_ext/apex_src/tests/test_output.c +0 -2056
  307. data/ext/apex_ext/apex_src/tests/test_plugins.c +0 -219
  308. data/ext/apex_ext/apex_src/tests/test_refs.bib +0 -31
  309. data/ext/apex_ext/apex_src/tests/test_runner.c +0 -268
  310. data/ext/apex_ext/apex_src/tests/test_syntax_highlight.c +0 -198
  311. data/ext/apex_ext/apex_src/tests/test_tables.c +0 -1298
  312. data/ext/apex_ext/apex_src/tests/update_benchmarks.sh +0 -9
  313. data/ext/apex_ext/apex_src/tests/yaml_test.md +0 -13
  314. data/ext/apex_ext/apex_src/tests.rb +0 -39
  315. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CMakeLists.txt +0 -48
  316. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.c +0 -14
  317. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.cmake +0 -43
  318. data/ext/apex_ext/apex_src/vendor/cmark-gfm/FindAsan.cmake +0 -74
  319. data/ext/apex_ext/apex_src/vendor/cmark-gfm/Makefile.nmake +0 -38
  320. data/ext/apex_ext/apex_src/vendor/cmark-gfm/README.md +0 -206
  321. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/CMakeLists.txt +0 -30
  322. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.cpp +0 -15
  323. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.h +0 -16
  324. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.c +0 -111
  325. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.h +0 -35
  326. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/main.c +0 -1169
  327. data/ext/apex_ext/apex_src/vendor/cmark-gfm/appveyor.yml +0 -21
  328. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-flat.md +0 -16
  329. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-nested.md +0 -13
  330. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-code.md +0 -11
  331. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-fences.md +0 -14
  332. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-heading.md +0 -9
  333. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-hr.md +0 -10
  334. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-html.md +0 -32
  335. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-lheading.md +0 -8
  336. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-flat.md +0 -67
  337. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-nested.md +0 -36
  338. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-flat.md +0 -15
  339. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-nested.md +0 -17
  340. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-autolink.md +0 -14
  341. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-backticks.md +0 -3
  342. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-flat.md +0 -5
  343. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-nested.md +0 -5
  344. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-worst.md +0 -5
  345. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-entity.md +0 -11
  346. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-escape.md +0 -15
  347. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-html.md +0 -44
  348. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-flat.md +0 -23
  349. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-nested.md +0 -13
  350. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-newlines.md +0 -24
  351. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/lorem1.md +0 -13
  352. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/rawtabs.md +0 -18
  353. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/statistics.py +0 -595
  354. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/stats.py +0 -19
  355. data/ext/apex_ext/apex_src/vendor/cmark-gfm/benchmarks.md +0 -33
  356. data/ext/apex_ext/apex_src/vendor/cmark-gfm/changelog.txt +0 -1245
  357. data/ext/apex_ext/apex_src/vendor/cmark-gfm/data/CaseFolding.txt +0 -1495
  358. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/CMakeLists.txt +0 -119
  359. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.re +0 -92
  360. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/CMakeLists.txt +0 -22
  361. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/README.md +0 -12
  362. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic.c +0 -91
  363. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic_brackets.c +0 -110
  364. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzzloop.sh +0 -28
  365. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/CMakeLists.txt +0 -10
  366. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/make_man_page.py +0 -133
  367. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man1/cmark-gfm.1 +0 -78
  368. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man3/cmark-gfm.3 +0 -1041
  369. data/ext/apex_ext/apex_src/vendor/cmark-gfm/nmake.bat +0 -1
  370. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/CMakeLists.txt +0 -230
  371. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm_version.h.in +0 -7
  372. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/config.h +0 -38
  373. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/config.h.in +0 -76
  374. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/libcmark-gfm.pc.in +0 -10
  375. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.re +0 -365
  376. data/ext/apex_ext/apex_src/vendor/cmark-gfm/suppressions +0 -10
  377. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/CMakeLists.txt +0 -114
  378. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/__pycache__/cmark.cpython-314.pyc +0 -0
  379. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/__pycache__/normalize.cpython-314.pyc +0 -0
  380. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/afl_test_cases/test.md +0 -49
  381. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark-fuzz.c +0 -58
  382. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark.py +0 -105
  383. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/entity_tests.py +0 -67
  384. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-full-info-string.txt +0 -0
  385. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-table-prefer-style-attributes.txt +0 -38
  386. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions.txt +0 -989
  387. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/fuzzing_dictionary +0 -67
  388. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/normalize.py +0 -194
  389. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/pathological_tests.py +0 -160
  390. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/regression.txt +0 -375
  391. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/roundtrip_tests.py +0 -50
  392. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/run-cmark-fuzz +0 -4
  393. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/smart_punct.txt +0 -177
  394. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec.txt +0 -10212
  395. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec_tests.py +0 -152
  396. data/ext/apex_ext/apex_src/vendor/cmark-gfm/toolchain-mingw32.cmake +0 -17
  397. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/Dockerfile +0 -41
  398. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/appveyor-build.bat +0 -13
  399. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/make_entities_inc.py +0 -32
  400. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/mkcasefold.pl +0 -22
  401. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md.xsl +0 -319
  402. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md_gfm.xsl +0 -80
  403. data/ext/apex_ext/apex_src/vendor/cmark-gfm/why-cmark-and-not-x.md +0 -104
  404. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.js +0 -6
  405. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.py +0 -37
  406. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rb +0 -15
  407. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rkt +0 -208
  408. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper_ext.py +0 -109
  409. data/ext/apex_ext/apex_src/vendor/libyaml/CMakeLists.txt +0 -160
  410. data/ext/apex_ext/apex_src/vendor/libyaml/Changes +0 -372
  411. data/ext/apex_ext/apex_src/vendor/libyaml/License +0 -20
  412. data/ext/apex_ext/apex_src/vendor/libyaml/Makefile.am +0 -51
  413. data/ext/apex_ext/apex_src/vendor/libyaml/ReadMe.md +0 -46
  414. data/ext/apex_ext/apex_src/vendor/libyaml/announcement.msg +0 -89
  415. data/ext/apex_ext/apex_src/vendor/libyaml/bootstrap +0 -3
  416. data/ext/apex_ext/apex_src/vendor/libyaml/cmake/config.h.in +0 -4
  417. data/ext/apex_ext/apex_src/vendor/libyaml/configure.ac +0 -73
  418. data/ext/apex_ext/apex_src/vendor/libyaml/doc/doxygen.cfg +0 -222
  419. data/ext/apex_ext/apex_src/vendor/libyaml/docker/README.mkd +0 -17
  420. data/ext/apex_ext/apex_src/vendor/libyaml/docker/alpine-3.7 +0 -26
  421. data/ext/apex_ext/apex_src/vendor/libyaml/docker/fedora-25 +0 -26
  422. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-14.04 +0 -29
  423. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-16.04 +0 -24
  424. data/ext/apex_ext/apex_src/vendor/libyaml/examples/anchors.yaml +0 -10
  425. data/ext/apex_ext/apex_src/vendor/libyaml/examples/array.yaml +0 -2
  426. data/ext/apex_ext/apex_src/vendor/libyaml/examples/global-tag.yaml +0 -14
  427. data/ext/apex_ext/apex_src/vendor/libyaml/examples/json.yaml +0 -1
  428. data/ext/apex_ext/apex_src/vendor/libyaml/examples/mapping.yaml +0 -2
  429. data/ext/apex_ext/apex_src/vendor/libyaml/examples/numbers.yaml +0 -1
  430. data/ext/apex_ext/apex_src/vendor/libyaml/examples/strings.yaml +0 -7
  431. data/ext/apex_ext/apex_src/vendor/libyaml/examples/tags.yaml +0 -7
  432. data/ext/apex_ext/apex_src/vendor/libyaml/examples/yaml-version.yaml +0 -3
  433. data/ext/apex_ext/apex_src/vendor/libyaml/include/Makefile.am +0 -17
  434. data/ext/apex_ext/apex_src/vendor/libyaml/include/yaml.h +0 -1999
  435. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/ReadMe.md +0 -77
  436. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/Dockerfile +0 -32
  437. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/output/ReadMe +0 -1
  438. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/scripts/libyaml-dist.sh +0 -23
  439. data/ext/apex_ext/apex_src/vendor/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml +0 -1
  440. data/ext/apex_ext/apex_src/vendor/libyaml/src/Makefile.am +0 -4
  441. data/ext/apex_ext/apex_src/vendor/libyaml/src/api.c +0 -1393
  442. data/ext/apex_ext/apex_src/vendor/libyaml/src/dumper.c +0 -394
  443. data/ext/apex_ext/apex_src/vendor/libyaml/src/emitter.c +0 -2358
  444. data/ext/apex_ext/apex_src/vendor/libyaml/src/loader.c +0 -544
  445. data/ext/apex_ext/apex_src/vendor/libyaml/src/parser.c +0 -1416
  446. data/ext/apex_ext/apex_src/vendor/libyaml/src/reader.c +0 -469
  447. data/ext/apex_ext/apex_src/vendor/libyaml/src/scanner.c +0 -3598
  448. data/ext/apex_ext/apex_src/vendor/libyaml/src/writer.c +0 -141
  449. data/ext/apex_ext/apex_src/vendor/libyaml/src/yaml_private.h +0 -684
  450. data/ext/apex_ext/apex_src/vendor/libyaml/tests/CMakeLists.txt +0 -27
  451. data/ext/apex_ext/apex_src/vendor/libyaml/tests/Makefile.am +0 -9
  452. data/ext/apex_ext/apex_src/vendor/libyaml/tests/ReadMe.md +0 -63
  453. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor-alt.c +0 -800
  454. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor.c +0 -1127
  455. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter-alt.c +0 -217
  456. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter.c +0 -202
  457. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-all-tests.sh +0 -29
  458. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-dumper.c +0 -314
  459. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter-test-suite.c +0 -290
  460. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter.c +0 -327
  461. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-loader.c +0 -63
  462. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser-test-suite.c +0 -196
  463. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser.c +0 -88
  464. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-scanner.c +0 -63
  465. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-reader.c +0 -354
  466. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-version.c +0 -29
  467. data/ext/apex_ext/apex_src/vendor/libyaml/yaml-0.1.pc.in +0 -10
  468. data/ext/apex_ext/apex_src/vendor/libyaml/yamlConfig.cmake.in +0 -16
  469. data/ext/apex_ext/apex_src/xcode_build/CMakeScripts/ReRunCMake.make +0 -74
  470. data/ext/apex_ext/apex_src/xcode_build/CTestTestfile.cmake +0 -22
  471. data/ext/apex_ext/apex_src/xcode_build/Debug/Apex.framework/Versions/A/Apex +0 -0
  472. data/ext/apex_ext/apex_src/xcode_build/Debug/Apex.framework/Versions/A/Resources/Info.plist +0 -44
  473. data/ext/apex_ext/apex_src/xcode_build/Debug/Apex.framework/Versions/A/_CodeSignature/CodeResources +0 -128
  474. data/ext/apex_ext/apex_src/xcode_build/apex.xcodeproj/project.pbxproj +0 -5118
  475. data/ext/apex_ext/apex_src/xcode_build/apex.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -8
  476. data/ext/apex_ext/apex_src/xcode_build/apex.xcodeproj/project.xcworkspace/xcuserdata/ttscoff.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  477. data/ext/apex_ext/apex_src/xcode_build/apex.xcodeproj/project.xcworkspace/xcuserdata/ttscoff.xcuserdatad/WorkspaceSettings.xcsettings +0 -8
  478. data/ext/apex_ext/apex_src/xcode_build/apex.xcodeproj/xcuserdata/ttscoff.xcuserdatad/xcschemes/xcschememanagement.plist +0 -99
  479. data/ext/apex_ext/apex_src/xcode_build/cmake_install.cmake +0 -452
  480. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/CMakeScripts/ReRunCMake.make +0 -52
  481. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/cmake_install.cmake +0 -55
  482. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/cmark-gfm.xcodeproj/project.pbxproj +0 -2455
  483. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/cmark-gfm.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -8
  484. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/extensions/cmake_install.cmake +0 -171
  485. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/man/cmake_install.cmake +0 -55
  486. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/src/cmake_install.cmake +0 -220
  487. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/src/cmark-gfm_export.h +0 -43
  488. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/src/cmark-gfm_version.h +0 -7
  489. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/src/config.h +0 -76
  490. data/ext/apex_ext/apex_src/xcode_build/vendor/cmark-gfm/src/libcmark-gfm.pc +0 -10
@@ -1,1147 +0,0 @@
1
- /**
2
- * Metadata Tests
3
- */
4
-
5
- #include "test_helpers.h"
6
- #include "apex/apex.h"
7
- #include "../src/extensions/metadata.h"
8
- #include <string.h>
9
- #include <stdlib.h>
10
- #include <stdio.h>
11
- #include <assert.h>
12
-
13
- void test_metadata(void) {
14
- int suite_failures = suite_start();
15
- print_suite_title("Metadata Tests", false, true);
16
-
17
- apex_options opts = apex_options_for_mode(APEX_MODE_MULTIMARKDOWN);
18
- char *html;
19
-
20
- /* Test YAML metadata with variables */
21
- const char *yaml_doc = "---\ntitle: Test Doc\nauthor: John\n---\n\n# [%title]\n\nBy [%author]";
22
- html = apex_markdown_to_html(yaml_doc, strlen(yaml_doc), &opts);
23
- assert_contains(html, "<h1", "YAML metadata variable in header");
24
- assert_contains(html, "Test Doc</h1>", "YAML metadata variable content");
25
- assert_contains(html, "By John", "YAML metadata variable in text");
26
- apex_free_string(html);
27
-
28
- /* Test YAML arrays + nested mappings (libyaml flattening) and end marker '...'. */
29
- const char *yaml_nested =
30
- "---\n"
31
- "tags:\n"
32
- " - one\n"
33
- " - two\n"
34
- "nested:\n"
35
- " a: 1\n"
36
- " b:\n"
37
- " - x\n"
38
- " - y\n"
39
- "...\n"
40
- "\n"
41
- "Tags: [%tags]\n"
42
- "Nested a: [%nested.a]\n"
43
- "Nested b: [%nested.b]\n"
44
- "Nested b0: [%nested.b.0]\n";
45
- html = apex_markdown_to_html(yaml_nested, strlen(yaml_nested), &opts);
46
- assert_contains(html, "Tags: one, two", "YAML array flattened to joined string");
47
- assert_contains(html, "Nested a: 1", "YAML nested mapping flattened (nested.a)");
48
- assert_contains(html, "Nested b: x, y", "YAML nested sequence flattened (nested.b)");
49
- /* Note: scalar-only sequences are normalized to a joined string; index keys are not generated. */
50
- assert_contains(html, "Nested b0: [%nested.b.0]", "YAML scalar sequence does not generate index keys");
51
- apex_free_string(html);
52
-
53
- /* Test YAML sequence containing a nested mapping: scalar items join, mapping items flatten with index keys. */
54
- const char *yaml_seq_map =
55
- "---\n"
56
- "arr:\n"
57
- " - one\n"
58
- " - k: v\n"
59
- "---\n"
60
- "\n"
61
- "Arr: [%arr]\n"
62
- "Arr0: [%arr.0]\n"
63
- "Arr1.k: [%arr.1.k]\n";
64
- html = apex_markdown_to_html(yaml_seq_map, strlen(yaml_seq_map), &opts);
65
- /* Note: mixed scalar+mapping sequences fall back to indexed keys (no joined base key). */
66
- assert_contains(html, "Arr: [%arr]", "YAML mixed sequence: base key not generated");
67
- assert_contains(html, "Arr0: one", "YAML sequence scalar index flattened (arr.0)");
68
- assert_contains(html, "Arr1.k: v", "YAML sequence mapping flattened with index key (arr.1.k)");
69
- apex_free_string(html);
70
-
71
- /* Test MMD metadata */
72
- const char *mmd_doc = "Title: My Title\n\n# [%Title]";
73
- html = apex_markdown_to_html(mmd_doc, strlen(mmd_doc), &opts);
74
- assert_contains(html, "<h1", "MMD metadata variable");
75
- assert_contains(html, "My Title</h1>", "MMD metadata variable content");
76
- apex_free_string(html);
77
-
78
- /* Test Pandoc metadata */
79
- const char *pandoc_doc = "% The Title\n% The Author\n\n# [%title]";
80
- html = apex_markdown_to_html(pandoc_doc, strlen(pandoc_doc), &opts);
81
- assert_contains(html, "<h1", "Pandoc metadata variable");
82
- assert_contains(html, "The Title</h1>", "Pandoc metadata variable content");
83
- apex_free_string(html);
84
-
85
- /* Test that list items with colons are not treated as metadata in unified mode */
86
- apex_options unified_opts = apex_options_for_mode(APEX_MODE_UNIFIED);
87
- const char *list_with_colon_doc = "## A Header\n\n- Foo: Bar\n- Another item\n- Third item";
88
- html = apex_markdown_to_html(list_with_colon_doc, strlen(list_with_colon_doc), &unified_opts);
89
- assert_contains(html, "<h2", "List with colon: header is rendered");
90
- assert_contains(html, "A Header</h2>", "List with colon: header content");
91
- assert_contains(html, "<ul>", "List with colon: unordered list rendered");
92
- assert_contains(html, "<li>Foo: Bar</li>", "List with colon: first item with colon rendered");
93
- assert_contains(html, "<li>Another item</li>", "List with colon: second item rendered");
94
- assert_contains(html, "<li>Third item</li>", "List with colon: third item rendered");
95
- apex_free_string(html);
96
-
97
- /* H1 then a paragraph with ": " must not strip the paragraph as MMD metadata */
98
- const char *h1_colon_para =
99
- "# My Title\n"
100
- "\n"
101
- "This is a note: it has a colon in the first sentence.\n"
102
- "\n"
103
- "More content.\n";
104
- html = apex_markdown_to_html(h1_colon_para, strlen(h1_colon_para), &unified_opts);
105
- assert_contains(html, "<h1", "H1+colon para: heading rendered");
106
- assert_contains(html, "My Title", "H1+colon para: heading text preserved");
107
- assert_contains(html, "This is a note: it has a colon", "H1+colon para: paragraph preserved");
108
- assert_contains(html, "More content.", "H1+colon para: following paragraph preserved");
109
- apex_free_string(html);
110
-
111
- /* Leading blank line disables undelimited MMD metadata */
112
- const char *leading_blank_meta =
113
- "\n"
114
- "Title: Should Not Strip\n"
115
- "\n"
116
- "# Body\n";
117
- html = apex_markdown_to_html(leading_blank_meta, strlen(leading_blank_meta), &opts);
118
- assert_contains(html, "Title: Should Not Strip", "Leading blank: metadata-like line kept as content");
119
- assert_contains(html, "Body", "Leading blank: body heading rendered");
120
- apex_free_string(html);
121
-
122
- /* Valid single short MMD key/value still works */
123
- const char *single_mmd = "Title: Only Title\n\n# [%Title]\n";
124
- html = apex_markdown_to_html(single_mmd, strlen(single_mmd), &opts);
125
- assert_contains(html, "Only Title</h1>", "Single short MMD metadata still works");
126
- assert_not_contains(html, "Title: Only Title", "Single short MMD metadata is stripped");
127
- apex_free_string(html);
128
-
129
- /* Keys with punctuation other than space/-/_ are not metadata */
130
- const char *punct_key =
131
- "Hello, world: not metadata\n"
132
- "\n"
133
- "# Body\n";
134
- html = apex_markdown_to_html(punct_key, strlen(punct_key), &opts);
135
- assert_contains(html, "Hello, world: not metadata", "Punctuation in key keeps line as content");
136
- apex_free_string(html);
137
-
138
- /* Single metadata-like line longer than 100 chars is treated as content */
139
- {
140
- char long_doc[256];
141
- char key[41];
142
- char val[71];
143
- memset(key, 'a', 40); key[40] = '\0';
144
- memset(val, 'b', 70); val[70] = '\0';
145
- /* "aaaa...: bbbb..." is > 100 chars on the first line */
146
- snprintf(long_doc, sizeof(long_doc), "%s: %s\n\n# Body\n", key, val);
147
- assert_option_bool(strlen(key) + 2 + strlen(val) > 100, true,
148
- "long-line fixture first line is >100 chars");
149
- html = apex_markdown_to_html(long_doc, strlen(long_doc), &opts);
150
- assert_contains(html, key, "Long single colon-line kept as content (key)");
151
- assert_contains(html, "Body", "Long single colon-line: body heading rendered");
152
- apex_free_string(html);
153
- }
154
-
155
- /* Multiple short metadata lines still work (including keys with spaces/-/_) */
156
- const char *multi_mmd =
157
- "Title: Multi Title\n"
158
- "Base Header Level: 2\n"
159
- "css-file: style.css\n"
160
- "\n"
161
- "# Section\n";
162
- html = apex_markdown_to_html(multi_mmd, strlen(multi_mmd), &opts);
163
- assert_not_contains(html, "Title: Multi Title", "Multi MMD: title stripped");
164
- assert_not_contains(html, "Base Header Level:", "Multi MMD: spaced key stripped");
165
- assert_contains(html, "Section", "Multi MMD: body remains");
166
- apex_free_string(html);
167
-
168
- /* No space after colon is not metadata (e.g. bare URLs / ratios) */
169
- const char *no_space_after_colon =
170
- "https://example.com/path\n"
171
- "\n"
172
- "# Body\n";
173
- html = apex_markdown_to_html(no_space_after_colon, strlen(no_space_after_colon), &opts);
174
- assert_contains(html, "https://example.com/path", "No space after colon: URL kept as content");
175
- apex_free_string(html);
176
-
177
- bool had_failures = suite_end(suite_failures);
178
- print_suite_title("Metadata Tests", had_failures, false);
179
- }
180
-
181
- /**
182
- * YAML serialization helpers used by the CLI
183
- */
184
- void test_metadata_yaml_emit(void) {
185
- int suite_failures = suite_start();
186
- print_suite_title("Metadata YAML emit Tests", false, true);
187
-
188
- apex_metadata_item *m = apex_parse_command_metadata("title=Hello World");
189
- assert(m != NULL);
190
- FILE *fp = tmpfile();
191
- assert(fp != NULL);
192
- apex_metadata_fprint_yaml_document(fp, m);
193
- rewind(fp);
194
- char buf[800];
195
- size_t n = fread(buf, 1, sizeof(buf) - 1, fp);
196
- buf[n] = '\0';
197
- fclose(fp);
198
- assert_contains(buf, "---", "yaml document has markers");
199
- assert_contains(buf, "title:", "yaml title key");
200
- assert_contains(buf, "Hello World", "yaml title value");
201
- apex_free_metadata(m);
202
-
203
- apex_metadata_item *a = apex_parse_command_metadata("x=1");
204
- apex_metadata_item *b = apex_parse_command_metadata("x=2");
205
- apex_metadata_item *mg = apex_merge_metadata(a, b, NULL);
206
- apex_free_metadata(a);
207
- apex_free_metadata(b);
208
- fp = tmpfile();
209
- apex_metadata_fprint_yaml_mapping(fp, mg);
210
- rewind(fp);
211
- n = fread(buf, 1, sizeof(buf) - 1, fp);
212
- buf[n] = '\0';
213
- fclose(fp);
214
- assert_contains(buf, "x: 2", "merge: later metadata wins for yaml mapping");
215
- apex_free_metadata(mg);
216
-
217
- bool had_failures = suite_end(suite_failures);
218
- print_suite_title("Metadata YAML emit Tests", had_failures, false);
219
- }
220
-
221
- /**
222
- * Test MultiMarkdown metadata keys
223
- */
224
-
225
- void test_mmd_metadata_keys(void) {
226
- int suite_failures = suite_start();
227
- print_suite_title("MultiMarkdown Metadata Keys Tests", false, true);
228
-
229
- apex_options opts = apex_options_for_mode(APEX_MODE_MULTIMARKDOWN);
230
- char *html;
231
-
232
- /* Test Base Header Level */
233
- const char *base_header_doc = "Base Header Level: 2\n\n# Header 1\n## Header 2";
234
- html = apex_markdown_to_html(base_header_doc, strlen(base_header_doc), &opts);
235
- assert_contains(html, "<h2", "Base Header Level: h1 becomes h2");
236
- assert_contains(html, "Header 1</h2>", "Base Header Level: h1 content in h2 tag");
237
- assert_contains(html, "<h3", "Base Header Level: h2 becomes h3");
238
- assert_contains(html, "Header 2</h3>", "Base Header Level: h2 content in h3 tag");
239
- apex_free_string(html);
240
-
241
- /* Test HTML Header Level (format-specific) */
242
- const char *html_header_level_doc = "HTML Header Level: 3\n\n# Header 1";
243
- html = apex_markdown_to_html(html_header_level_doc, strlen(html_header_level_doc), &opts);
244
- assert_contains(html, "<h3", "HTML Header Level: h1 becomes h3");
245
- assert_contains(html, "Header 1</h3>", "HTML Header Level: h1 content in h3 tag");
246
- apex_free_string(html);
247
-
248
- /* Test Language metadata in standalone document */
249
- opts.standalone = true;
250
- const char *language_doc = "Language: fr\n\n# Bonjour";
251
- html = apex_markdown_to_html(language_doc, strlen(language_doc), &opts);
252
- assert_contains(html, "<html lang=\"fr\">", "Language metadata sets HTML lang attribute");
253
- apex_free_string(html);
254
-
255
- /* Test Quotes Language - French (requires smart typography) */
256
- opts.standalone = false;
257
- opts.enable_smart_typography = true; /* Ensure smart typography is enabled */
258
- const char *quotes_fr_doc = "Quotes Language: french\n\nHe said \"hello\" to me.";
259
- html = apex_markdown_to_html(quotes_fr_doc, strlen(quotes_fr_doc), &opts);
260
- assert_contains(html, "&laquo;&nbsp;", "Quotes Language: French opening quote");
261
- assert_contains(html, "&nbsp;&raquo;", "Quotes Language: French closing quote");
262
- apex_free_string(html);
263
-
264
- /* Test Quotes Language - German */
265
- const char *quotes_de_doc = "Quotes Language: german\n\nHe said \"hello\" to me.";
266
- html = apex_markdown_to_html(quotes_de_doc, strlen(quotes_de_doc), &opts);
267
- assert_contains(html, "&bdquo;", "Quotes Language: German opening quote");
268
- assert_contains(html, "&ldquo;", "Quotes Language: German closing quote");
269
- apex_free_string(html);
270
-
271
- /* Test Quotes Language fallback to Language */
272
- opts.standalone = true;
273
- const char *lang_fallback_doc = "Language: fr\n\nHe said \"hello\" to me.";
274
- html = apex_markdown_to_html(lang_fallback_doc, strlen(lang_fallback_doc), &opts);
275
- assert_contains(html, "<html lang=\"fr\">", "Language metadata sets HTML lang");
276
- /* Quotes should also use French since Quotes Language not specified */
277
- assert_contains(html, "&laquo;&nbsp;", "Quotes Language falls back to Language");
278
- apex_free_string(html);
279
-
280
- /* Test CSS metadata in standalone document */
281
- opts.standalone = true;
282
- const char *css_doc = "CSS: styles.css\n\n# Test";
283
- html = apex_markdown_to_html(css_doc, strlen(css_doc), &opts);
284
- assert_contains(html, "<link rel=\"stylesheet\" href=\"styles.css\">", "CSS metadata adds stylesheet link");
285
- assert_not_contains(html, "<style>", "CSS metadata: no default styles when CSS specified");
286
- apex_free_string(html);
287
-
288
- /* Test CSS metadata: default styles when no CSS */
289
- const char *no_css_doc = "Title: Test\n\n# Content";
290
- html = apex_markdown_to_html(no_css_doc, strlen(no_css_doc), &opts);
291
- assert_contains(html, "<style>", "No CSS metadata: default styles included");
292
- apex_free_string(html);
293
-
294
- /* Test HTML Header metadata */
295
- const char *html_header_doc = "HTML Header: <script src=\"mathjax.js\"></script>\n\n# Test";
296
- html = apex_markdown_to_html(html_header_doc, strlen(html_header_doc), &opts);
297
- assert_contains(html, "<script src=\"mathjax.js\"></script>", "HTML Header metadata inserted in head");
298
- assert_contains(html, "</head>", "HTML Header metadata before </head>");
299
- apex_free_string(html);
300
-
301
- /* Test HTML Footer metadata */
302
- const char *html_footer_doc = "HTML Footer: <script>init();</script>\n\n# Test";
303
- html = apex_markdown_to_html(html_footer_doc, strlen(html_footer_doc), &opts);
304
- assert_contains(html, "<script>init();</script>", "HTML Footer metadata inserted before </body>");
305
- assert_contains(html, "</body>", "HTML Footer metadata before </body>");
306
- apex_free_string(html);
307
-
308
- /* Test generic metadata tags in standalone HTML head */
309
- opts.standalone = true;
310
- const char *head_meta_doc =
311
- "Title: This is the Title\n"
312
- "Author: That would be me\n"
313
- "Date: March 9, 2026\n\n"
314
- "# Test";
315
- html = apex_markdown_to_html(head_meta_doc, strlen(head_meta_doc), &opts);
316
- assert_contains(html, "<meta name=\"Author\" content=\"That would be me\"/>", "Author metadata emitted as meta tag");
317
- assert_contains(html, "<meta name=\"Date\" content=\"March 9, 2026\"/>", "Date metadata emitted as meta tag");
318
- apex_free_string(html);
319
-
320
- /* Test generic metadata tags in standalone HTML head (Unified mode) */
321
- apex_options unified_head_opts = apex_options_for_mode(APEX_MODE_UNIFIED);
322
- unified_head_opts.standalone = true;
323
- html = apex_markdown_to_html(head_meta_doc, strlen(head_meta_doc), &unified_head_opts);
324
- assert_contains(html, "<meta name=\"Author\" content=\"That would be me\"/>", "Unified: author metadata emitted as meta tag");
325
- assert_contains(html, "<meta name=\"Date\" content=\"March 9, 2026\"/>", "Unified: date metadata emitted as meta tag");
326
- apex_free_string(html);
327
-
328
- /* Test generic metadata tags in standalone HTML head (Kramdown mode) */
329
- apex_options kramdown_head_opts = apex_options_for_mode(APEX_MODE_KRAMDOWN);
330
- kramdown_head_opts.standalone = true;
331
- html = apex_markdown_to_html(head_meta_doc, strlen(head_meta_doc), &kramdown_head_opts);
332
- assert_contains(html, "<meta name=\"Author\" content=\"That would be me\"/>", "Kramdown: author metadata emitted as meta tag");
333
- assert_contains(html, "<meta name=\"Date\" content=\"March 9, 2026\"/>", "Kramdown: date metadata emitted as meta tag");
334
- apex_free_string(html);
335
-
336
- /* Test normalized key matching (spaces removed, case-insensitive) */
337
- opts.standalone = false;
338
- opts.enable_smart_typography = true; /* Ensure smart typography is enabled */
339
- const char *normalized_doc = "quoteslanguage: french\nbaseheaderlevel: 2\n\n# Header\nHe said \"hello\".";
340
- html = apex_markdown_to_html(normalized_doc, strlen(normalized_doc), &opts);
341
- assert_contains(html, "<h2", "Normalized key: baseheaderlevel works");
342
- assert_contains(html, "&laquo;&nbsp;", "Normalized key: quoteslanguage works");
343
- apex_free_string(html);
344
-
345
- /* Test case-insensitive matching */
346
- opts.enable_smart_typography = true; /* Ensure smart typography is enabled */
347
- const char *case_doc = "QUOTES LANGUAGE: german\nBASE HEADER LEVEL: 3\n\n# Header\nHe said \"hello\".";
348
- html = apex_markdown_to_html(case_doc, strlen(case_doc), &opts);
349
- assert_contains(html, "<h3", "Case-insensitive: BASE HEADER LEVEL works");
350
- assert_contains(html, "&bdquo;", "Case-insensitive: QUOTES LANGUAGE works");
351
- apex_free_string(html);
352
-
353
- /* MMD delimiter block compatibility: opening/closing with repeated chars */
354
- opts.standalone = true;
355
- const char *mmd_delimited_doc =
356
- "----\n"
357
- "Title: Delimited Title\n"
358
- "Author: Delimited Author\n"
359
- "......\n"
360
- "\n"
361
- "# Body";
362
- html = apex_markdown_to_html(mmd_delimited_doc, strlen(mmd_delimited_doc), &opts);
363
- assert_contains(html, "<meta name=\"Author\" content=\"Delimited Author\"/>", "MMD delimiter block: author parsed");
364
- assert_not_contains(html, "......", "MMD delimiter block: dot closer not rendered in body");
365
- apex_free_string(html);
366
-
367
- bool had_failures = suite_end(suite_failures);
368
- print_suite_title("MultiMarkdown Metadata Keys Tests", had_failures, false);
369
- }
370
-
371
- /**
372
- * Test metadata transforms
373
- */
374
-
375
- void test_metadata_transforms(void) {
376
- int suite_failures = suite_start();
377
- print_suite_title("Metadata Transforms Tests", false, true);
378
-
379
- apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
380
- char *html;
381
-
382
- /* Test basic transforms: upper */
383
- const char *upper_doc = "---\ntitle: hello world\n---\n\n# [%title:upper]";
384
- html = apex_markdown_to_html(upper_doc, strlen(upper_doc), &opts);
385
- assert_contains(html, "HELLO WORLD</h1>", "upper transform");
386
- apex_free_string(html);
387
-
388
- /* Test basic transforms: lower */
389
- const char *lower_doc = "---\ntitle: HELLO WORLD\n---\n\n# [%title:lower]";
390
- html = apex_markdown_to_html(lower_doc, strlen(lower_doc), &opts);
391
- assert_contains(html, "hello world</h1>", "lower transform");
392
- apex_free_string(html);
393
-
394
- /* Test basic transforms: title */
395
- const char *title_doc = "---\ntitle: hello world\n---\n\n# [%title:title]";
396
- html = apex_markdown_to_html(title_doc, strlen(title_doc), &opts);
397
- assert_contains(html, "Hello World</h1>", "title transform");
398
- apex_free_string(html);
399
-
400
- /* Test basic transforms: capitalize */
401
- const char *capitalize_doc = "---\ntitle: hello world\n---\n\n# [%title:capitalize]";
402
- html = apex_markdown_to_html(capitalize_doc, strlen(capitalize_doc), &opts);
403
- assert_contains(html, "Hello world</h1>", "capitalize transform");
404
- apex_free_string(html);
405
-
406
- /* Test basic transforms: trim */
407
- const char *trim_doc = "---\ntitle: \" hello world \"\n---\n\n# [%title:trim]";
408
- html = apex_markdown_to_html(trim_doc, strlen(trim_doc), &opts);
409
- assert_contains(html, "hello world</h1>", "trim transform");
410
- apex_free_string(html);
411
-
412
- /* Test slug transform */
413
- const char *slug_doc = "---\ntitle: My Great Post!\n---\n\n[%title:slug]";
414
- html = apex_markdown_to_html(slug_doc, strlen(slug_doc), &opts);
415
- assert_contains(html, "my-great-post", "slug transform");
416
- apex_free_string(html);
417
-
418
- /* Test replace transform (simple) */
419
- const char *replace_doc = "---\nurl: http://example.com\n---\n\n[%url:replace(http:,https:)]";
420
- html = apex_markdown_to_html(replace_doc, strlen(replace_doc), &opts);
421
- assert_contains(html, "https://example.com", "replace transform");
422
- apex_free_string(html);
423
-
424
- /* Test replace transform (regex) - use simple pattern without brackets first */
425
- const char *regex_doc = "---\ntext: Hello 123 World\n---\n\n[%text:replace(regex:123,N)]";
426
- html = apex_markdown_to_html(regex_doc, strlen(regex_doc), &opts);
427
- assert_contains(html, "Hello N World", "replace with regex");
428
- apex_free_string(html);
429
-
430
- /* Test regex with character class [0-9]+ */
431
- const char *regex_doc2 = "---\ntext: Hello 123 World\n---\n\n[%text:replace(regex:[0-9]+,N)]";
432
- html = apex_markdown_to_html(regex_doc2, strlen(regex_doc2), &opts);
433
- assert_contains(html, "Hello N World", "replace with regex pattern with brackets");
434
- apex_free_string(html);
435
-
436
- /* Test regex with simpler pattern that definitely works */
437
- const char *regex_doc3 = "---\ntext: Hello 123 World\n---\n\n[%text:replace(regex:12,N)]";
438
- html = apex_markdown_to_html(regex_doc3, strlen(regex_doc3), &opts);
439
- assert_contains(html, "Hello N3 World", "replace with regex simple pattern");
440
- apex_free_string(html);
441
-
442
- /* Test substring transform */
443
- const char *substr_doc = "---\ntitle: Hello World\n---\n\n[%title:substr(0,5)]";
444
- html = apex_markdown_to_html(substr_doc, strlen(substr_doc), &opts);
445
- assert_contains(html, "Hello", "substring transform");
446
- apex_free_string(html);
447
-
448
- /* Test truncate transform - note: smart typography may convert ... to … */
449
- const char *truncate_doc = "---\ntitle: This is a very long title\n---\n\n[%title:truncate(15,...)]";
450
- html = apex_markdown_to_html(truncate_doc, strlen(truncate_doc), &opts);
451
- /* Check for either ... or … (smart typography ellipsis) */
452
- if (strstr(html, "This is a very...") || strstr(html, "This is a very…") || strstr(html, "This is a ve")) {
453
- test_result(true, "truncate transform");
454
- } else {
455
- test_result(false, "truncate transform failed");
456
- }
457
- apex_free_string(html);
458
-
459
- /* Test default transform */
460
- const char *default_doc = "---\ndesc: \"\"\n---\n\n[%desc:default(No description)]";
461
- html = apex_markdown_to_html(default_doc, strlen(default_doc), &opts);
462
- assert_contains(html, "No description", "default transform with empty value");
463
- apex_free_string(html);
464
-
465
- /* Test default transform with non-empty value */
466
- const char *default_nonempty_doc = "---\ndesc: Has value\n---\n\n[%desc:default(No description)]";
467
- html = apex_markdown_to_html(default_nonempty_doc, strlen(default_nonempty_doc), &opts);
468
- assert_contains(html, "Has value", "default transform preserves non-empty");
469
- apex_free_string(html);
470
-
471
- /* Test html_escape transform */
472
- const char *escape_doc = "---\ntitle: A & B\n---\n\n[%title:html_escape]";
473
- html = apex_markdown_to_html(escape_doc, strlen(escape_doc), &opts);
474
- assert_contains(html, "&amp;", "html_escape transform");
475
- apex_free_string(html);
476
-
477
- /* Test basename transform */
478
- const char *basename_doc = "---\nimage: /path/to/image.jpg\n---\n\n[%image:basename]";
479
- html = apex_markdown_to_html(basename_doc, strlen(basename_doc), &opts);
480
- assert_contains(html, "image.jpg", "basename transform");
481
- apex_free_string(html);
482
-
483
- /* Test urlencode transform */
484
- const char *urlencode_doc = "---\nsearch: hello world\n---\n\n[%search:urlencode]";
485
- html = apex_markdown_to_html(urlencode_doc, strlen(urlencode_doc), &opts);
486
- assert_contains(html, "hello%20world", "urlencode transform");
487
- apex_free_string(html);
488
-
489
- /* Test urldecode transform */
490
- const char *urldecode_doc = "---\nsearch: hello%20world\n---\n\n[%search:urldecode]";
491
- html = apex_markdown_to_html(urldecode_doc, strlen(urldecode_doc), &opts);
492
- assert_contains(html, "hello world", "urldecode transform");
493
- apex_free_string(html);
494
-
495
- /* Test prefix transform */
496
- const char *prefix_doc = "---\nurl: example.com\n---\n\n[%url:prefix(https://)]";
497
- html = apex_markdown_to_html(prefix_doc, strlen(prefix_doc), &opts);
498
- assert_contains(html, "https://example.com", "prefix transform");
499
- apex_free_string(html);
500
-
501
- /* Test suffix transform */
502
- const char *suffix_doc = "---\ntitle: Hello\n---\n\n[%title:suffix(!)]";
503
- html = apex_markdown_to_html(suffix_doc, strlen(suffix_doc), &opts);
504
- assert_contains(html, "Hello!", "suffix transform");
505
- apex_free_string(html);
506
-
507
- /* Test remove transform */
508
- const char *remove_doc = "---\ntitle: Hello'World\n---\n\n[%title:remove(')]";
509
- html = apex_markdown_to_html(remove_doc, strlen(remove_doc), &opts);
510
- assert_contains(html, "HelloWorld", "remove transform");
511
- apex_free_string(html);
512
-
513
- /* Test repeat transform - escape the result to avoid markdown HR interpretation */
514
- const char *repeat_doc = "---\nsep: -\n---\n\n`[%sep:repeat(3)]`";
515
- html = apex_markdown_to_html(repeat_doc, strlen(repeat_doc), &opts);
516
- /* Check inside code span to avoid HR interpretation */
517
- assert_contains(html, "<code>---</code>", "repeat transform");
518
- apex_free_string(html);
519
-
520
- /* Test reverse transform */
521
- const char *reverse_doc = "---\ntext: Hello\n---\n\n[%text:reverse]";
522
- html = apex_markdown_to_html(reverse_doc, strlen(reverse_doc), &opts);
523
- assert_contains(html, "olleH", "reverse transform");
524
- apex_free_string(html);
525
-
526
- /* Test format transform */
527
- const char *format_doc = "---\nprice: 42.5\n---\n\n[%price:format($%.2f)]";
528
- html = apex_markdown_to_html(format_doc, strlen(format_doc), &opts);
529
- assert_contains(html, "$42.50", "format transform");
530
- apex_free_string(html);
531
-
532
- /* Test length transform */
533
- const char *length_doc = "---\ntext: Hello\n---\n\n[%text:length]";
534
- html = apex_markdown_to_html(length_doc, strlen(length_doc), &opts);
535
- assert_contains(html, "5", "length transform");
536
- apex_free_string(html);
537
-
538
- /* Test pad transform */
539
- const char *pad_doc = "---\nnumber: 42\n---\n\n[%number:pad(5,0)]";
540
- html = apex_markdown_to_html(pad_doc, strlen(pad_doc), &opts);
541
- assert_contains(html, "00042", "pad transform");
542
- apex_free_string(html);
543
-
544
- /* Test contains transform */
545
- const char *contains_doc = "---\ntags: javascript,html,css\n---\n\n[%tags:contains(javascript)]";
546
- html = apex_markdown_to_html(contains_doc, strlen(contains_doc), &opts);
547
- assert_contains(html, "true", "contains transform");
548
- apex_free_string(html);
549
-
550
- /* Test array transforms: split */
551
- const char *split_doc = "---\ntags: tag1,tag2,tag3\n---\n\n[%tags:split(,):first]";
552
- html = apex_markdown_to_html(split_doc, strlen(split_doc), &opts);
553
- assert_contains(html, "tag1", "split and first transforms");
554
- apex_free_string(html);
555
-
556
- /* Test array transforms: join */
557
- const char *join_doc = "---\ntags: tag1,tag2,tag3\n---\n\n[%tags:split(,):join( | )]";
558
- html = apex_markdown_to_html(join_doc, strlen(join_doc), &opts);
559
- assert_contains(html, "tag1 | tag2 | tag3", "split and join transforms");
560
- apex_free_string(html);
561
-
562
- /* Test array transforms: last */
563
- const char *last_doc = "---\ntags: tag1,tag2,tag3\n---\n\n[%tags:split(,):last]";
564
- html = apex_markdown_to_html(last_doc, strlen(last_doc), &opts);
565
- assert_contains(html, "tag3", "last transform");
566
- apex_free_string(html);
567
-
568
- /* Test array transforms: slice */
569
- const char *slice_doc = "---\ntags: tag1,tag2,tag3\n---\n\n[%tags:split(,):slice(0,2):join(,)]";
570
- html = apex_markdown_to_html(slice_doc, strlen(slice_doc), &opts);
571
- assert_contains(html, "tag1,tag2", "slice transform");
572
- apex_free_string(html);
573
-
574
- /* Test slice with string (character-by-character) */
575
- const char *slice_str_doc = "---\ntext: Hello\n---\n\n[%text:slice(0,5)]";
576
- html = apex_markdown_to_html(slice_str_doc, strlen(slice_str_doc), &opts);
577
- assert_contains(html, "Hello", "slice transform on string");
578
- apex_free_string(html);
579
-
580
- /* Test strftime transform */
581
- const char *strftime_doc = "---\ndate: 2024-03-15\n---\n\n[%date:strftime(%Y)]";
582
- html = apex_markdown_to_html(strftime_doc, strlen(strftime_doc), &opts);
583
- assert_contains(html, "2024", "strftime transform");
584
- apex_free_string(html);
585
-
586
- /* Test transform chaining */
587
- const char *chain_doc = "---\ntitle: hello world\n---\n\n# [%title:title:split( ):first]";
588
- html = apex_markdown_to_html(chain_doc, strlen(chain_doc), &opts);
589
- assert_contains(html, "Hello</h1>", "transform chaining");
590
- apex_free_string(html);
591
-
592
- /* Test transform chaining with date */
593
- const char *date_chain_doc = "---\ndate: 2024-03-15 14:30\n---\n\n[%date:strftime(%Y)]";
594
- html = apex_markdown_to_html(date_chain_doc, strlen(date_chain_doc), &opts);
595
- assert_contains(html, "2024", "strftime with time");
596
- apex_free_string(html);
597
-
598
- /* Test that transforms are disabled when flag is off */
599
- apex_options no_transforms = apex_options_for_mode(APEX_MODE_UNIFIED);
600
- no_transforms.enable_metadata_transforms = false;
601
- const char *disabled_doc = "---\ntitle: Hello\n---\n\n[%title:upper]";
602
- html = apex_markdown_to_html(disabled_doc, strlen(disabled_doc), &no_transforms);
603
- /* Should keep the transform syntax verbatim or use simple replacement */
604
- if (strstr(html, "[%title:upper]") != NULL || strstr(html, "Hello") != NULL) {
605
- test_result(true, "Transforms disabled when flag is off");
606
- } else {
607
- test_result(false, "Transforms not disabled when flag is off");
608
- }
609
- apex_free_string(html);
610
-
611
- /* Test that transforms are disabled in non-unified modes by default */
612
- apex_options mmd_opts = apex_options_for_mode(APEX_MODE_MULTIMARKDOWN);
613
- html = apex_markdown_to_html(disabled_doc, strlen(disabled_doc), &mmd_opts);
614
- if (strstr(html, "[%title:upper]") != NULL || strstr(html, "Hello") != NULL) {
615
- test_result(true, "Transforms disabled in MMD mode by default");
616
- } else {
617
- test_result(false, "Transforms incorrectly enabled in MMD mode");
618
- }
619
- apex_free_string(html);
620
-
621
- /* Test that simple [%key] still works with transforms enabled */
622
- const char *simple_doc = "---\ntitle: Hello\n---\n\n[%title]";
623
- html = apex_markdown_to_html(simple_doc, strlen(simple_doc), &opts);
624
- assert_contains(html, "Hello", "Simple metadata replacement still works");
625
- apex_free_string(html);
626
-
627
- bool had_failures = suite_end(suite_failures);
628
- print_suite_title("Metadata Transforms Tests", had_failures, false);
629
- }
630
-
631
- /**
632
- * Test wiki links
633
- */
634
-
635
- void test_metadata_control_options(void) {
636
- int suite_failures = suite_start();
637
- print_suite_title("Metadata Control of Options Tests", false, true);
638
-
639
- /* Test boolean options via metadata */
640
- apex_options opts = apex_options_default();
641
- opts.enable_indices = true; /* Start with indices enabled */
642
- opts.enable_wiki_links = false; /* Start with wikilinks disabled */
643
-
644
- /* Create metadata with boolean options */
645
- apex_metadata_item *metadata = NULL;
646
- apex_metadata_item *item;
647
-
648
- /* Test indices: false */
649
- item = malloc(sizeof(apex_metadata_item));
650
- item->key = strdup("indices");
651
- item->value = strdup("false");
652
- item->next = metadata;
653
- metadata = item;
654
-
655
- /* Test wikilinks: true */
656
- item = malloc(sizeof(apex_metadata_item));
657
- item->key = strdup("wikilinks");
658
- item->value = strdup("true");
659
- item->next = metadata;
660
- metadata = item;
661
-
662
- /* Test pretty: yes */
663
- item = malloc(sizeof(apex_metadata_item));
664
- item->key = strdup("pretty");
665
- item->value = strdup("yes");
666
- item->next = metadata;
667
- metadata = item;
668
-
669
- /* Test standalone: 1 */
670
- item = malloc(sizeof(apex_metadata_item));
671
- item->key = strdup("standalone");
672
- item->value = strdup("1");
673
- item->next = metadata;
674
- metadata = item;
675
-
676
- /* Apply metadata */
677
- apex_apply_metadata_to_options(metadata, &opts);
678
-
679
- /* Verify boolean options */
680
- assert_option_bool(opts.enable_indices, false, "indices: false sets enable_indices to false");
681
- assert_option_bool(opts.enable_wiki_links, true, "wikilinks: true sets enable_wiki_links to true");
682
- assert_option_bool(opts.pretty, true, "pretty: yes sets pretty to true");
683
- assert_option_bool(opts.standalone, true, "standalone: 1 sets standalone to true");
684
-
685
- /* Clean up */
686
- apex_free_metadata(metadata);
687
- metadata = NULL;
688
-
689
- /* Test string options */
690
- opts = apex_options_default();
691
- item = malloc(sizeof(apex_metadata_item));
692
- item->key = strdup("title");
693
- item->value = strdup("My Test Document");
694
- item->next = NULL;
695
- metadata = item;
696
-
697
- item = malloc(sizeof(apex_metadata_item));
698
- item->key = strdup("csl");
699
- item->value = strdup("apa.csl");
700
- item->next = metadata;
701
- metadata = item;
702
-
703
- item = malloc(sizeof(apex_metadata_item));
704
- item->key = strdup("id-format");
705
- item->value = strdup("mmd");
706
- item->next = metadata;
707
- metadata = item;
708
-
709
- item = malloc(sizeof(apex_metadata_item));
710
- item->key = strdup("toc-min-max");
711
- item->value = strdup("2,4");
712
- item->next = metadata;
713
- metadata = item;
714
-
715
- apex_apply_metadata_to_options(metadata, &opts);
716
-
717
- assert_option_string(opts.document_title, "My Test Document", "title sets document_title");
718
- assert_option_string(opts.csl_file, "apa.csl", "csl sets csl_file");
719
- assert_option_bool(opts.id_format == 1, true, "id-format: mmd sets id_format to 1 (MMD)");
720
- assert_option_bool(opts.toc_min == 2, true, "toc-min-max: 2,4 sets toc_min to 2");
721
- assert_option_bool(opts.toc_max == 4, true, "toc-min-max: 2,4 sets toc_max to 4");
722
-
723
- apex_free_metadata(metadata);
724
- metadata = NULL;
725
-
726
- /* Test mode option (should reset options) */
727
- opts = apex_options_default();
728
- opts.enable_indices = true;
729
- opts.enable_wiki_links = true;
730
-
731
- item = malloc(sizeof(apex_metadata_item));
732
- item->key = strdup("mode");
733
- item->value = strdup("gfm");
734
- item->next = NULL;
735
- metadata = item;
736
-
737
- item = malloc(sizeof(apex_metadata_item));
738
- item->key = strdup("wikilinks");
739
- item->value = strdup("true");
740
- item->next = metadata;
741
- metadata = item;
742
-
743
- apex_apply_metadata_to_options(metadata, &opts);
744
-
745
- assert_option_bool(opts.mode == APEX_MODE_GFM, true, "mode: gfm sets mode to GFM");
746
- /* After mode reset, wikilinks should still be applied */
747
- assert_option_bool(opts.enable_wiki_links, true, "wikilinks applied after mode reset");
748
-
749
- apex_free_metadata(metadata);
750
- metadata = NULL;
751
-
752
- /* Test case-insensitive boolean values */
753
- opts = apex_options_default();
754
- item = malloc(sizeof(apex_metadata_item));
755
- item->key = strdup("indices");
756
- item->value = strdup("TRUE");
757
- item->next = NULL;
758
- metadata = item;
759
-
760
- item = malloc(sizeof(apex_metadata_item));
761
- item->key = strdup("wikilinks");
762
- item->value = strdup("FALSE");
763
- item->next = metadata;
764
- metadata = item;
765
-
766
- apex_apply_metadata_to_options(metadata, &opts);
767
-
768
- assert_option_bool(opts.enable_indices, true, "indices: TRUE (uppercase) sets enable_indices to true");
769
- assert_option_bool(opts.enable_wiki_links, false, "wikilinks: FALSE (uppercase) sets enable_wiki_links to false");
770
-
771
- apex_free_metadata(metadata);
772
- metadata = NULL;
773
-
774
- /* Test more boolean options */
775
- opts = apex_options_default();
776
- item = malloc(sizeof(apex_metadata_item));
777
- item->key = strdup("relaxed-tables");
778
- item->value = strdup("true");
779
- item->next = NULL;
780
- metadata = item;
781
-
782
- item = malloc(sizeof(apex_metadata_item));
783
- item->key = strdup("link-citations");
784
- item->value = strdup("yes");
785
- item->next = metadata;
786
- metadata = item;
787
-
788
- item = malloc(sizeof(apex_metadata_item));
789
- item->key = strdup("suppress-bibliography");
790
- item->value = strdup("1");
791
- item->next = metadata;
792
- metadata = item;
793
-
794
- apex_apply_metadata_to_options(metadata, &opts);
795
-
796
- assert_option_bool(opts.relaxed_tables, true, "relaxed-tables: true sets relaxed_tables");
797
- assert_option_bool(opts.link_citations, true, "link-citations: yes sets link_citations");
798
- assert_option_bool(opts.suppress_bibliography, true, "suppress-bibliography: 1 sets suppress_bibliography");
799
-
800
- apex_free_metadata(metadata);
801
-
802
- /* Test public API for loading and applying metadata from a file */
803
- #ifdef TEST_FIXTURES_DIR
804
- opts = apex_options_default();
805
- opts.enable_indices = true;
806
- char public_metadata_file_path[512];
807
- snprintf(public_metadata_file_path, sizeof(public_metadata_file_path), "%s/metadata_options.yml", TEST_FIXTURES_DIR);
808
-
809
- assert_option_bool(apex_options_apply_meta_file(NULL, public_metadata_file_path), false,
810
- "metadata file API rejects NULL options");
811
- assert_option_bool(apex_options_apply_meta_file(&opts, NULL), false,
812
- "metadata file API rejects NULL path");
813
- assert_option_bool(apex_options_apply_meta_file(&opts, ""), false,
814
- "metadata file API rejects empty path");
815
- assert_option_bool(apex_options_apply_meta_file(&opts, "/no/such/apex-metadata-file.yml"), false,
816
- "metadata file API rejects missing file");
817
- assert_option_bool(opts.enable_indices, true,
818
- "metadata file API leaves options unchanged on failure");
819
- assert_option_bool(apex_options_apply_meta_file(&opts, public_metadata_file_path), true,
820
- "metadata file API loads a valid file");
821
- assert_option_bool(opts.enable_indices, false,
822
- "metadata file API applies boolean options");
823
- assert_option_string(opts.csl_file, "test.csl",
824
- "metadata file API owns csl after returning");
825
- assert_option_string(opts.document_title, "Test Document from File",
826
- "metadata file API owns title after returning");
827
- #endif
828
-
829
- /* Test loading metadata from file */
830
- #ifdef TEST_FIXTURES_DIR
831
- opts = apex_options_default();
832
- char metadata_file_path[512];
833
- snprintf(metadata_file_path, sizeof(metadata_file_path), "%s/metadata_options.yml", TEST_FIXTURES_DIR);
834
- apex_metadata_item *file_metadata = apex_load_metadata_from_file(metadata_file_path);
835
- if (file_metadata) {
836
- apex_apply_metadata_to_options(file_metadata, &opts);
837
-
838
- assert_option_bool(opts.enable_indices, false, "metadata file: indices: false");
839
- assert_option_bool(opts.enable_wiki_links, true, "metadata file: wikilinks: true");
840
- assert_option_bool(opts.pretty, true, "metadata file: pretty: true");
841
- assert_option_bool(opts.standalone, true, "metadata file: standalone: true");
842
- assert_option_string(opts.document_title, "Test Document from File", "metadata file: title");
843
- assert_option_string(opts.csl_file, "test.csl", "metadata file: csl");
844
- assert_option_bool(opts.id_format == 2, true, "metadata file: id-format: kramdown sets id_format to 2");
845
- assert_option_bool(opts.link_citations, true, "metadata file: link-citations: true");
846
- assert_option_bool(opts.suppress_bibliography, false, "metadata file: suppress-bibliography: false");
847
-
848
- apex_free_metadata(file_metadata);
849
- } else {
850
- tests_run++;
851
- tests_failed++;
852
- printf(COLOR_RED "✗" COLOR_RESET " metadata file: Failed to load metadata_options.yml\n");
853
- }
854
- #endif
855
-
856
- bool had_failures = suite_end(suite_failures);
857
- print_suite_title("Metadata Control of Options Tests", had_failures, false);
858
- }
859
-
860
- /**
861
- * Test syntax highlighting options via metadata
862
- */
863
- void test_syntax_highlight_options(void) {
864
- int suite_failures = suite_start();
865
- print_suite_title("Syntax Highlighting Options Tests", false, true);
866
-
867
- apex_options opts;
868
- apex_metadata_item *metadata = NULL;
869
- apex_metadata_item *item;
870
-
871
- /* Test code-highlight option: pygments (full name) */
872
- opts = apex_options_default();
873
- item = malloc(sizeof(apex_metadata_item));
874
- item->key = strdup("code-highlight");
875
- item->value = strdup("pygments");
876
- item->next = NULL;
877
- metadata = item;
878
-
879
- apex_apply_metadata_to_options(metadata, &opts);
880
- assert_option_string(opts.code_highlighter, "pygments", "code-highlight: pygments sets code_highlighter");
881
- apex_free_metadata(metadata);
882
- metadata = NULL;
883
-
884
- /* Test code-highlight option: skylighting (full name) */
885
- opts = apex_options_default();
886
- item = malloc(sizeof(apex_metadata_item));
887
- item->key = strdup("code-highlight");
888
- item->value = strdup("skylighting");
889
- item->next = NULL;
890
- metadata = item;
891
-
892
- apex_apply_metadata_to_options(metadata, &opts);
893
- assert_option_string(opts.code_highlighter, "skylighting", "code-highlight: skylighting sets code_highlighter");
894
- apex_free_metadata(metadata);
895
- metadata = NULL;
896
-
897
- /* Test code-highlight option: p (abbreviation for pygments) */
898
- opts = apex_options_default();
899
- item = malloc(sizeof(apex_metadata_item));
900
- item->key = strdup("code-highlight");
901
- item->value = strdup("p");
902
- item->next = NULL;
903
- metadata = item;
904
-
905
- apex_apply_metadata_to_options(metadata, &opts);
906
- assert_option_string(opts.code_highlighter, "pygments", "code-highlight: p (abbreviation) sets pygments");
907
- apex_free_metadata(metadata);
908
- metadata = NULL;
909
-
910
- /* Test code-highlight option: s (abbreviation for skylighting) */
911
- opts = apex_options_default();
912
- item = malloc(sizeof(apex_metadata_item));
913
- item->key = strdup("code-highlight");
914
- item->value = strdup("s");
915
- item->next = NULL;
916
- metadata = item;
917
-
918
- apex_apply_metadata_to_options(metadata, &opts);
919
- assert_option_string(opts.code_highlighter, "skylighting", "code-highlight: s (abbreviation) sets skylighting");
920
- apex_free_metadata(metadata);
921
- metadata = NULL;
922
-
923
- /* Test code-highlight option: pyg (abbreviation for pygments) */
924
- opts = apex_options_default();
925
- item = malloc(sizeof(apex_metadata_item));
926
- item->key = strdup("code-highlight");
927
- item->value = strdup("pyg");
928
- item->next = NULL;
929
- metadata = item;
930
-
931
- apex_apply_metadata_to_options(metadata, &opts);
932
- assert_option_string(opts.code_highlighter, "pygments", "code-highlight: pyg (abbreviation) sets pygments");
933
- apex_free_metadata(metadata);
934
- metadata = NULL;
935
-
936
- /* Test code-highlight option: sky (abbreviation for skylighting) */
937
- opts = apex_options_default();
938
- item = malloc(sizeof(apex_metadata_item));
939
- item->key = strdup("code-highlight");
940
- item->value = strdup("sky");
941
- item->next = NULL;
942
- metadata = item;
943
-
944
- apex_apply_metadata_to_options(metadata, &opts);
945
- assert_option_string(opts.code_highlighter, "skylighting", "code-highlight: sky (abbreviation) sets skylighting");
946
- apex_free_metadata(metadata);
947
- metadata = NULL;
948
-
949
- /* Test code-highlight option: shiki (full name) */
950
- opts = apex_options_default();
951
- item = malloc(sizeof(apex_metadata_item));
952
- item->key = strdup("code-highlight");
953
- item->value = strdup("shiki");
954
- item->next = NULL;
955
- metadata = item;
956
-
957
- apex_apply_metadata_to_options(metadata, &opts);
958
- assert_option_string(opts.code_highlighter, "shiki", "code-highlight: shiki sets code_highlighter");
959
- apex_free_metadata(metadata);
960
- metadata = NULL;
961
-
962
- /* Test code-highlight option: sh (abbreviation for shiki) */
963
- opts = apex_options_default();
964
- item = malloc(sizeof(apex_metadata_item));
965
- item->key = strdup("code-highlight");
966
- item->value = strdup("sh");
967
- item->next = NULL;
968
- metadata = item;
969
-
970
- apex_apply_metadata_to_options(metadata, &opts);
971
- assert_option_string(opts.code_highlighter, "shiki", "code-highlight: sh (abbreviation) sets shiki");
972
- apex_free_metadata(metadata);
973
- metadata = NULL;
974
-
975
- /* Test code-highlight option: false disables */
976
- opts = apex_options_default();
977
- opts.code_highlighter = "pygments"; /* Start with it enabled */
978
- item = malloc(sizeof(apex_metadata_item));
979
- item->key = strdup("code-highlight");
980
- item->value = strdup("false");
981
- item->next = NULL;
982
- metadata = item;
983
-
984
- apex_apply_metadata_to_options(metadata, &opts);
985
- assert_option_bool(opts.code_highlighter == NULL, true, "code-highlight: false disables highlighting");
986
- apex_free_metadata(metadata);
987
- metadata = NULL;
988
-
989
- /* Test code-highlight option: none disables */
990
- opts = apex_options_default();
991
- opts.code_highlighter = "pygments"; /* Start with it enabled */
992
- item = malloc(sizeof(apex_metadata_item));
993
- item->key = strdup("code-highlight");
994
- item->value = strdup("none");
995
- item->next = NULL;
996
- metadata = item;
997
-
998
- apex_apply_metadata_to_options(metadata, &opts);
999
- assert_option_bool(opts.code_highlighter == NULL, true, "code-highlight: none disables highlighting");
1000
- apex_free_metadata(metadata);
1001
- metadata = NULL;
1002
-
1003
- /* Test code-line-numbers option: true */
1004
- opts = apex_options_default();
1005
- item = malloc(sizeof(apex_metadata_item));
1006
- item->key = strdup("code-line-numbers");
1007
- item->value = strdup("true");
1008
- item->next = NULL;
1009
- metadata = item;
1010
-
1011
- apex_apply_metadata_to_options(metadata, &opts);
1012
- assert_option_bool(opts.code_line_numbers, true, "code-line-numbers: true enables line numbers");
1013
- apex_free_metadata(metadata);
1014
- metadata = NULL;
1015
-
1016
- /* Test code-line-numbers option: false */
1017
- opts = apex_options_default();
1018
- opts.code_line_numbers = true; /* Start enabled */
1019
- item = malloc(sizeof(apex_metadata_item));
1020
- item->key = strdup("code-line-numbers");
1021
- item->value = strdup("false");
1022
- item->next = NULL;
1023
- metadata = item;
1024
-
1025
- apex_apply_metadata_to_options(metadata, &opts);
1026
- assert_option_bool(opts.code_line_numbers, false, "code-line-numbers: false disables line numbers");
1027
- apex_free_metadata(metadata);
1028
- metadata = NULL;
1029
-
1030
- /* paginate: symbols */
1031
- opts = apex_options_default();
1032
- item = malloc(sizeof(apex_metadata_item));
1033
- item->key = strdup("paginate");
1034
- item->value = strdup("symbols");
1035
- item->next = NULL;
1036
- metadata = item;
1037
-
1038
- apex_apply_metadata_to_options(metadata, &opts);
1039
- assert_option_bool(opts.paginate, true, "paginate: symbols enables paginate");
1040
- assert_option_bool(opts.paginate_symbols, true, "paginate: symbols enables paginate_symbols");
1041
- apex_free_metadata(metadata);
1042
- metadata = NULL;
1043
-
1044
- /* Test code_line_numbers option with underscore (alternate key format) */
1045
- opts = apex_options_default();
1046
- item = malloc(sizeof(apex_metadata_item));
1047
- item->key = strdup("code_line_numbers");
1048
- item->value = strdup("yes");
1049
- item->next = NULL;
1050
- metadata = item;
1051
-
1052
- apex_apply_metadata_to_options(metadata, &opts);
1053
- assert_option_bool(opts.code_line_numbers, true, "code_line_numbers (underscore): yes enables line numbers");
1054
- apex_free_metadata(metadata);
1055
- metadata = NULL;
1056
-
1057
- /* Test highlight-language-only option: true */
1058
- opts = apex_options_default();
1059
- item = malloc(sizeof(apex_metadata_item));
1060
- item->key = strdup("highlight-language-only");
1061
- item->value = strdup("true");
1062
- item->next = NULL;
1063
- metadata = item;
1064
-
1065
- apex_apply_metadata_to_options(metadata, &opts);
1066
- assert_option_bool(opts.highlight_language_only, true, "highlight-language-only: true enables language-only mode");
1067
- apex_free_metadata(metadata);
1068
- metadata = NULL;
1069
-
1070
- /* Test highlight-language-only option: false */
1071
- opts = apex_options_default();
1072
- opts.highlight_language_only = true; /* Start enabled */
1073
- item = malloc(sizeof(apex_metadata_item));
1074
- item->key = strdup("highlight-language-only");
1075
- item->value = strdup("false");
1076
- item->next = NULL;
1077
- metadata = item;
1078
-
1079
- apex_apply_metadata_to_options(metadata, &opts);
1080
- assert_option_bool(opts.highlight_language_only, false, "highlight-language-only: false disables language-only mode");
1081
- apex_free_metadata(metadata);
1082
- metadata = NULL;
1083
-
1084
- /* Test highlight_language_only option with underscore (alternate key format) */
1085
- opts = apex_options_default();
1086
- item = malloc(sizeof(apex_metadata_item));
1087
- item->key = strdup("highlight_language_only");
1088
- item->value = strdup("1");
1089
- item->next = NULL;
1090
- metadata = item;
1091
-
1092
- apex_apply_metadata_to_options(metadata, &opts);
1093
- assert_option_bool(opts.highlight_language_only, true, "highlight_language_only (underscore): 1 enables language-only mode");
1094
- apex_free_metadata(metadata);
1095
- metadata = NULL;
1096
-
1097
- /* Test combined syntax highlighting options */
1098
- opts = apex_options_default();
1099
- item = malloc(sizeof(apex_metadata_item));
1100
- item->key = strdup("code-highlight");
1101
- item->value = strdup("pygments");
1102
- item->next = NULL;
1103
- metadata = item;
1104
-
1105
- item = malloc(sizeof(apex_metadata_item));
1106
- item->key = strdup("code-line-numbers");
1107
- item->value = strdup("true");
1108
- item->next = metadata;
1109
- metadata = item;
1110
-
1111
- item = malloc(sizeof(apex_metadata_item));
1112
- item->key = strdup("highlight-language-only");
1113
- item->value = strdup("true");
1114
- item->next = metadata;
1115
- metadata = item;
1116
-
1117
- apex_apply_metadata_to_options(metadata, &opts);
1118
- assert_option_string(opts.code_highlighter, "pygments", "Combined: code-highlight set");
1119
- assert_option_bool(opts.code_line_numbers, true, "Combined: code-line-numbers set");
1120
- assert_option_bool(opts.highlight_language_only, true, "Combined: highlight-language-only set");
1121
- apex_free_metadata(metadata);
1122
- metadata = NULL;
1123
-
1124
- /* Test via YAML front matter in document */
1125
- apex_options yaml_opts = apex_options_for_mode(APEX_MODE_UNIFIED);
1126
- char *html;
1127
-
1128
- /* Note: We can't fully test external highlighting without the tools installed,
1129
- * but we can verify that the options are parsed from YAML metadata correctly.
1130
- * The actual highlighting would require pygments/skylighting to be installed. */
1131
-
1132
- /* Test that code blocks are rendered when no highlighting tool is available */
1133
- const char *code_doc = "---\ncode-highlight: pygments\n---\n\n```python\nprint('hello')\n```";
1134
- html = apex_markdown_to_html(code_doc, strlen(code_doc), &yaml_opts);
1135
- /* Should have code block regardless of whether pygments is available */
1136
- assert_contains(html, "<pre", "Code block has pre tag");
1137
- assert_contains(html, "<code", "Code block has code tag");
1138
- assert_contains(html, "print", "Code content preserved");
1139
- apex_free_string(html);
1140
-
1141
- bool had_failures = suite_end(suite_failures);
1142
- print_suite_title("Syntax Highlighting Options Tests", had_failures, false);
1143
- }
1144
-
1145
- /**
1146
- * Test ARIA labels and accessibility attributes
1147
- */