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,418 @@
1
+ /**
2
+ * Links Tests
3
+ */
4
+
5
+ #include "test_helpers.h"
6
+ #include "apex/apex.h"
7
+ #include "../src/extensions/wiki_links.h"
8
+ #include <string.h>
9
+
10
+ void test_wiki_links(void) {
11
+ int suite_failures = suite_start();
12
+ print_suite_title("Wiki Links Tests", false, true);
13
+
14
+ apex_options opts = apex_options_default();
15
+ opts.enable_wiki_links = true;
16
+ char *html;
17
+
18
+ /* Test basic wiki link */
19
+ html = apex_markdown_to_html("[[Page]]", 8, &opts);
20
+ assert_contains(html, "<a href=\"Page\">Page</a>", "Basic wiki link");
21
+ apex_free_string(html);
22
+
23
+ /* Test wiki links are NOT processed when feature is disabled */
24
+ {
25
+ apex_options disabled = apex_options_default();
26
+ disabled.enable_wiki_links = false;
27
+ html = apex_markdown_to_html("[[Page]]", 8, &disabled);
28
+ assert_contains(html, "[[Page]]", "Wiki link literal preserved when disabled");
29
+ assert_not_contains(html, "<a href=", "No link generated when wiki links disabled");
30
+ apex_free_string(html);
31
+ }
32
+
33
+ /* Test wiki link with display text */
34
+ html = apex_markdown_to_html("[[Page|Display]]", 16, &opts);
35
+ assert_contains(html, "<a href=\"Page\">Display</a>", "Wiki link with display");
36
+ apex_free_string(html);
37
+
38
+ /* Test wiki link with section */
39
+ html = apex_markdown_to_html("[[Page#Section]]", 16, &opts);
40
+ assert_contains(html, "#Section", "Wiki link with section");
41
+ apex_free_string(html);
42
+
43
+ /* Test wiki link with section AND display text: [[Page#Sec|Display]] */
44
+ html = apex_markdown_to_html("[[Page#Sec|Display]]", 20, &opts);
45
+ assert_contains(html, "<a href=\"Page#Sec\">Display</a>", "Wiki link with section and display text");
46
+ apex_free_string(html);
47
+
48
+ /* Test multiple wiki links in one text node (prefix + between + tail handling) */
49
+ html = apex_markdown_to_html("A [[One]] and [[Two|2]] end", strlen("A [[One]] and [[Two|2]] end"), &opts);
50
+ assert_contains(html, "A ", "Multiple links: prefix preserved");
51
+ assert_contains(html, "<a href=\"One\">One</a>", "Multiple links: first converted");
52
+ assert_contains(html, "<a href=\"Two\">2</a>", "Multiple links: second converted");
53
+ assert_contains(html, " end", "Multiple links: trailing text preserved");
54
+ apex_free_string(html);
55
+
56
+ /* Test adjacent wiki links */
57
+ html = apex_markdown_to_html("[[A]][[B]]", strlen("[[A]][[B]]"), &opts);
58
+ assert_contains(html, "<a href=\"A\">A</a>", "Adjacent links: first");
59
+ assert_contains(html, "<a href=\"B\">B</a>", "Adjacent links: second");
60
+ apex_free_string(html);
61
+
62
+ /* Test malformed wiki link with no closing marker (should remain literal) */
63
+ html = apex_markdown_to_html("Start [[Broken", strlen("Start [[Broken"), &opts);
64
+ assert_contains(html, "[[Broken", "Malformed wiki link (no close) preserved as text");
65
+ assert_not_contains(html, "<a href=", "Malformed wiki link (no close) does not create link");
66
+ apex_free_string(html);
67
+
68
+ /* Test empty wiki link content: [[]] should remain literal */
69
+ html = apex_markdown_to_html("[[]]", strlen("[[]]"), &opts);
70
+ assert_contains(html, "[[]]", "Empty wiki link preserved as text");
71
+ assert_not_contains(html, "<a href=", "Empty wiki link does not create link");
72
+ apex_free_string(html);
73
+
74
+ /* Test space mode: dash (default) */
75
+ opts.wikilink_space = 0; /* dash */
76
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
77
+ assert_contains(html, "<a href=\"Home-Page\">Home Page</a>", "Wiki link space mode: dash");
78
+ apex_free_string(html);
79
+
80
+ /* Test space mode: none */
81
+ opts.wikilink_space = 1; /* none */
82
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
83
+ assert_contains(html, "<a href=\"HomePage\">Home Page</a>", "Wiki link space mode: none");
84
+ apex_free_string(html);
85
+
86
+ /* Test space mode: underscore */
87
+ opts.wikilink_space = 2; /* underscore */
88
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
89
+ assert_contains(html, "<a href=\"Home_Page\">Home Page</a>", "Wiki link space mode: underscore");
90
+ apex_free_string(html);
91
+
92
+ /* Test space mode: space (URL-encoded as %20) */
93
+ opts.wikilink_space = 3; /* space */
94
+ opts.wikilink_extension = NULL; /* Reset extension */
95
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
96
+ assert_contains(html, "<a href=\"Home%20Page\">Home Page</a>", "Wiki link space mode: space (URL-encoded)");
97
+ apex_free_string(html);
98
+
99
+ /* Test extension without leading dot */
100
+ opts.wikilink_space = 0; /* dash (default) */
101
+ opts.wikilink_extension = "html";
102
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
103
+ assert_contains(html, "<a href=\"Home-Page.html\">Home Page</a>", "Wiki link with extension (no leading dot)");
104
+ apex_free_string(html);
105
+
106
+ /* Test extension with leading dot */
107
+ opts.wikilink_extension = ".html";
108
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
109
+ assert_contains(html, "<a href=\"Home-Page.html\">Home Page</a>", "Wiki link with extension (with leading dot)");
110
+ apex_free_string(html);
111
+
112
+ /* Test extension with section */
113
+ opts.wikilink_extension = "html";
114
+ html = apex_markdown_to_html("[[Home Page#Section]]", 21, &opts);
115
+ assert_contains(html, "<a href=\"Home-Page.html#Section\">Home Page</a>", "Wiki link with extension and section");
116
+ apex_free_string(html);
117
+
118
+ /* Test extension with display text */
119
+ {
120
+ apex_options test_opts = apex_options_default();
121
+ test_opts.enable_wiki_links = true;
122
+ test_opts.wikilink_space = 0; /* dash */
123
+ test_opts.wikilink_extension = "html";
124
+ html = apex_markdown_to_html("[[Home Page|Main]]", 18, &test_opts);
125
+ assert_contains(html, "<a href=\"Home-Page.html\">Main</a>", "Wiki link with extension and display text");
126
+ apex_free_string(html);
127
+ }
128
+
129
+ /* Test space mode none with extension */
130
+ opts.wikilink_space = 1; /* none */
131
+ opts.wikilink_extension = "md";
132
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
133
+ assert_contains(html, "<a href=\"HomePage.md\">Home Page</a>", "Wiki link space mode none with extension");
134
+ apex_free_string(html);
135
+
136
+ /* Test space mode underscore with extension */
137
+ opts.wikilink_space = 2; /* underscore */
138
+ opts.wikilink_extension = "html";
139
+ html = apex_markdown_to_html("[[Home Page]]", 13, &opts);
140
+ assert_contains(html, "<a href=\"Home_Page.html\">Home Page</a>", "Wiki link space mode underscore with extension");
141
+ apex_free_string(html);
142
+
143
+ /* Test multiple spaces with dash mode */
144
+ {
145
+ apex_options test_opts = apex_options_default();
146
+ test_opts.enable_wiki_links = true;
147
+ test_opts.wikilink_space = 0; /* dash */
148
+ test_opts.wikilink_extension = NULL;
149
+ html = apex_markdown_to_html("[[My Home Page]]", 16, &test_opts);
150
+ assert_contains(html, "<a href=\"My-Home-Page\">My Home Page</a>", "Wiki link multiple spaces with dash");
151
+ apex_free_string(html);
152
+ }
153
+
154
+ /* Test multiple spaces with none mode */
155
+ {
156
+ apex_options test_opts = apex_options_default();
157
+ test_opts.enable_wiki_links = true;
158
+ test_opts.wikilink_space = 1; /* none */
159
+ test_opts.wikilink_extension = NULL;
160
+ html = apex_markdown_to_html("[[My Home Page]]", 16, &test_opts);
161
+ assert_contains(html, "<a href=\"MyHomePage\">My Home Page</a>", "Wiki link multiple spaces with none");
162
+ apex_free_string(html);
163
+ }
164
+
165
+ struct {
166
+ const char *md;
167
+ size_t md_len;
168
+ int wikilink_space;
169
+ const char *wikilink_extension;
170
+ const char *expect;
171
+ const char *desc;
172
+ } sanitize_tests[] = {
173
+ /* basic sanitization */
174
+ { "[[Mork💓Mindy]]", 17, WIKILINK_SPACE_DASH, NULL, "href=\"mork-mindy\"", "Sanitize emoji in the middle of words" },
175
+ { "[[UPPERCASE Page]]", 18, WIKILINK_SPACE_DASH, NULL, "<a href=\"uppercase-page\">UPPERCASE Page</a>", "Sanitize lowercases" },
176
+ { "[[Hello!! World!!]]", 19, WIKILINK_SPACE_DASH, NULL, "<a href=\"hello-world\">Hello!! World!!</a>", "Sanitize replaces non-alnum" },
177
+ { "[[Hello World]]", 17, WIKILINK_SPACE_DASH, NULL, "<a href=\"hello-world\">Hello World</a>", "Sanitize removes duplicate dashes" },
178
+ { "[[???Hello World???]]", 21, WIKILINK_SPACE_DASH, NULL, "href=\"hello-world\"", "Sanitize removes leading/trailing" },
179
+ { "[[Hello World]]", 15, WIKILINK_SPACE_DASH, "html", "<a href=\"hello-world.html\">Hello World</a>", "Sanitize with extension" },
180
+ { "[[path/to/FILE.MD]]", 19, WIKILINK_SPACE_DASH, NULL, "href=\"path/to/file.md\"", "Sanitize preserves slashes and periods" },
181
+ { "[[My Page Name|Click Here]]", 27, WIKILINK_SPACE_DASH, NULL, "<a href=\"my-page-name\">Click Here</a>", "Sanitize with display text" },
182
+ /* apostrophes and quotes always removed */
183
+ { "[[O'Brien's Page]]", 18, WIKILINK_SPACE_DASH, NULL, "href=\"obriens-page\"", "Sanitize removes apostrophes" },
184
+ { "[[Abso\\`fricking´lutely]]", 27, WIKILINK_SPACE_DASH, NULL, "href=\"absofrickinglutely\"", "Sanitize removes ascii fancy apostrophes" },
185
+ { "[[Abso‘fricking’lutely]]", 28, WIKILINK_SPACE_DASH, NULL, "href=\"absofrickinglutely\"", "Sanitize removes unicode fancy apostrophes" },
186
+ { "[[Abso\"fricking\"lutely]]", 28, WIKILINK_SPACE_DASH, NULL, "href=\"absofrickinglutely\"", "Sanitize removes quotes" },
187
+ { "[[Abso“fricking”lutely]]", 28, WIKILINK_SPACE_DASH, NULL, "href=\"absofrickinglutely\"", "Sanitize removes unicode fancy quotes" },
188
+ /* different space modes */
189
+ { "[[Hello World]]", 15, WIKILINK_SPACE_UNDERSCORE, NULL, "<a href=\"hello_world\">Hello World</a>", "Sanitize with underscore mode" },
190
+ { "[[Hello World!!!]]", 18, WIKILINK_SPACE_NONE, NULL, "<a href=\"helloworld\">Hello World!!!</a>", "Sanitize with none mode" },
191
+ /* unicode accents */
192
+ { "[[L" "\xC3\xA9" "on]]", 22, WIKILINK_SPACE_DASH, NULL, "<a href=\"leon\"", "Accents removed NFC: lowercase" },
193
+ { "[[L" "\xC3\x89" "ON]]", 22, WIKILINK_SPACE_DASH, NULL, "<a href=\"leon\"", "Accents removed NFC: uppercase" },
194
+ { "[[L" "\x65\xCC\x81" "on]]", 22, WIKILINK_SPACE_DASH, NULL, "<a href=\"leon\"", "Accents removed NFD: lowercase" },
195
+ { "[[L" "\x45\xCC\x81" "ON]]", 22, WIKILINK_SPACE_DASH, NULL, "<a href=\"leon\"", "Accents removed NFD: uppercase" },
196
+ /* ligatures: æ (U+00E6) = 0xC3 0xA6, Æ (U+00C6) = 0xC3 0x86, ß (U+00DF) = 0xC3 0x9F*/
197
+ { "[[" "\xC3\xA6" "on]]", 9, WIKILINK_SPACE_DASH, NULL, "<a href=\"aeon\"", "Ligature ae lowercase" },
198
+ { "[[" "\xC3\x86" "ON]]", 9, WIKILINK_SPACE_DASH, NULL, "<a href=\"aeon\"", "Ligature ae uppercase" },
199
+ { "[[Stra" "\xC3\x9F" "e]]", 12, WIKILINK_SPACE_DASH, NULL, "<a href=\"strasse\"", "Ligature ss" },
200
+ };
201
+ for (size_t i = 0; i < sizeof(sanitize_tests)/sizeof(sanitize_tests[0]); ++i) {
202
+ apex_options test_opts = apex_options_default();
203
+ test_opts.enable_wiki_links = true;
204
+ test_opts.wikilink_space = sanitize_tests[i].wikilink_space;
205
+ test_opts.wikilink_sanitize = true;
206
+ test_opts.wikilink_extension = sanitize_tests[i].wikilink_extension;
207
+ html = apex_markdown_to_html(
208
+ sanitize_tests[i].md,
209
+ sanitize_tests[i].md_len,
210
+ &test_opts
211
+ );
212
+ assert_contains(html, sanitize_tests[i].expect, sanitize_tests[i].desc);
213
+ apex_free_string(html);
214
+ }
215
+
216
+ /* Reset options */
217
+ opts.wikilink_extension = NULL;
218
+ opts.wikilink_space = 0; /* dash (default) */
219
+
220
+ /* Direct calls for coverage: create_wiki_links_extension returns NULL (postprocess-only) */
221
+ test_result(create_wiki_links_extension() == NULL, "create_wiki_links_extension returns NULL (postprocess-only)");
222
+
223
+ /* Direct calls for coverage: wiki_links_set_config (no-op unless ext+config provided) */
224
+ {
225
+ wiki_link_config cfg;
226
+ cfg.base_path = "/wiki/";
227
+ cfg.extension = ".html";
228
+ cfg.space_mode = WIKILINK_SPACE_DASH;
229
+
230
+ cmark_syntax_extension *ext = cmark_syntax_extension_new("dummy_wiki");
231
+ wiki_links_set_config(ext, &cfg);
232
+ cmark_syntax_extension_free(cmark_get_default_mem_allocator(), ext);
233
+ test_result(true, "wiki_links_set_config called with extension and config");
234
+ }
235
+
236
+ bool had_failures = suite_end(suite_failures);
237
+ print_suite_title("Wiki Links Tests", had_failures, false);
238
+ }
239
+
240
+ /**
241
+ * Test math support
242
+ */
243
+
244
+ void test_image_embedding(void) {
245
+ int suite_failures = suite_start();
246
+ print_suite_title("Image Embedding Tests", false, true);
247
+
248
+ apex_options opts = apex_options_default();
249
+ char *html;
250
+
251
+ /* Test local image embedding */
252
+ opts.embed_images = true;
253
+ opts.base_directory = TEST_FIXTURES_DIR;
254
+ const char *local_image_md = "![Test Image](test_image.png)";
255
+ html = apex_markdown_to_html(local_image_md, strlen(local_image_md), &opts);
256
+ assert_contains(html, "<img", "Local image generates img tag");
257
+ assert_contains(html, "data:image/png;base64,", "Local image embedded as base64 data URL");
258
+ assert_not_contains(html, "test_image.png", "Local image path replaced with data URL");
259
+ apex_free_string(html);
260
+
261
+ /* Test that local images are not embedded when flag is off */
262
+ opts.embed_images = false;
263
+ html = apex_markdown_to_html(local_image_md, strlen(local_image_md), &opts);
264
+ assert_contains(html, "<img", "Local image generates img tag");
265
+ assert_contains(html, "test_image.png", "Local image path preserved when embedding disabled");
266
+ assert_not_contains(html, "data:image/png;base64,", "Local image not embedded when flag is off");
267
+ apex_free_string(html);
268
+
269
+ /* Test that remote images are not embedded (only local images supported) */
270
+ opts.embed_images = true;
271
+ const char *remote_image_md = "![Remote Image](https://fastly.picsum.photos/id/973/300/300.jpg?hmac=KKNEjIQImwiXzi0Xly-dB7LhYl5SX5koiFRx0HiSUmA)";
272
+ html = apex_markdown_to_html(remote_image_md, strlen(remote_image_md), &opts);
273
+ assert_contains(html, "<img", "Remote image generates img tag");
274
+ assert_contains(html, "fastly.picsum.photos", "Remote image URL preserved (only local images are embedded)");
275
+ assert_not_contains(html, "data:image/", "Remote image not embedded");
276
+ apex_free_string(html);
277
+
278
+ /* Test that already-embedded data URLs are not processed again */
279
+ opts.embed_images = true;
280
+ const char *data_url_md = "![Already Embedded](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==)";
281
+ html = apex_markdown_to_html(data_url_md, strlen(data_url_md), &opts);
282
+ assert_contains(html, "data:image/png;base64,", "Data URL preserved");
283
+ /* Should only appear once (not duplicated) */
284
+ const char *first = strstr(html, "data:image/png;base64,");
285
+ const char *second = first ? strstr(first + 1, "data:image/png;base64,") : NULL;
286
+ if (first && !second) {
287
+ test_result(true, "Data URL not processed again");
288
+ } else {
289
+ test_result(false, "Data URL was processed again");
290
+ }
291
+ apex_free_string(html);
292
+
293
+ /* Test base_directory for relative path resolution */
294
+ opts.embed_images = true;
295
+ opts.base_directory = NULL; /* No base directory */
296
+ const char *relative_image_md = "![Relative Image](test_image.png)";
297
+ html = apex_markdown_to_html(relative_image_md, strlen(relative_image_md), &opts);
298
+ /* Without base_directory, relative path might not be found, so it won't be embedded */
299
+ assert_contains(html, "test_image.png", "Relative image path preserved when base_directory not set");
300
+ apex_free_string(html);
301
+
302
+ /* Test with base_directory set */
303
+ opts.base_directory = TEST_FIXTURES_DIR;
304
+ html = apex_markdown_to_html(relative_image_md, strlen(relative_image_md), &opts);
305
+ assert_contains(html, "data:image/png;base64,", "Relative image embedded when base_directory is set");
306
+ assert_not_contains(html, "test_image.png", "Relative image path replaced with data URL when base_directory set");
307
+ apex_free_string(html);
308
+
309
+ /* Test that absolute paths work regardless of base_directory */
310
+ opts.base_directory = "/nonexistent/path";
311
+ char abs_path[512];
312
+ snprintf(abs_path, sizeof(abs_path), "![Absolute Image](%s/test_image.png)", TEST_FIXTURES_DIR);
313
+ html = apex_markdown_to_html(abs_path, strlen(abs_path), &opts);
314
+ assert_contains(html, "data:image/png;base64,", "Absolute path image embedded regardless of base_directory");
315
+ apex_free_string(html);
316
+
317
+ bool had_failures = suite_end(suite_failures);
318
+ print_suite_title("Image Embedding Tests", had_failures, false);
319
+ }
320
+
321
+ /**
322
+ * Test image width/height attribute conversion
323
+ */
324
+
325
+ void test_image_width_height_conversion(void) {
326
+ int suite_failures = suite_start();
327
+ print_suite_title("Image Width/Height Conversion Tests", false, true);
328
+
329
+ apex_options opts = apex_options_for_mode(APEX_MODE_UNIFIED);
330
+ char *html;
331
+
332
+ /* Test 1: Percentage width → style attribute */
333
+ html = apex_markdown_to_html("![](img.jpg){ width=50% }", strlen("![](img.jpg){ width=50% }"), &opts);
334
+ assert_contains(html, "style=\"width: 50%\"", "Percentage width converted to style");
335
+ assert_not_contains(html, "width=\"50%\"", "Percentage not in width attribute");
336
+ apex_free_string(html);
337
+
338
+ /* Test 2: Pixel width → integer width attribute */
339
+ html = apex_markdown_to_html("![](img.jpg){ width=300px }", strlen("![](img.jpg){ width=300px }"), &opts);
340
+ assert_contains(html, "width=\"300\"", "Pixel width converted to integer");
341
+ assert_not_contains(html, "width=\"300px\"", "px suffix removed");
342
+ assert_not_contains(html, "style=\"width: 300px\"", "Pixel not in style");
343
+ apex_free_string(html);
344
+
345
+ /* Test 3: Bare integer width → width attribute */
346
+ html = apex_markdown_to_html("![](img.jpg){ width=300 }", strlen("![](img.jpg){ width=300 }"), &opts);
347
+ assert_contains(html, "width=\"300\"", "Bare integer width preserved");
348
+ apex_free_string(html);
349
+
350
+ /* Test 4: Percentage height → style attribute */
351
+ html = apex_markdown_to_html("![](img.jpg){ height=75% }", strlen("![](img.jpg){ height=75% }"), &opts);
352
+ assert_contains(html, "style=\"height: 75%\"", "Percentage height converted to style");
353
+ apex_free_string(html);
354
+
355
+ /* Test 5: Pixel height → integer height attribute */
356
+ html = apex_markdown_to_html("![](img.jpg){ height=200px }", strlen("![](img.jpg){ height=200px }"), &opts);
357
+ assert_contains(html, "height=\"200\"", "Pixel height converted to integer");
358
+ assert_not_contains(html, "height=\"200px\"", "px suffix removed");
359
+ apex_free_string(html);
360
+
361
+ /* Test 6: Both width and height with percentages → style */
362
+ html = apex_markdown_to_html("![](img.jpg){ width=50% height=75% }", strlen("![](img.jpg){ width=50% height=75% }"), &opts);
363
+ assert_contains(html, "style=\"width: 50%; height: 75%\"", "Both percentages in style");
364
+ apex_free_string(html);
365
+
366
+ /* Test 7: Mixed - pixel width, percentage height */
367
+ html = apex_markdown_to_html("![](img.jpg){ width=300px height=50% }", strlen("![](img.jpg){ width=300px height=50% }"), &opts);
368
+ assert_contains(html, "width=\"300\"", "Pixel width as attribute");
369
+ assert_contains(html, "style=\"height: 50%\"", "Percentage height in style");
370
+ apex_free_string(html);
371
+
372
+ /* Test 8: Mixed - percentage width, pixel height */
373
+ html = apex_markdown_to_html("![](img.jpg){ width=50% height=200px }", strlen("![](img.jpg){ width=50% height=200px }"), &opts);
374
+ assert_contains(html, "height=\"200\"", "Pixel height as attribute");
375
+ assert_contains(html, "style=\"width: 50%\"", "Percentage width in style");
376
+ apex_free_string(html);
377
+
378
+ /* Test 9: Other units (em, rem) → style */
379
+ html = apex_markdown_to_html("![](img.jpg){ width=5em height=10rem }", strlen("![](img.jpg){ width=5em height=10rem }"), &opts);
380
+ assert_contains(html, "style=\"width: 5em; height: 10rem\"", "Other units in style");
381
+ apex_free_string(html);
382
+
383
+ /* Test 10: Decimal pixel value → style */
384
+ html = apex_markdown_to_html("![](img.jpg){ width=100.5px }", strlen("![](img.jpg){ width=100.5px }"), &opts);
385
+ assert_contains(html, "style=\"width: 100.5px\"", "Decimal pixel in style");
386
+ assert_not_contains(html, "width=\"100.5\"", "Decimal pixel not as attribute");
387
+ apex_free_string(html);
388
+
389
+ /* Test 11: Viewport units → style */
390
+ html = apex_markdown_to_html("![](img.jpg){ width=50vw height=30vh }", strlen("![](img.jpg){ width=50vw height=30vh }"), &opts);
391
+ assert_contains(html, "style=\"width: 50vw; height: 30vh\"", "Viewport units in style");
392
+ apex_free_string(html);
393
+
394
+ /* Test 12: Inline image with IAL and percentage */
395
+ html = apex_markdown_to_html("![alt](img.jpg){ width=75% }", strlen("![alt](img.jpg){ width=75% }"), &opts);
396
+ assert_contains(html, "style=\"width: 75%\"", "Inline image percentage in style");
397
+ apex_free_string(html);
398
+
399
+ /* Test 13: Mixed with other attributes (ID, class) */
400
+ html = apex_markdown_to_html("![test](img.jpg){#test .image width=250px height=80% }", strlen("![test](img.jpg){#test .image width=250px height=80% }"), &opts);
401
+ assert_contains(html, "id=\"test\"", "ID preserved");
402
+ assert_contains(html, "class=\"image\"", "Class preserved");
403
+ assert_contains(html, "width=\"250\"", "Pixel width as attribute");
404
+ assert_contains(html, "style=\"height: 80%\"", "Percentage height in style");
405
+ apex_free_string(html);
406
+
407
+ /* Test 14: Zero pixel value */
408
+ html = apex_markdown_to_html("![](img.jpg){ width=0px }", strlen("![](img.jpg){ width=0px }"), &opts);
409
+ assert_contains(html, "width=\"0\"", "Zero pixel converted to integer");
410
+ apex_free_string(html);
411
+
412
+ bool had_failures = suite_end(suite_failures);
413
+ print_suite_title("Image Width/Height Conversion Tests", had_failures, false);
414
+ }
415
+
416
+ /**
417
+ * Test indices (mmark and TextIndex syntax)
418
+ */