apex-ruby 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +119 -0
  3. data/apex-ruby.gemspec +31 -0
  4. data/ext/apex_ext/apex_ext.c +215 -0
  5. data/ext/apex_ext/apex_src/BENCHMARK.md +32 -0
  6. data/ext/apex_ext/apex_src/BENCHMARK_COMPARISON.md +67 -0
  7. data/ext/apex_ext/apex_src/CHANGELOG.md +2454 -0
  8. data/ext/apex_ext/apex_src/CMakeLists.txt +454 -0
  9. data/ext/apex_ext/apex_src/Dockerfile.linux-build +15 -0
  10. data/ext/apex_ext/apex_src/Formula/apex.rb +38 -0
  11. data/ext/apex_ext/apex_src/Info.plist.in +27 -0
  12. data/ext/apex_ext/apex_src/LICENSE +21 -0
  13. data/ext/apex_ext/apex_src/Package.swift +160 -0
  14. data/ext/apex_ext/apex_src/PackageSupport/README.md +17 -0
  15. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark-gfm_export.h +20 -0
  16. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark-gfm_version.h +14 -0
  17. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/cmark_gfm_spm_stub.c +4 -0
  18. data/ext/apex_ext/apex_src/PackageSupport/cmark-gfm/config.h +41 -0
  19. data/ext/apex_ext/apex_src/README.md +452 -0
  20. data/ext/apex_ext/apex_src/VERSION +1 -0
  21. data/ext/apex_ext/apex_src/apex-header-2-rb@2x.webp +0 -0
  22. data/ext/apex_ext/apex_src/apex-plugins.json.example +20 -0
  23. data/ext/apex_ext/apex_src/apex.pc.in +11 -0
  24. data/ext/apex_ext/apex_src/cli/main.c +2720 -0
  25. data/ext/apex_ext/apex_src/debug_test.sh +22 -0
  26. data/ext/apex_ext/apex_src/docs/API_REFERENCE.md +451 -0
  27. data/ext/apex_ext/apex_src/docs/ARCHITECTURE.md +166 -0
  28. data/ext/apex_ext/apex_src/docs/CMARK_INTEGRATION.md +220 -0
  29. data/ext/apex_ext/apex_src/docs/CRITICMARKUP.md +501 -0
  30. data/ext/apex_ext/apex_src/docs/DEBUGGING.md +73 -0
  31. data/ext/apex_ext/apex_src/docs/FINAL_STATUS.md +391 -0
  32. data/ext/apex_ext/apex_src/docs/FINAL_STATUS_UPDATE.md +237 -0
  33. data/ext/apex_ext/apex_src/docs/FUTURE_FEATURES.md +456 -0
  34. data/ext/apex_ext/apex_src/docs/IAL_FEATURES.md +210 -0
  35. data/ext/apex_ext/apex_src/docs/IAL_STATUS.md +344 -0
  36. data/ext/apex_ext/apex_src/docs/INTEGRATION_EXAMPLE.m +144 -0
  37. data/ext/apex_ext/apex_src/docs/LIMITATIONS_RESOLVED.md +278 -0
  38. data/ext/apex_ext/apex_src/docs/OUTPUT_MODES.md +321 -0
  39. data/ext/apex_ext/apex_src/docs/PROGRESS.md +167 -0
  40. data/ext/apex_ext/apex_src/docs/STANDALONE_FEATURE.md +174 -0
  41. data/ext/apex_ext/apex_src/docs/TABLE_SPANS_STATUS.md +243 -0
  42. data/ext/apex_ext/apex_src/docs/TEST_COVERAGE.md +316 -0
  43. data/ext/apex_ext/apex_src/docs/USER_GUIDE.md +803 -0
  44. data/ext/apex_ext/apex_src/docs/WIKI_LINKS_ISSUE.md +91 -0
  45. data/ext/apex_ext/apex_src/documentation/README.md +160 -0
  46. data/ext/apex_ext/apex_src/documentation/docsets/Apex Command Line Options.cheatsheet.txt +365 -0
  47. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Info.plist +24 -0
  48. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/C-API.html +1737 -0
  49. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Citations.html +1420 -0
  50. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Command-Line-Options.html +3574 -0
  51. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Configuration.html +1603 -0
  52. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Credits.html +910 -0
  53. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Examples.html +1168 -0
  54. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Getting-Started.html +1003 -0
  55. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Header-IDs.html +1308 -0
  56. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Home.html +1078 -0
  57. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Inline-Attribute-Lists.html +1622 -0
  58. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Installation.html +1168 -0
  59. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Limitations-and-Roadmap.html +1698 -0
  60. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Metadata-Transforms.html +1531 -0
  61. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Modes.html +1980 -0
  62. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Multi-File-Documents.html +1368 -0
  63. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Pandoc-Integration.html +1151 -0
  64. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Plugins.html +2861 -0
  65. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Syntax.html +3981 -0
  66. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Troubleshooting.html +1454 -0
  67. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Usage.html +1200 -0
  68. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/Documents/Xcode-Integration.html +2066 -0
  69. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/docSet.dsidx +0 -0
  70. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  71. data/ext/apex_ext/apex_src/documentation/docsets/Apex.docset/Contents/Resources/tempOptimizedIndex.dsidx +0 -0
  72. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Info.plist +22 -0
  73. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans.woff +0 -0
  74. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold.woff +0 -0
  75. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Bold_Italic.woff +0 -0
  76. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold.woff +0 -0
  77. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Extrabold_Italic.woff +0 -0
  78. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Italic.woff +0 -0
  79. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold.woff +0 -0
  80. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/cheatset_resources/Open_Sans_Semibold_Italic.woff +0 -0
  81. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/index.html +914 -0
  82. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/Documents/style.css +399 -0
  83. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/docSet.dsidx +0 -0
  84. data/ext/apex_ext/apex_src/documentation/docsets/ApexCLI.docset/Contents/Resources/optimizedIndex.dsidx +0 -0
  85. data/ext/apex_ext/apex_src/documentation/generate_app_docs.rb +772 -0
  86. data/ext/apex_ext/apex_src/documentation/generate_app_docs_ai.rb +678 -0
  87. data/ext/apex_ext/apex_src/documentation/generate_docset.rb +873 -0
  88. data/ext/apex_ext/apex_src/documentation/generate_single_html.rb +733 -0
  89. data/ext/apex_ext/apex_src/documentation/html/apex-docs.html +17073 -0
  90. data/ext/apex_ext/apex_src/documentation/shared_scripts.js +64 -0
  91. data/ext/apex_ext/apex_src/documentation/shared_styles.css +646 -0
  92. data/ext/apex_ext/apex_src/documentation/transform_for_app.example.md +260 -0
  93. data/ext/apex_ext/apex_src/examples/bracketed_spans_demo.md +119 -0
  94. data/ext/apex_ext/apex_src/examples/emoji_span_plugin.yml +11 -0
  95. data/ext/apex_ext/apex_src/examples/example.html +53 -0
  96. data/ext/apex_ext/apex_src/examples/example.md +85 -0
  97. data/ext/apex_ext/apex_src/examples/fenced_divs_demo.md +158 -0
  98. data/ext/apex_ext/apex_src/examples/kbd.md +8 -0
  99. data/ext/apex_ext/apex_src/examples/kbd_plugin.rb +250 -0
  100. data/ext/apex_ext/apex_src/examples/kbd_plugin.yml +9 -0
  101. data/ext/apex_ext/apex_src/icon/apexicon-outline-black.png +0 -0
  102. data/ext/apex_ext/apex_src/icon/apexicon-outline-black@2x.png +0 -0
  103. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark.png +0 -0
  104. data/ext/apex_ext/apex_src/icon/apexicon-outline-mark@2x.png +0 -0
  105. data/ext/apex_ext/apex_src/icon/apexicon-outline-white.png +0 -0
  106. data/ext/apex_ext/apex_src/icon/apexicon-outline-white@2x.png +0 -0
  107. data/ext/apex_ext/apex_src/icon/apexicon.png +0 -0
  108. data/ext/apex_ext/apex_src/icon/apexicon@2x.png +0 -0
  109. data/ext/apex_ext/apex_src/include/apex/apex.h +247 -0
  110. data/ext/apex_ext/apex_src/include/apex/buffer.h +93 -0
  111. data/ext/apex_ext/apex_src/include/apex/module.modulemap +16 -0
  112. data/ext/apex_ext/apex_src/include/apex/parser.h +150 -0
  113. data/ext/apex_ext/apex_src/include/apex/renderer.h +39 -0
  114. data/ext/apex_ext/apex_src/man/apex-config.5 +374 -0
  115. data/ext/apex_ext/apex_src/man/apex-config.5.md +260 -0
  116. data/ext/apex_ext/apex_src/man/apex-plugins.7 +456 -0
  117. data/ext/apex_ext/apex_src/man/apex-plugins.7.md +365 -0
  118. data/ext/apex_ext/apex_src/man/apex.1 +828 -0
  119. data/ext/apex_ext/apex_src/man/apex.1.md +643 -0
  120. data/ext/apex_ext/apex_src/man/apex.1.new +338 -0
  121. data/ext/apex_ext/apex_src/objc/Apex.swift +237 -0
  122. data/ext/apex_ext/apex_src/objc/NSString+Apex.h +117 -0
  123. data/ext/apex_ext/apex_src/objc/NSString+Apex.m +332 -0
  124. data/ext/apex_ext/apex_src/src/_README.md +358 -0
  125. data/ext/apex_ext/apex_src/src/apex.c +6326 -0
  126. data/ext/apex_ext/apex_src/src/buffer.c +93 -0
  127. data/ext/apex_ext/apex_src/src/extensions/abbreviations.c +362 -0
  128. data/ext/apex_ext/apex_src/src/extensions/abbreviations.h +45 -0
  129. data/ext/apex_ext/apex_src/src/extensions/advanced_footnotes.c +184 -0
  130. data/ext/apex_ext/apex_src/src/extensions/advanced_footnotes.h +50 -0
  131. data/ext/apex_ext/apex_src/src/extensions/advanced_tables.c +1897 -0
  132. data/ext/apex_ext/apex_src/src/extensions/advanced_tables.h +42 -0
  133. data/ext/apex_ext/apex_src/src/extensions/callouts.c +215 -0
  134. data/ext/apex_ext/apex_src/src/extensions/callouts.h +53 -0
  135. data/ext/apex_ext/apex_src/src/extensions/citations.c +2042 -0
  136. data/ext/apex_ext/apex_src/src/extensions/citations.h +163 -0
  137. data/ext/apex_ext/apex_src/src/extensions/critic.c +329 -0
  138. data/ext/apex_ext/apex_src/src/extensions/critic.h +48 -0
  139. data/ext/apex_ext/apex_src/src/extensions/definition_list.c +1670 -0
  140. data/ext/apex_ext/apex_src/src/extensions/definition_list.h +42 -0
  141. data/ext/apex_ext/apex_src/src/extensions/emoji.c +710 -0
  142. data/ext/apex_ext/apex_src/src/extensions/emoji.h +38 -0
  143. data/ext/apex_ext/apex_src/src/extensions/emoji_data.h +942 -0
  144. data/ext/apex_ext/apex_src/src/extensions/fenced_divs.c +925 -0
  145. data/ext/apex_ext/apex_src/src/extensions/fenced_divs.h +43 -0
  146. data/ext/apex_ext/apex_src/src/extensions/github-emoji.txt +869 -0
  147. data/ext/apex_ext/apex_src/src/extensions/grid_tables.c +1121 -0
  148. data/ext/apex_ext/apex_src/src/extensions/grid_tables.h +33 -0
  149. data/ext/apex_ext/apex_src/src/extensions/header_ids.c +626 -0
  150. data/ext/apex_ext/apex_src/src/extensions/header_ids.h +60 -0
  151. data/ext/apex_ext/apex_src/src/extensions/highlight.c +135 -0
  152. data/ext/apex_ext/apex_src/src/extensions/highlight.h +16 -0
  153. data/ext/apex_ext/apex_src/src/extensions/html_markdown.c +408 -0
  154. data/ext/apex_ext/apex_src/src/extensions/html_markdown.h +42 -0
  155. data/ext/apex_ext/apex_src/src/extensions/ial.c +4084 -0
  156. data/ext/apex_ext/apex_src/src/extensions/ial.h +145 -0
  157. data/ext/apex_ext/apex_src/src/extensions/includes.c +1536 -0
  158. data/ext/apex_ext/apex_src/src/extensions/includes.h +54 -0
  159. data/ext/apex_ext/apex_src/src/extensions/index.c +967 -0
  160. data/ext/apex_ext/apex_src/src/extensions/index.h +90 -0
  161. data/ext/apex_ext/apex_src/src/extensions/inline_footnotes.c +205 -0
  162. data/ext/apex_ext/apex_src/src/extensions/inline_footnotes.h +34 -0
  163. data/ext/apex_ext/apex_src/src/extensions/inline_tables.c +332 -0
  164. data/ext/apex_ext/apex_src/src/extensions/inline_tables.h +13 -0
  165. data/ext/apex_ext/apex_src/src/extensions/insert.c +248 -0
  166. data/ext/apex_ext/apex_src/src/extensions/insert.h +18 -0
  167. data/ext/apex_ext/apex_src/src/extensions/math.c +279 -0
  168. data/ext/apex_ext/apex_src/src/extensions/math.h +32 -0
  169. data/ext/apex_ext/apex_src/src/extensions/metadata.c +3046 -0
  170. data/ext/apex_ext/apex_src/src/extensions/metadata.h +125 -0
  171. data/ext/apex_ext/apex_src/src/extensions/relaxed_tables.c +1297 -0
  172. data/ext/apex_ext/apex_src/src/extensions/relaxed_tables.h +39 -0
  173. data/ext/apex_ext/apex_src/src/extensions/special_markers.c +194 -0
  174. data/ext/apex_ext/apex_src/src/extensions/special_markers.h +29 -0
  175. data/ext/apex_ext/apex_src/src/extensions/sup_sub.c +405 -0
  176. data/ext/apex_ext/apex_src/src/extensions/sup_sub.h +16 -0
  177. data/ext/apex_ext/apex_src/src/extensions/syntax_highlight.c +468 -0
  178. data/ext/apex_ext/apex_src/src/extensions/syntax_highlight.h +44 -0
  179. data/ext/apex_ext/apex_src/src/extensions/table_html_postprocess.c +2679 -0
  180. data/ext/apex_ext/apex_src/src/extensions/table_html_postprocess.h +23 -0
  181. data/ext/apex_ext/apex_src/src/extensions/toc.c +255 -0
  182. data/ext/apex_ext/apex_src/src/extensions/toc.h +34 -0
  183. data/ext/apex_ext/apex_src/src/extensions/wiki_links.c +624 -0
  184. data/ext/apex_ext/apex_src/src/extensions/wiki_links.h +58 -0
  185. data/ext/apex_ext/apex_src/src/html_renderer.c +2762 -0
  186. data/ext/apex_ext/apex_src/src/html_renderer.h +126 -0
  187. data/ext/apex_ext/apex_src/src/parser.c +227 -0
  188. data/ext/apex_ext/apex_src/src/plugins.c +895 -0
  189. data/ext/apex_ext/apex_src/src/plugins.h +39 -0
  190. data/ext/apex_ext/apex_src/src/plugins_env.c +187 -0
  191. data/ext/apex_ext/apex_src/src/plugins_remote.c +263 -0
  192. data/ext/apex_ext/apex_src/src/pretty_html.c +358 -0
  193. data/ext/apex_ext/apex_src/src/renderer.c +241 -0
  194. data/ext/apex_ext/apex_src/src/utf8.c +56 -0
  195. data/ext/apex_ext/apex_src/test-linux-build.sh +20 -0
  196. data/ext/apex_ext/apex_src/test.html +103 -0
  197. data/ext/apex_ext/apex_src/test_coverage.sh +121 -0
  198. data/ext/apex_ext/apex_src/test_ial_fenced.md +6 -0
  199. data/ext/apex_ext/apex_src/test_math_norm.py +79 -0
  200. data/ext/apex_ext/apex_src/test_pandoc_output.html +48 -0
  201. data/ext/apex_ext/apex_src/test_spm.sh +107 -0
  202. data/ext/apex_ext/apex_src/tests/ApexSPMTest/main.swift +50 -0
  203. data/ext/apex_ext/apex_src/tests/BENCHMARK_RESULTS.md +229 -0
  204. data/ext/apex_ext/apex_src/tests/CMakeLists.txt +24 -0
  205. data/ext/apex_ext/apex_src/tests/README.md +146 -0
  206. data/ext/apex_ext/apex_src/tests/benchmark.sh +113 -0
  207. data/ext/apex_ext/apex_src/tests/benchmark_comparison.sh +166 -0
  208. data/ext/apex_ext/apex_src/tests/compare_header_ids.sh +31 -0
  209. data/ext/apex_ext/apex_src/tests/fixtures/basic/headers.md +25 -0
  210. data/ext/apex_ext/apex_src/tests/fixtures/basic/list-interruption.md +24 -0
  211. data/ext/apex_ext/apex_src/tests/fixtures/basic/misc_markup.md +33 -0
  212. data/ext/apex_ext/apex_src/tests/fixtures/basic/test_basic.md +26 -0
  213. data/ext/apex_ext/apex_src/tests/fixtures/code/code-blocks.md +260 -0
  214. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/SUMMARY.md +6 -0
  215. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/chapter1.md +7 -0
  216. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/index.txt +9 -0
  217. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/intro.md +5 -0
  218. data/ext/apex_ext/apex_src/tests/fixtures/combine_summary/section1_1.md +5 -0
  219. data/ext/apex_ext/apex_src/tests/fixtures/comprehensive_test.md +620 -0
  220. data/ext/apex_ext/apex_src/tests/fixtures/debug_ref_image_ial.md +3 -0
  221. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial.md +11 -0
  222. data/ext/apex_ext/apex_src/tests/fixtures/demos/ial_demo.md +177 -0
  223. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji-autocorrect.md +94 -0
  224. data/ext/apex_ext/apex_src/tests/fixtures/extensions/emoji_test.md +3 -0
  225. data/ext/apex_ext/apex_src/tests/fixtures/extensions/kbd_test.md +3 -0
  226. data/ext/apex_ext/apex_src/tests/fixtures/ial/bracketed_spans_test.md +74 -0
  227. data/ext/apex_ext/apex_src/tests/fixtures/images/image_and_encoding_test.md +27 -0
  228. data/ext/apex_ext/apex_src/tests/fixtures/images/multimarkdown_image_attributes_test.md +60 -0
  229. data/ext/apex_ext/apex_src/tests/fixtures/images/pandoc_ial_image_test.md +27 -0
  230. data/ext/apex_ext/apex_src/tests/fixtures/images/width_height_conversion_test.md +94 -0
  231. data/ext/apex_ext/apex_src/tests/fixtures/img-in-div.md +16 -0
  232. data/ext/apex_ext/apex_src/tests/fixtures/includes/code.py +4 -0
  233. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.csv +5 -0
  234. data/ext/apex_ext/apex_src/tests/fixtures/includes/data.tsv +5 -0
  235. data/ext/apex_ext/apex_src/tests/fixtures/includes/image.png +2 -0
  236. data/ext/apex_ext/apex_src/tests/fixtures/includes/metadata_options.yml +11 -0
  237. data/ext/apex_ext/apex_src/tests/fixtures/includes/nested.md +8 -0
  238. data/ext/apex_ext/apex_src/tests/fixtures/includes/raw.html +4 -0
  239. data/ext/apex_ext/apex_src/tests/fixtures/includes/simple.md +7 -0
  240. data/ext/apex_ext/apex_src/tests/fixtures/includes/test_image.png +0 -0
  241. data/ext/apex_ext/apex_src/tests/fixtures/large_doc.md +1094 -0
  242. data/ext/apex_ext/apex_src/tests/fixtures/metadata_options.yml +11 -0
  243. data/ext/apex_ext/apex_src/tests/fixtures/output/gfm_header_id_test.md +96 -0
  244. data/ext/apex_ext/apex_src/tests/fixtures/output/test_citations.md +43 -0
  245. data/ext/apex_ext/apex_src/tests/fixtures/output/test_def_list_links.md +12 -0
  246. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_mmark.md +53 -0
  247. data/ext/apex_ext/apex_src/tests/fixtures/output/test_index_textindex.md +37 -0
  248. data/ext/apex_ext/apex_src/tests/fixtures/tables/advanced_tables_test.md +93 -0
  249. data/ext/apex_ext/apex_src/tests/fixtures/tables/inline_tables_test.md +38 -0
  250. data/ext/apex_ext/apex_src/tests/fixtures/tables/relaxed-table.md +12 -0
  251. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_cr_line_endings.md +15 -0
  252. data/ext/apex_ext/apex_src/tests/fixtures/tables/table_no_trailing_newline.md +15 -0
  253. data/ext/apex_ext/apex_src/tests/generate_gfm_ids.sh +105 -0
  254. data/ext/apex_ext/apex_src/tests/generate_ial_demo.sh +143 -0
  255. data/ext/apex_ext/apex_src/tests/gfm_id_comparison_summary.md +96 -0
  256. data/ext/apex_ext/apex_src/tests/gh_api_test.md +6 -0
  257. data/ext/apex_ext/apex_src/tests/ial_demo.html +186 -0
  258. data/ext/apex_ext/apex_src/tests/include_code.py +19 -0
  259. data/ext/apex_ext/apex_src/tests/include_snippet.md +15 -0
  260. data/ext/apex_ext/apex_src/tests/multi_file_cli_test.sh +64 -0
  261. data/ext/apex_ext/apex_src/tests/sample_data.csv +7 -0
  262. data/ext/apex_ext/apex_src/tests/table_escaped_ltlt.md +4 -0
  263. data/ext/apex_ext/apex_src/tests/test_basic.c +74 -0
  264. data/ext/apex_ext/apex_src/tests/test_extensions.c +2116 -0
  265. data/ext/apex_ext/apex_src/tests/test_helpers.c +183 -0
  266. data/ext/apex_ext/apex_src/tests/test_helpers.h +91 -0
  267. data/ext/apex_ext/apex_src/tests/test_ial.c +282 -0
  268. data/ext/apex_ext/apex_src/tests/test_links.c +418 -0
  269. data/ext/apex_ext/apex_src/tests/test_marked_integration.c +265 -0
  270. data/ext/apex_ext/apex_src/tests/test_metadata.c +908 -0
  271. data/ext/apex_ext/apex_src/tests/test_output.c +1118 -0
  272. data/ext/apex_ext/apex_src/tests/test_plugins.c +219 -0
  273. data/ext/apex_ext/apex_src/tests/test_refs.bib +31 -0
  274. data/ext/apex_ext/apex_src/tests/test_runner.c +244 -0
  275. data/ext/apex_ext/apex_src/tests/test_syntax_highlight.c +198 -0
  276. data/ext/apex_ext/apex_src/tests/test_tables.c +862 -0
  277. data/ext/apex_ext/apex_src/tests/update_benchmarks.sh +9 -0
  278. data/ext/apex_ext/apex_src/tests/yaml_test.md +13 -0
  279. data/ext/apex_ext/apex_src/tests.rb +39 -0
  280. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CMakeLists.txt +48 -0
  281. data/ext/apex_ext/apex_src/vendor/cmark-gfm/COPYING +170 -0
  282. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.c +14 -0
  283. data/ext/apex_ext/apex_src/vendor/cmark-gfm/CheckFileOffsetBits.cmake +43 -0
  284. data/ext/apex_ext/apex_src/vendor/cmark-gfm/FindAsan.cmake +74 -0
  285. data/ext/apex_ext/apex_src/vendor/cmark-gfm/Makefile.nmake +38 -0
  286. data/ext/apex_ext/apex_src/vendor/cmark-gfm/README.md +206 -0
  287. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/CMakeLists.txt +30 -0
  288. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.cpp +15 -0
  289. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/cplusplus.h +16 -0
  290. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.c +111 -0
  291. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/harness.h +35 -0
  292. data/ext/apex_ext/apex_src/vendor/cmark-gfm/api_test/main.c +1169 -0
  293. data/ext/apex_ext/apex_src/vendor/cmark-gfm/appveyor.yml +21 -0
  294. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-flat.md +16 -0
  295. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-bq-nested.md +13 -0
  296. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-code.md +11 -0
  297. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-fences.md +14 -0
  298. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-heading.md +9 -0
  299. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-hr.md +10 -0
  300. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-html.md +32 -0
  301. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-lheading.md +8 -0
  302. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-flat.md +67 -0
  303. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-list-nested.md +36 -0
  304. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-flat.md +15 -0
  305. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/block-ref-nested.md +17 -0
  306. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-autolink.md +14 -0
  307. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-backticks.md +3 -0
  308. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-flat.md +5 -0
  309. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-nested.md +5 -0
  310. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-em-worst.md +5 -0
  311. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-entity.md +11 -0
  312. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-escape.md +15 -0
  313. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-html.md +44 -0
  314. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-flat.md +23 -0
  315. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-links-nested.md +13 -0
  316. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/inline-newlines.md +24 -0
  317. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/lorem1.md +13 -0
  318. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/samples/rawtabs.md +18 -0
  319. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/statistics.py +595 -0
  320. data/ext/apex_ext/apex_src/vendor/cmark-gfm/bench/stats.py +19 -0
  321. data/ext/apex_ext/apex_src/vendor/cmark-gfm/benchmarks.md +33 -0
  322. data/ext/apex_ext/apex_src/vendor/cmark-gfm/changelog.txt +1245 -0
  323. data/ext/apex_ext/apex_src/vendor/cmark-gfm/data/CaseFolding.txt +1495 -0
  324. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/CMakeLists.txt +119 -0
  325. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/autolink.c +508 -0
  326. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/autolink.h +8 -0
  327. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/cmark-gfm-core-extensions.h +54 -0
  328. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/core-extensions.c +27 -0
  329. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.c +879 -0
  330. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.h +24 -0
  331. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/ext_scanners.re +92 -0
  332. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/strikethrough.c +167 -0
  333. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/strikethrough.h +9 -0
  334. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/table.c +917 -0
  335. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/table.h +12 -0
  336. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tagfilter.c +60 -0
  337. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tagfilter.h +8 -0
  338. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tasklist.c +156 -0
  339. data/ext/apex_ext/apex_src/vendor/cmark-gfm/extensions/tasklist.h +8 -0
  340. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/CMakeLists.txt +22 -0
  341. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/README.md +12 -0
  342. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic.c +91 -0
  343. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzz_quadratic_brackets.c +110 -0
  344. data/ext/apex_ext/apex_src/vendor/cmark-gfm/fuzz/fuzzloop.sh +28 -0
  345. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/CMakeLists.txt +10 -0
  346. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/make_man_page.py +133 -0
  347. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man1/cmark-gfm.1 +78 -0
  348. data/ext/apex_ext/apex_src/vendor/cmark-gfm/man/man3/cmark-gfm.3 +1041 -0
  349. data/ext/apex_ext/apex_src/vendor/cmark-gfm/nmake.bat +1 -0
  350. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/CMakeLists.txt +230 -0
  351. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/arena.c +104 -0
  352. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/blocks.c +1622 -0
  353. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/buffer.c +278 -0
  354. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/buffer.h +116 -0
  355. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/case_fold_switch.inc +4327 -0
  356. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/chunk.h +135 -0
  357. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm-extension_api.h +737 -0
  358. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm.h +833 -0
  359. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark-gfm_version.h.in +7 -0
  360. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark.c +55 -0
  361. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark_ctype.c +44 -0
  362. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/cmark_ctype.h +33 -0
  363. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/commonmark.c +514 -0
  364. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/config.h.in +76 -0
  365. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/entities.inc +2138 -0
  366. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/footnotes.c +63 -0
  367. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/footnotes.h +27 -0
  368. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini.h +57 -0
  369. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_href_e.c +100 -0
  370. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_html_e.c +66 -0
  371. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/houdini_html_u.c +149 -0
  372. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/html.c +502 -0
  373. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/html.h +27 -0
  374. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/inlines.c +1788 -0
  375. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/inlines.h +29 -0
  376. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/iterator.c +159 -0
  377. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/iterator.h +26 -0
  378. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/latex.c +468 -0
  379. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/libcmark-gfm.pc.in +10 -0
  380. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/linked_list.c +37 -0
  381. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/main.c +328 -0
  382. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/man.c +274 -0
  383. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/map.c +129 -0
  384. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/map.h +44 -0
  385. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/node.c +1045 -0
  386. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/node.h +167 -0
  387. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/parser.h +59 -0
  388. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plaintext.c +218 -0
  389. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plugin.c +36 -0
  390. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/plugin.h +34 -0
  391. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/references.c +43 -0
  392. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/references.h +26 -0
  393. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/registry.c +63 -0
  394. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/registry.h +24 -0
  395. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/render.c +213 -0
  396. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/render.h +62 -0
  397. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.c +14056 -0
  398. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.h +70 -0
  399. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/scanners.re +365 -0
  400. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/syntax_extension.c +149 -0
  401. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/syntax_extension.h +34 -0
  402. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/utf8.c +317 -0
  403. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/utf8.h +35 -0
  404. data/ext/apex_ext/apex_src/vendor/cmark-gfm/src/xml.c +182 -0
  405. data/ext/apex_ext/apex_src/vendor/cmark-gfm/suppressions +10 -0
  406. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/CMakeLists.txt +114 -0
  407. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/afl_test_cases/test.md +49 -0
  408. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark-fuzz.c +58 -0
  409. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/cmark.py +105 -0
  410. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/entity_tests.py +67 -0
  411. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-full-info-string.txt +0 -0
  412. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions-table-prefer-style-attributes.txt +38 -0
  413. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/extensions.txt +920 -0
  414. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/fuzzing_dictionary +67 -0
  415. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/normalize.py +194 -0
  416. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/pathological_tests.py +160 -0
  417. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/regression.txt +375 -0
  418. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/roundtrip_tests.py +50 -0
  419. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/run-cmark-fuzz +4 -0
  420. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/smart_punct.txt +177 -0
  421. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec.txt +10212 -0
  422. data/ext/apex_ext/apex_src/vendor/cmark-gfm/test/spec_tests.py +152 -0
  423. data/ext/apex_ext/apex_src/vendor/cmark-gfm/toolchain-mingw32.cmake +17 -0
  424. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/Dockerfile +41 -0
  425. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/appveyor-build.bat +13 -0
  426. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/make_entities_inc.py +32 -0
  427. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/mkcasefold.pl +22 -0
  428. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md.xsl +319 -0
  429. data/ext/apex_ext/apex_src/vendor/cmark-gfm/tools/xml2md_gfm.xsl +80 -0
  430. data/ext/apex_ext/apex_src/vendor/cmark-gfm/why-cmark-and-not-x.md +104 -0
  431. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.js +6 -0
  432. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.py +37 -0
  433. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rb +15 -0
  434. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper.rkt +208 -0
  435. data/ext/apex_ext/apex_src/vendor/cmark-gfm/wrappers/wrapper_ext.py +109 -0
  436. data/ext/apex_ext/apex_src/vendor/libyaml/CMakeLists.txt +160 -0
  437. data/ext/apex_ext/apex_src/vendor/libyaml/Changes +372 -0
  438. data/ext/apex_ext/apex_src/vendor/libyaml/License +20 -0
  439. data/ext/apex_ext/apex_src/vendor/libyaml/Makefile.am +51 -0
  440. data/ext/apex_ext/apex_src/vendor/libyaml/ReadMe.md +46 -0
  441. data/ext/apex_ext/apex_src/vendor/libyaml/announcement.msg +89 -0
  442. data/ext/apex_ext/apex_src/vendor/libyaml/bootstrap +3 -0
  443. data/ext/apex_ext/apex_src/vendor/libyaml/cmake/config.h.in +4 -0
  444. data/ext/apex_ext/apex_src/vendor/libyaml/configure.ac +73 -0
  445. data/ext/apex_ext/apex_src/vendor/libyaml/doc/doxygen.cfg +222 -0
  446. data/ext/apex_ext/apex_src/vendor/libyaml/docker/README.mkd +17 -0
  447. data/ext/apex_ext/apex_src/vendor/libyaml/docker/alpine-3.7 +26 -0
  448. data/ext/apex_ext/apex_src/vendor/libyaml/docker/fedora-25 +26 -0
  449. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-14.04 +29 -0
  450. data/ext/apex_ext/apex_src/vendor/libyaml/docker/ubuntu-16.04 +24 -0
  451. data/ext/apex_ext/apex_src/vendor/libyaml/examples/anchors.yaml +10 -0
  452. data/ext/apex_ext/apex_src/vendor/libyaml/examples/array.yaml +2 -0
  453. data/ext/apex_ext/apex_src/vendor/libyaml/examples/global-tag.yaml +14 -0
  454. data/ext/apex_ext/apex_src/vendor/libyaml/examples/json.yaml +1 -0
  455. data/ext/apex_ext/apex_src/vendor/libyaml/examples/mapping.yaml +2 -0
  456. data/ext/apex_ext/apex_src/vendor/libyaml/examples/numbers.yaml +1 -0
  457. data/ext/apex_ext/apex_src/vendor/libyaml/examples/strings.yaml +7 -0
  458. data/ext/apex_ext/apex_src/vendor/libyaml/examples/tags.yaml +7 -0
  459. data/ext/apex_ext/apex_src/vendor/libyaml/examples/yaml-version.yaml +3 -0
  460. data/ext/apex_ext/apex_src/vendor/libyaml/include/Makefile.am +17 -0
  461. data/ext/apex_ext/apex_src/vendor/libyaml/include/yaml.h +1999 -0
  462. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/ReadMe.md +77 -0
  463. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/Dockerfile +32 -0
  464. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/output/ReadMe +1 -0
  465. data/ext/apex_ext/apex_src/vendor/libyaml/pkg/docker/scripts/libyaml-dist.sh +23 -0
  466. data/ext/apex_ext/apex_src/vendor/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml +1 -0
  467. data/ext/apex_ext/apex_src/vendor/libyaml/src/Makefile.am +4 -0
  468. data/ext/apex_ext/apex_src/vendor/libyaml/src/api.c +1393 -0
  469. data/ext/apex_ext/apex_src/vendor/libyaml/src/dumper.c +394 -0
  470. data/ext/apex_ext/apex_src/vendor/libyaml/src/emitter.c +2358 -0
  471. data/ext/apex_ext/apex_src/vendor/libyaml/src/loader.c +544 -0
  472. data/ext/apex_ext/apex_src/vendor/libyaml/src/parser.c +1416 -0
  473. data/ext/apex_ext/apex_src/vendor/libyaml/src/reader.c +469 -0
  474. data/ext/apex_ext/apex_src/vendor/libyaml/src/scanner.c +3598 -0
  475. data/ext/apex_ext/apex_src/vendor/libyaml/src/writer.c +141 -0
  476. data/ext/apex_ext/apex_src/vendor/libyaml/src/yaml_private.h +684 -0
  477. data/ext/apex_ext/apex_src/vendor/libyaml/tests/CMakeLists.txt +27 -0
  478. data/ext/apex_ext/apex_src/vendor/libyaml/tests/Makefile.am +9 -0
  479. data/ext/apex_ext/apex_src/vendor/libyaml/tests/ReadMe.md +63 -0
  480. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor-alt.c +800 -0
  481. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-deconstructor.c +1127 -0
  482. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter-alt.c +217 -0
  483. data/ext/apex_ext/apex_src/vendor/libyaml/tests/example-reformatter.c +202 -0
  484. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-all-tests.sh +29 -0
  485. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-dumper.c +314 -0
  486. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter-test-suite.c +290 -0
  487. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-emitter.c +327 -0
  488. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-loader.c +63 -0
  489. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser-test-suite.c +196 -0
  490. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-parser.c +88 -0
  491. data/ext/apex_ext/apex_src/vendor/libyaml/tests/run-scanner.c +63 -0
  492. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-reader.c +354 -0
  493. data/ext/apex_ext/apex_src/vendor/libyaml/tests/test-version.c +29 -0
  494. data/ext/apex_ext/apex_src/vendor/libyaml/yaml-0.1.pc.in +10 -0
  495. data/ext/apex_ext/apex_src/vendor/libyaml/yamlConfig.cmake.in +16 -0
  496. data/ext/apex_ext/extconf.rb +103 -0
  497. data/lib/apex/configurable.rb +46 -0
  498. data/lib/apex/document.rb +66 -0
  499. data/lib/apex/version.rb +15 -0
  500. data/lib/apex.rb +28 -0
  501. metadata +544 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Plugin System Integration Tests
3
+ *
4
+ * Purely test-side coverage improvements:
5
+ * - Creates temporary plugin manifests/scripts under a temporary XDG_CONFIG_HOME
6
+ * - Enables plugins via apex_options and exercises pre_parse and post_render phases
7
+ * - Exercises both declarative regex plugins and external handler plugins
8
+ * - Exercises APEX_PRE_PARSE_PLUGIN env helper (plugins_env.c)
9
+ */
10
+
11
+ #include "test_helpers.h"
12
+ #include "apex/apex.h"
13
+
14
+ #include <string.h>
15
+ #include <stdlib.h>
16
+ #include <stdio.h>
17
+ #include <sys/stat.h>
18
+ #include <unistd.h>
19
+
20
+ /* Not in a public header, but we want to cover it. */
21
+ char *apex_run_preparse_plugin_env(const char *text, const apex_options *options);
22
+
23
+ static int mkdir_p(const char *path) {
24
+ if (!path || !*path) return -1;
25
+ char tmp[1024];
26
+ snprintf(tmp, sizeof(tmp), "%s", path);
27
+
28
+ for (char *p = tmp + 1; *p; p++) {
29
+ if (*p == '/') {
30
+ *p = '\0';
31
+ mkdir(tmp, 0700);
32
+ *p = '/';
33
+ }
34
+ }
35
+ return mkdir(tmp, 0700);
36
+ }
37
+
38
+ static int write_file(const char *path, const char *content) {
39
+ FILE *fp = fopen(path, "wb");
40
+ if (!fp) return -1;
41
+ size_t n = fwrite(content, 1, strlen(content), fp);
42
+ fclose(fp);
43
+ return (n == strlen(content)) ? 0 : -1;
44
+ }
45
+
46
+ static void env_set_restore(const char *key, const char *value, void (*fn)(void *), void *ctx) {
47
+ const char *old = getenv(key);
48
+ char *old_dup = old ? strdup(old) : NULL;
49
+
50
+ if (value) setenv(key, value, 1);
51
+ else unsetenv(key);
52
+
53
+ fn(ctx);
54
+
55
+ if (old_dup) {
56
+ setenv(key, old_dup, 1);
57
+ free(old_dup);
58
+ } else {
59
+ unsetenv(key);
60
+ }
61
+ }
62
+
63
+ typedef struct {
64
+ const char *xdg_home;
65
+ } plugin_test_ctx;
66
+
67
+ static void plugin_test_cb(void *vctx) {
68
+ plugin_test_ctx *ctx = (plugin_test_ctx *)vctx;
69
+
70
+ /* Create:
71
+ * $XDG_CONFIG_HOME/apex/plugins/a-regex/plugin.yml
72
+ * $XDG_CONFIG_HOME/apex/plugins/b-handler/plugin.yml + handler.py
73
+ * $XDG_CONFIG_HOME/apex/plugins/c-post/plugin.yml + handler.py
74
+ */
75
+ char plugins_root[1024];
76
+ snprintf(plugins_root, sizeof(plugins_root), "%s/apex/plugins", ctx->xdg_home);
77
+ mkdir_p(plugins_root);
78
+
79
+ /* a-regex: pre_parse regex replacement, high priority (runs first) */
80
+ {
81
+ char dir[1024];
82
+ snprintf(dir, sizeof(dir), "%s/a-regex", plugins_root);
83
+ mkdir_p(dir);
84
+
85
+ char manifest[1024];
86
+ snprintf(manifest, sizeof(manifest), "%s/plugin.yml", dir);
87
+ const char *yml =
88
+ "---\n"
89
+ "id: a-regex\n"
90
+ "phase: pre_parse\n"
91
+ "priority: 10\n"
92
+ "pattern: \"FOO\"\n"
93
+ "replacement: \"BAR\"\n"
94
+ "---\n";
95
+ write_file(manifest, yml);
96
+ }
97
+
98
+ /* b-handler: pre_parse external handler, runs after regex */
99
+ {
100
+ char dir[1024];
101
+ snprintf(dir, sizeof(dir), "%s/b-handler", plugins_root);
102
+ mkdir_p(dir);
103
+
104
+ char script[1024];
105
+ snprintf(script, sizeof(script), "%s/handler.py", dir);
106
+ const char *py =
107
+ "import json, os, sys\n"
108
+ "req = json.loads(sys.stdin.read() or '{}')\n"
109
+ "text = req.get('text','')\n"
110
+ "# Confirm env vars are set by embedding them into output.\n"
111
+ "plugdir = os.environ.get('APEX_PLUGIN_DIR','')\n"
112
+ "suppdir = os.environ.get('APEX_SUPPORT_DIR','')\n"
113
+ "text = text.replace('BAR', 'BAZ')\n"
114
+ "sys.stdout.write(text + '\\n<!--PLUGIN_DIR=' + plugdir + '-->' + '\\n<!--SUPPORT_DIR=' + suppdir + '-->\\n')\n";
115
+ write_file(script, py);
116
+
117
+ char manifest[1024];
118
+ snprintf(manifest, sizeof(manifest), "%s/plugin.yml", dir);
119
+ const char *yml =
120
+ "---\n"
121
+ "id: b-handler\n"
122
+ "phase: pre_parse\n"
123
+ "priority: 20\n"
124
+ "handler.command: \"/usr/bin/env python3 ${APEX_PLUGIN_DIR}/handler.py\"\n"
125
+ "timeout_ms: 500\n"
126
+ "---\n";
127
+ write_file(manifest, yml);
128
+ }
129
+
130
+ /* c-post: post_render external handler that appends marker with APEX_FILE_PATH */
131
+ {
132
+ char dir[1024];
133
+ snprintf(dir, sizeof(dir), "%s/c-post", plugins_root);
134
+ mkdir_p(dir);
135
+
136
+ char script[1024];
137
+ snprintf(script, sizeof(script), "%s/handler.py", dir);
138
+ const char *py =
139
+ "import json, os, sys\n"
140
+ "req = json.loads(sys.stdin.read() or '{}')\n"
141
+ "text = req.get('text','')\n"
142
+ "fp = os.environ.get('APEX_FILE_PATH','')\n"
143
+ "sys.stdout.write(text + '\\n<!--POST_RENDER_FILE=' + fp + '-->')\n";
144
+ write_file(script, py);
145
+
146
+ char manifest[1024];
147
+ snprintf(manifest, sizeof(manifest), "%s/plugin.yml", dir);
148
+ const char *yml =
149
+ "---\n"
150
+ "id: c-post\n"
151
+ "phase: post_render\n"
152
+ "priority: 10\n"
153
+ "handler.command: \"/usr/bin/env python3 ${APEX_PLUGIN_DIR}/handler.py\"\n"
154
+ "timeout_ms: 500\n"
155
+ "---\n";
156
+ write_file(manifest, yml);
157
+ }
158
+
159
+ /* Run a conversion that should exercise:
160
+ * - plugin discovery (XDG_CONFIG_HOME path)
161
+ * - regex plugin application (FOO->BAR)
162
+ * - handler plugin application (BAR->BAZ plus markers)
163
+ * - post_render handler append marker
164
+ */
165
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
166
+ opts.enable_plugins = true;
167
+ opts.input_file_path = "/tmp/apex-test-input.md";
168
+
169
+ const char *md = "FOO\n";
170
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
171
+
172
+ assert_contains(html, "BAZ", "plugins: regex + handler transformed text (FOO->BAR->BAZ)");
173
+ assert_contains(html, "PLUGIN_DIR=", "plugins: handler saw APEX_PLUGIN_DIR");
174
+ assert_contains(html, "SUPPORT_DIR=", "plugins: handler saw APEX_SUPPORT_DIR");
175
+ assert_contains(html, "POST_RENDER_FILE=/tmp/apex-test-input.md", "plugins: post_render saw APEX_FILE_PATH");
176
+
177
+ apex_free_string(html);
178
+ }
179
+
180
+ void test_plugins_integration(void) {
181
+ int suite_failures = suite_start();
182
+ print_suite_title("Plugin System Integration Tests", false, true);
183
+
184
+ /* Exercise plugins_env.c helper using APEX_PRE_PARSE_PLUGIN */
185
+ {
186
+ /* A command that reads JSON and prints just the text value. */
187
+ const char *cmd =
188
+ "/usr/bin/env python3 -c 'import json,sys; print(json.loads(sys.stdin.read()).get(\"text\",\"\"))'";
189
+ setenv("APEX_PRE_PARSE_PLUGIN", cmd, 1);
190
+
191
+ apex_options opts = apex_options_default();
192
+ char *out = apex_run_preparse_plugin_env("ENV_PLUGIN_OK", &opts);
193
+ test_result(out && strstr(out, "ENV_PLUGIN_OK") != NULL, "APEX_PRE_PARSE_PLUGIN env helper runs");
194
+ if (out) free(out);
195
+
196
+ unsetenv("APEX_PRE_PARSE_PLUGIN");
197
+ }
198
+
199
+ /* Create temp XDG_CONFIG_HOME and run full plugin integration. */
200
+ char tmp_template[] = "/tmp/apex-xdg-plugins-XXXXXX";
201
+ char *tmp = mkdtemp(tmp_template);
202
+ if (!tmp) {
203
+ tests_run++;
204
+ tests_failed++;
205
+ printf(COLOR_RED "✗" COLOR_RESET " Failed to create temp directory for plugin tests\n");
206
+ } else {
207
+ plugin_test_ctx ctx = { .xdg_home = tmp };
208
+ env_set_restore("XDG_CONFIG_HOME", tmp, plugin_test_cb, &ctx);
209
+
210
+ /* Best-effort cleanup (not fatal on failure). */
211
+ char rm_cmd[1200];
212
+ snprintf(rm_cmd, sizeof(rm_cmd), "rm -rf '%s'", tmp);
213
+ system(rm_cmd);
214
+ }
215
+
216
+ bool had_failures = suite_end(suite_failures);
217
+ print_suite_title("Plugin System Integration Tests", had_failures, false);
218
+ }
219
+
@@ -0,0 +1,31 @@
1
+ @article{doe99,
2
+ author = {Doe, John},
3
+ title = {Article Title},
4
+ journal = {Journal Name},
5
+ year = {1999},
6
+ volume = {1},
7
+ pages = {1--10}
8
+ }
9
+
10
+ @book{smith2000,
11
+ author = {Smith, Jane},
12
+ title = {Book Title},
13
+ publisher = {Publisher},
14
+ year = {2000}
15
+ }
16
+
17
+ @article{smith2004,
18
+ author = {Smith, Jane},
19
+ title = {Another Article},
20
+ journal = {Journal},
21
+ year = {2004},
22
+ volume = {2},
23
+ pages = {20--30}
24
+ }
25
+
26
+ @book{smith04,
27
+ author = {Smith, John},
28
+ title = {Some Book},
29
+ publisher = {Publisher},
30
+ year = {2004}
31
+ }
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Apex Test Runner
3
+ * Main test runner that calls all test suites
4
+ */
5
+
6
+ #include "test_helpers.h"
7
+ #include "apex/apex.h"
8
+
9
+ #include <string.h>
10
+ #include <stddef.h>
11
+ #include <signal.h>
12
+ #include <stdlib.h>
13
+
14
+ /* Track current test name for error reporting */
15
+ static const char *current_test_name = NULL;
16
+
17
+ /* Signal handler for assertion failures */
18
+ static void sigabrt_handler(int sig) {
19
+ (void)sig;
20
+ if (current_test_name) {
21
+ fprintf(stderr, "\n*** Assertion failure in test: %s ***\n", current_test_name);
22
+ }
23
+ fprintf(stderr, "This is likely a cmark block finalization issue.\n");
24
+ fprintf(stderr, "Set APEX_SKIP_PROBLEMATIC_TESTS=1 to skip tests that trigger this.\n");
25
+ }
26
+
27
+ /* Forward declarations for individual test suites */
28
+ void test_basic_markdown(void);
29
+ void test_gfm_features(void);
30
+ void test_metadata(void);
31
+ void test_mmd_metadata_keys(void);
32
+ void test_metadata_transforms(void);
33
+ void test_metadata_control_options(void);
34
+ void test_syntax_highlight_options(void);
35
+ void test_syntax_highlight_integration(void);
36
+ void test_wiki_links(void);
37
+ void test_image_embedding(void);
38
+ void test_image_width_height_conversion(void);
39
+ void test_math(void);
40
+ void test_critic_markup(void);
41
+ void test_processor_modes(void);
42
+ void test_multimarkdown_image_attributes(void);
43
+ void test_file_includes(void);
44
+ void test_ial(void);
45
+ void test_bracketed_spans(void);
46
+ void test_definition_lists(void);
47
+ void test_advanced_tables(void);
48
+ void test_relaxed_tables(void);
49
+ void test_comprehensive_table_features(void);
50
+ void test_table_no_trailing_newline(void);
51
+ void test_table_cr_line_endings(void);
52
+ void test_combine_gitbook_like(void);
53
+ void test_callouts(void);
54
+ void test_blockquote_lists(void);
55
+ void test_toc(void);
56
+ void test_html_markdown_attributes(void);
57
+ void test_fenced_divs(void);
58
+ void test_sup_sub(void);
59
+ void test_mixed_lists(void);
60
+ void test_unsafe_mode(void);
61
+ void test_abbreviations(void);
62
+ void test_mmd6_features(void);
63
+ void test_emoji(void);
64
+ void test_special_markers(void);
65
+ void test_inline_tables(void);
66
+ void test_insert_syntax(void);
67
+ void test_advanced_footnotes(void);
68
+ void test_standalone_output(void);
69
+ void test_pretty_html(void);
70
+ void test_header_ids(void);
71
+ void test_image_captions(void);
72
+ void test_indices(void);
73
+ void test_citations(void);
74
+ void test_aria_labels(void);
75
+ void test_marked_integration_features(void);
76
+ void test_plugins_integration(void);
77
+
78
+ /**
79
+ * Test suite registry
80
+ *
81
+ * Maps human-friendly suite names (command-line arguments) to the
82
+ * corresponding test functions.
83
+ */
84
+ typedef void (*test_fn)(void);
85
+
86
+ typedef struct {
87
+ const char *name;
88
+ test_fn fn;
89
+ } test_suite;
90
+
91
+ static test_suite suites[] = {
92
+ { "tests_basic", test_basic_markdown },
93
+ { "basic", test_basic_markdown },
94
+ { "gfm", test_gfm_features },
95
+ { "metadata", test_metadata },
96
+ { "metadata_transforms", test_metadata_transforms },
97
+ { "mmd_metadata_keys", test_mmd_metadata_keys },
98
+ { "metadata_control_options", test_metadata_control_options },
99
+ { "syntax_highlight_options", test_syntax_highlight_options },
100
+ { "syntax_highlight_integration", test_syntax_highlight_integration },
101
+ { "wiki_links", test_wiki_links },
102
+ { "math", test_math },
103
+ { "critic_markup", test_critic_markup },
104
+ { "multimarkdown_image_attributes",test_multimarkdown_image_attributes },
105
+ { "processor_modes", test_processor_modes },
106
+ { "file_includes", test_file_includes },
107
+ { "ial", test_ial },
108
+ { "bracketed_spans", test_bracketed_spans },
109
+ { "definition_lists", test_definition_lists },
110
+ { "advanced_tables", test_advanced_tables },
111
+ { "relaxed_tables", test_relaxed_tables },
112
+ { "comprehensive_table_features", test_comprehensive_table_features },
113
+ { "table_no_trailing_newline", test_table_no_trailing_newline },
114
+ { "table_cr_line_endings", test_table_cr_line_endings },
115
+ { "combine_gitbook_like", test_combine_gitbook_like },
116
+ { "callouts", test_callouts },
117
+ { "blockquote_lists", test_blockquote_lists },
118
+ { "toc", test_toc },
119
+ { "html_markdown_attributes", test_html_markdown_attributes },
120
+ { "fenced_divs", test_fenced_divs },
121
+ { "sup_sub", test_sup_sub },
122
+ { "mixed_lists", test_mixed_lists },
123
+ { "unsafe_mode", test_unsafe_mode },
124
+ { "abbreviations", test_abbreviations },
125
+ { "mmd6_features", test_mmd6_features },
126
+ { "emoji", test_emoji },
127
+ { "special_markers", test_special_markers },
128
+ { "inline_tables", test_inline_tables },
129
+ { "insert_syntax", test_insert_syntax },
130
+ { "advanced_footnotes", test_advanced_footnotes },
131
+ { "standalone_output", test_standalone_output },
132
+ { "pretty_html", test_pretty_html },
133
+ { "header_ids", test_header_ids },
134
+ { "image_captions", test_image_captions },
135
+ { "image_embedding", test_image_embedding },
136
+ { "image_width_height_conversion", test_image_width_height_conversion },
137
+ { "indices", test_indices },
138
+ { "citations", test_citations },
139
+ { "aria_labels", test_aria_labels },
140
+ { "marked_integration", test_marked_integration_features },
141
+ { "marked", test_marked_integration_features },
142
+ { "plugins_integration", test_plugins_integration },
143
+ };
144
+
145
+ static const size_t suite_count = sizeof(suites) / sizeof(suites[0]);
146
+
147
+ /**
148
+ * Main test runner
149
+ */
150
+ int main(int argc, char *argv[]) {
151
+ /* Install signal handler for better error reporting */
152
+ signal(SIGABRT, sigabrt_handler);
153
+
154
+ /* Parse command-line arguments */
155
+ int errors_only = 0;
156
+ int badge_flag = 0;
157
+ const char *requested_suite = NULL;
158
+
159
+ for (int i = 1; i < argc; i++) {
160
+ if (strcmp(argv[i], "--errors-only") == 0 || strcmp(argv[i], "-e") == 0) {
161
+ errors_only = 1;
162
+ } else if (strcmp(argv[i], "--badge") == 0 || strcmp(argv[i], "-b") == 0) {
163
+ badge_flag = 1;
164
+ } else if (!requested_suite) {
165
+ requested_suite = argv[i];
166
+ }
167
+ }
168
+
169
+ /* Set global badge_mode flag in test helpers */
170
+ if (badge_flag) {
171
+ badge_mode = 1;
172
+ }
173
+
174
+ /* Skip header in badge mode */
175
+ if (!badge_flag) {
176
+ printf("Apex Test Suite v%s\n", apex_version_string());
177
+ printf("==========================================\n");
178
+ }
179
+
180
+ /* Propagate errors-only mode to test helpers */
181
+ if (errors_only) {
182
+ errors_only_output = 1;
183
+ }
184
+
185
+ /* In badge mode, suppress all output except the final count */
186
+ if (badge_flag) {
187
+ errors_only_output = 1; /* Suppress test output */
188
+ }
189
+
190
+ if (requested_suite) {
191
+ // List available test suites
192
+ if (strcmp(requested_suite, "list") == 0 || strcmp(requested_suite, "--list") == 0) {
193
+ printf("Available test suites:\n");
194
+ for (size_t i = 0; i < suite_count; i++) {
195
+ printf(" %s\n", suites[i].name);
196
+ }
197
+ return 0;
198
+ }
199
+
200
+ // Run only the specified test suite
201
+ for (size_t i = 0; i < suite_count; i++) {
202
+ if (strcmp(requested_suite, suites[i].name) == 0) {
203
+ current_test_name = suites[i].name;
204
+ suites[i].fn();
205
+ current_test_name = NULL;
206
+ goto done_single_suite;
207
+ }
208
+ }
209
+
210
+ if (!badge_mode) {
211
+ printf("Unknown test suite: %s\n", requested_suite);
212
+ }
213
+ return 2;
214
+ } else {
215
+ // Run all test suites
216
+ for (size_t i = 0; i < suite_count; i++) {
217
+ current_test_name = suites[i].name;
218
+ suites[i].fn();
219
+ current_test_name = NULL;
220
+ }
221
+ }
222
+
223
+ done_single_suite:
224
+
225
+ /* In badge mode, output only the count */
226
+ if (badge_flag) {
227
+ printf("%d/%d\n", tests_passed, tests_run);
228
+ return (tests_failed == 0) ? 0 : 1;
229
+ }
230
+
231
+ /* Print results */
232
+ printf("\n==========================================\n");
233
+ printf("Results: %d total, ", tests_run);
234
+ printf(COLOR_GREEN "%d passed" COLOR_RESET ", ", tests_passed);
235
+ printf(COLOR_RED "%d failed" COLOR_RESET "\n", tests_failed);
236
+
237
+ if (tests_failed == 0) {
238
+ printf(COLOR_GREEN "\nAll tests passed! ✓" COLOR_RESET "\n");
239
+ return 0;
240
+ } else {
241
+ printf(COLOR_RED "\nSome tests failed!" COLOR_RESET "\n");
242
+ return 1;
243
+ }
244
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Syntax Highlighting Integration Tests
3
+ *
4
+ * These tests exercise the actual external highlighters (pygments/skylighting)
5
+ * via the core pipeline (apex_markdown_to_html), plus a couple of targeted
6
+ * edge cases (tool missing, language-only mode).
7
+ */
8
+
9
+ #include "test_helpers.h"
10
+ #include "apex/apex.h"
11
+ #include "../src/extensions/syntax_highlight.h"
12
+
13
+ #include <string.h>
14
+ #include <stdlib.h>
15
+
16
+ static void with_env(const char *key, const char *value, void (*fn)(void *), void *ctx) {
17
+ const char *old = getenv(key);
18
+ char *old_dup = old ? strdup(old) : NULL;
19
+
20
+ if (value) {
21
+ setenv(key, value, 1);
22
+ } else {
23
+ unsetenv(key);
24
+ }
25
+
26
+ fn(ctx);
27
+
28
+ if (old_dup) {
29
+ setenv(key, old_dup, 1);
30
+ free(old_dup);
31
+ } else {
32
+ unsetenv(key);
33
+ }
34
+ }
35
+
36
+ static void test_tool_missing_cb(void *ctx) {
37
+ (void)ctx;
38
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
39
+ opts.code_highlighter = "pygments";
40
+
41
+ const char *md =
42
+ "```python\n"
43
+ "print(\"hi\")\n"
44
+ "```\n";
45
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
46
+
47
+ /* When PATH is empty, tool check should fail and we should fall back to raw <pre><code>. */
48
+ assert_contains(html, "<pre", "missing tool: keeps <pre>");
49
+ assert_contains(html, "<code", "missing tool: keeps <code>");
50
+ assert_not_contains(html, "class=\"highlight\"", "missing tool: no pygments wrapper");
51
+
52
+ apex_free_string(html);
53
+ }
54
+
55
+ static void test_tool_missing_with_suppression(void *ctx) {
56
+ /* Set suppression variable, then clear PATH and run the test */
57
+ with_env("PATH", "", test_tool_missing_cb, ctx);
58
+ }
59
+
60
+ static int contains_in_order(const char *haystack, const char *a, const char *b) {
61
+ const char *pa = strstr(haystack, a);
62
+ const char *pb = strstr(haystack, b);
63
+ return (pa && pb && pa < pb) ? 1 : 0;
64
+ }
65
+
66
+ void test_syntax_highlight_integration(void) {
67
+ int suite_failures = suite_start();
68
+ print_suite_title("Syntax Highlighting Integration Tests", false, true);
69
+
70
+ /* Exercise tool-missing branch by clearing PATH during conversion. */
71
+ /* Suppress the warning for this intentional test case */
72
+ with_env("APEX_SUPPRESS_HIGHLIGHT_WARNINGS", "1", test_tool_missing_with_suppression, NULL);
73
+
74
+ /* Pygments: basic highlight with language */
75
+ {
76
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
77
+ opts.code_highlighter = "pygments";
78
+
79
+ const char *md =
80
+ "```python\n"
81
+ "print(\"hi\")\n"
82
+ "```\n";
83
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
84
+ assert_contains(html, "class=\"highlight\"", "pygments: emits highlight wrapper");
85
+ assert_contains(html, "print", "pygments: preserves code content");
86
+ apex_free_string(html);
87
+ }
88
+
89
+ /* Pygments: line numbers */
90
+ {
91
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
92
+ opts.code_highlighter = "pygments";
93
+ opts.code_line_numbers = true;
94
+
95
+ const char *md =
96
+ "```python\n"
97
+ "print(\"hi\")\n"
98
+ "```\n";
99
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
100
+ assert_contains(html, "class=\"linenos\"", "pygments: line numbers include linenos");
101
+ apex_free_string(html);
102
+ }
103
+
104
+ /* Pygments: language-only mode should skip unlanguaged blocks */
105
+ {
106
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
107
+ opts.code_highlighter = "pygments";
108
+ opts.highlight_language_only = true;
109
+
110
+ const char *md =
111
+ "```\n"
112
+ "print(\"no lang\")\n"
113
+ "```\n";
114
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
115
+ assert_contains(html, "<pre", "language-only: still has code block");
116
+ assert_not_contains(html, "class=\"highlight\"", "language-only: unlanguaged block not highlighted");
117
+ apex_free_string(html);
118
+ }
119
+
120
+ /* Pygments: ensure unescape_html path is exercised (entities in code) */
121
+ {
122
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
123
+ opts.code_highlighter = "pygments";
124
+
125
+ const char *md =
126
+ "```python\n"
127
+ "print(\"<tag>&\")\n"
128
+ "```\n";
129
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
130
+ assert_contains(html, "class=\"highlight\"", "pygments: highlighted wrapper present (entities case)");
131
+ assert_contains(html, "&lt;tag&gt;", "pygments: highlighted output contains escaped <tag>");
132
+ assert_contains(html, "&amp;", "pygments: highlighted output contains escaped &");
133
+ apex_free_string(html);
134
+ }
135
+
136
+ /* Skylighting: basic highlight */
137
+ {
138
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
139
+ opts.code_highlighter = "skylighting";
140
+
141
+ const char *md =
142
+ "```python\n"
143
+ "print(\"hi\")\n"
144
+ "```\n";
145
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
146
+ assert_contains(html, "class=\"sourceCode\"", "skylighting: emits sourceCode wrapper");
147
+ assert_contains(html, "print", "skylighting: preserves code content");
148
+ apex_free_string(html);
149
+ }
150
+
151
+ /* Skylighting: line numbers */
152
+ {
153
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
154
+ opts.code_highlighter = "skylighting";
155
+ opts.code_line_numbers = true;
156
+
157
+ const char *md =
158
+ "```python\n"
159
+ "print(\"hi\")\n"
160
+ "```\n";
161
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
162
+ assert_contains(html, "numberSource", "skylighting: line numbers add numberSource class");
163
+ apex_free_string(html);
164
+ }
165
+
166
+ /* Skylighting: language-only mode skips unlanguaged blocks (and still highlights languaged ones) */
167
+ {
168
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
169
+ opts.code_highlighter = "skylighting";
170
+ opts.highlight_language_only = true;
171
+
172
+ const char *md =
173
+ "```python\n"
174
+ "print(\"yes\")\n"
175
+ "```\n"
176
+ "\n"
177
+ "```\n"
178
+ "print(\"no\")\n"
179
+ "```\n";
180
+ char *html = apex_markdown_to_html(md, strlen(md), &opts);
181
+ test_result(contains_in_order(html, "class=\"sourceCode\"", "<pre") == 1,
182
+ "skylighting: first block highlighted, later raw <pre> remains");
183
+ apex_free_string(html);
184
+ }
185
+
186
+ /* Direct function call: cover code-tag class=\"language-...\" extraction path */
187
+ {
188
+ const char *html_in =
189
+ "<pre><code class=\"language-python\">print(&quot;hi&quot;)\n</code></pre>";
190
+ char *out = apex_apply_syntax_highlighting(html_in, "pygments", false, false);
191
+ assert_contains(out, "class=\"highlight\"", "direct: class=language-... triggers highlighting");
192
+ free(out);
193
+ }
194
+
195
+ bool had_failures = suite_end(suite_failures);
196
+ print_suite_title("Syntax Highlighting Integration Tests", had_failures, false);
197
+ }
198
+