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,39 @@
1
+ /**
2
+ * Relaxed Tables Extension for Apex
3
+ *
4
+ * Supports tables without separator rows (Kramdown-style):
5
+ * A | B
6
+ * 1 | 2
7
+ *
8
+ * This preprocessing step detects such tables and inserts separator rows
9
+ * so the existing table parser can handle them.
10
+ */
11
+
12
+ #ifndef APEX_RELAXED_TABLES_H
13
+ #define APEX_RELAXED_TABLES_H
14
+
15
+ #ifdef __cplusplus
16
+ extern "C" {
17
+ #endif
18
+
19
+ /**
20
+ * Process relaxed tables - detect tables without separator rows and insert them
21
+ * @param text Input markdown text
22
+ * @return Newly allocated text with separator rows inserted (must be freed), or NULL if no changes
23
+ */
24
+ char *apex_process_relaxed_tables(const char *text);
25
+
26
+ /**
27
+ * Process headerless tables - detect separator rows without header rows and insert dummy headers
28
+ * This allows alignment to be applied to tables that start with a separator row
29
+ * @param text Input markdown text
30
+ * @return Newly allocated text with dummy headers inserted (must be freed), or NULL if no changes
31
+ */
32
+ char *apex_process_headerless_tables(const char *text);
33
+
34
+ #ifdef __cplusplus
35
+ }
36
+ #endif
37
+
38
+ #endif /* APEX_RELAXED_TABLES_H */
39
+
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Special Markers Extension for Apex
3
+ * Implementation
4
+ */
5
+
6
+ #include "special_markers.h"
7
+ #include <string.h>
8
+ #include <stdlib.h>
9
+ #include <stdio.h>
10
+ #include <ctype.h>
11
+ #include <stdbool.h>
12
+
13
+ /**
14
+ * Process special markers in text
15
+ */
16
+ char *apex_process_special_markers(const char *text) {
17
+ if (!text) return NULL;
18
+
19
+ size_t len = strlen(text);
20
+ /* Page break divs are ~64 bytes each, so need generous capacity */
21
+ size_t capacity = len * 4; /* Room for expansion */
22
+ char *output = malloc(capacity);
23
+ if (!output) return strdup(text);
24
+
25
+ const char *read = text;
26
+ char *write = output;
27
+ size_t remaining = capacity;
28
+
29
+ while (*read) {
30
+ /* Check for End of Block marker (Kramdown) */
31
+ /* Pattern: ^ on a line by itself (with optional leading whitespace) */
32
+ if (*read == '^') {
33
+ /* Check if it's on its own line */
34
+ const char *before = read - 1;
35
+ bool line_start = (read == text);
36
+
37
+ /* Skip back over whitespace to check for line start */
38
+ while (!line_start && before >= text && (*before == ' ' || *before == '\t')) {
39
+ before--;
40
+ }
41
+ if (!line_start && before >= text && *before == '\n') {
42
+ line_start = true;
43
+ }
44
+
45
+ /* Check what comes after */
46
+ const char *after = read + 1;
47
+ bool line_end = (*after == '\n' || *after == '\0');
48
+ while (!line_end && (*after == ' ' || *after == '\t')) {
49
+ after++;
50
+ }
51
+ if (!line_end && (*after == '\n' || *after == '\0')) {
52
+ line_end = true;
53
+ }
54
+
55
+ if (line_start && line_end) {
56
+ /* This is an end-of-block marker */
57
+ /* Replace with a paragraph containing zero-width space (U+200B) to force block separation */
58
+ /* This ensures lists are not merged by the parser, and the paragraph won't render visibly */
59
+ const char *replacement = "\n\n\u200B\n\n";
60
+ size_t repl_len = strlen(replacement);
61
+ if (repl_len < remaining) {
62
+ memcpy(write, replacement, repl_len);
63
+ write += repl_len;
64
+ remaining -= repl_len;
65
+ }
66
+ /* Skip to after the ^ and any trailing whitespace/newline */
67
+ read = after;
68
+ if (*read == '\n') read++;
69
+ continue;
70
+ }
71
+ }
72
+
73
+ /* Check for <!--BREAK--> */
74
+ if (strncmp(read, "<!--BREAK-->", 12) == 0) {
75
+ const char *replacement =
76
+ "\n\n<div class=\"mkpagebreak manualbreak\" "
77
+ "title=\"Page break created by marker\" "
78
+ "data-description=\"PAGE (Marker)\" "
79
+ "style=\"page-break-after:always\">"
80
+ "<span style=\"display:none\">&nbsp;</span></div>\n\n";
81
+ size_t repl_len = strlen(replacement);
82
+ if (repl_len >= remaining) {
83
+ /* Expand buffer */
84
+ size_t written = (size_t)(write - output);
85
+ capacity = (written + repl_len + 100) * 2;
86
+ char *new_output = realloc(output, capacity);
87
+ if (!new_output) {
88
+ free(output);
89
+ return strdup(text);
90
+ }
91
+ output = new_output;
92
+ write = output + written;
93
+ remaining = capacity - written;
94
+ }
95
+ memcpy(write, replacement, repl_len);
96
+ write += repl_len;
97
+ remaining -= repl_len;
98
+ read += 12;
99
+ continue;
100
+ }
101
+
102
+ /* Check for <!--PAUSE:X--> */
103
+ if (strncmp(read, "<!--PAUSE:", 10) == 0) {
104
+ const char *num_start = read + 10;
105
+ const char *num_end = num_start;
106
+ while (isdigit((unsigned char)*num_end)) num_end++;
107
+
108
+ if (*num_end == '-' && num_end[1] == '-' && num_end[2] == '>') {
109
+ /* Valid PAUSE marker */
110
+ int seconds = atoi(num_start);
111
+ char replacement[256];
112
+ snprintf(replacement, sizeof(replacement),
113
+ "<div class=\"autoscroll-pause\" data-pause=\"%d\"></div>",
114
+ seconds);
115
+
116
+ size_t repl_len = strlen(replacement);
117
+ if (repl_len < remaining) {
118
+ memcpy(write, replacement, repl_len);
119
+ write += repl_len;
120
+ remaining -= repl_len;
121
+ }
122
+ read = num_end + 3;
123
+ continue;
124
+ }
125
+ }
126
+
127
+ /* Check for {::pagebreak /} (Leanpub style) */
128
+ if (strncmp(read, "{::pagebreak /}", 15) == 0) {
129
+ const char *replacement =
130
+ "\n\n<div class=\"mkpagebreak manualbreak\" "
131
+ "title=\"Page break created by marker\" "
132
+ "data-description=\"PAGE (Marker)\" "
133
+ "style=\"page-break-after:always\">"
134
+ "<span style=\"display:none\">&nbsp;</span></div>\n\n";
135
+ size_t repl_len = strlen(replacement);
136
+ if (repl_len >= remaining) {
137
+ /* Expand buffer */
138
+ size_t written = (size_t)(write - output);
139
+ capacity = (written + repl_len + 100) * 2;
140
+ char *new_output = realloc(output, capacity);
141
+ if (!new_output) {
142
+ free(output);
143
+ return strdup(text);
144
+ }
145
+ output = new_output;
146
+ write = output + written;
147
+ remaining = capacity - written;
148
+ }
149
+ memcpy(write, replacement, repl_len);
150
+ write += repl_len;
151
+ remaining -= repl_len;
152
+ read += 15;
153
+ continue;
154
+ }
155
+
156
+ /* Check for {index} (Leanpub index placement marker).
157
+ * Replaced with <!--INDEX--> so the index extension inserts the index there.
158
+ * The marker is always removed from the document (either replaced by the
159
+ * index block or left as an invisible HTML comment when index is suppressed). */
160
+ if (strncmp(read, "{index}", 8) == 0) {
161
+ const char *replacement = "<!--INDEX-->";
162
+ size_t repl_len = strlen(replacement);
163
+ if (repl_len >= remaining) {
164
+ size_t written = (size_t)(write - output);
165
+ capacity = (written + repl_len + 100) * 2;
166
+ char *new_output = realloc(output, capacity);
167
+ if (!new_output) {
168
+ free(output);
169
+ return strdup(text);
170
+ }
171
+ output = new_output;
172
+ write = output + written;
173
+ remaining = capacity - written;
174
+ }
175
+ memcpy(write, replacement, repl_len);
176
+ write += repl_len;
177
+ remaining -= repl_len;
178
+ read += 8;
179
+ continue;
180
+ }
181
+
182
+ /* Not a special marker, copy character */
183
+ if (remaining > 0) {
184
+ *write++ = *read++;
185
+ remaining--;
186
+ } else {
187
+ read++;
188
+ }
189
+ }
190
+
191
+ *write = '\0';
192
+ return output;
193
+ }
194
+
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Special Markers Extension for Apex
3
+ *
4
+ * Handles Marked's special HTML comment markers:
5
+ * <!--BREAK--> - Page break for print/PDF
6
+ * <!--PAUSE:X--> - Autoscroll pause for X seconds
7
+ * {::pagebreak /} - Leanpub page break
8
+ * {index} - Leanpub index placement (replaced with <!--INDEX-->)
9
+ */
10
+
11
+ #ifndef APEX_SPECIAL_MARKERS_H
12
+ #define APEX_SPECIAL_MARKERS_H
13
+
14
+ #ifdef __cplusplus
15
+ extern "C" {
16
+ #endif
17
+
18
+ /**
19
+ * Process special markers in text (preprocessing)
20
+ * Replaces markers with appropriate HTML
21
+ */
22
+ char *apex_process_special_markers(const char *text);
23
+
24
+ #ifdef __cplusplus
25
+ }
26
+ #endif
27
+
28
+ #endif /* APEX_SPECIAL_MARKERS_H */
29
+
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Superscript and Subscript Extension
3
+ * Converts ^text^ to <sup>text</sup> and ~text~ to <sub>text</sub>
4
+ * MultiMarkdown-style syntax
5
+ */
6
+
7
+ #include "sup_sub.h"
8
+ #include <string.h>
9
+ #include <stdlib.h>
10
+ #include <stdbool.h>
11
+ #include <ctype.h>
12
+
13
+ /**
14
+ * Process superscript and subscript syntax as preprocessing
15
+ * Converts to <sup>text</sup> and <sub>text</sub> before parsing
16
+ */
17
+ char *apex_process_sup_sub(const char *text) {
18
+ if (!text) return NULL;
19
+
20
+ size_t len = strlen(text);
21
+ /* Allocate enough space: original text + potential tag expansions
22
+ * Each ^ or ~ can expand to ~20 chars (<sup>content</sup> or <sub>content</sub>)
23
+ * Use len * 5 to be safe, with a minimum of 64 bytes */
24
+ size_t capacity = (len * 5 > 64) ? len * 5 : 64;
25
+ char *output = malloc(capacity);
26
+ if (!output) return NULL;
27
+
28
+ const char *read = text;
29
+ char *write = output;
30
+ size_t remaining = capacity;
31
+
32
+ bool in_code_block = false;
33
+ bool in_inline_code = false;
34
+ bool in_math_inline = false;
35
+ bool in_math_display = false;
36
+ bool in_liquid = false;
37
+
38
+ while (*read) {
39
+ /* Track Liquid tags (skip processing inside them) */
40
+ if (!in_liquid && *read == '{' && read[1] == '%') {
41
+ in_liquid = true;
42
+ if (remaining > 1) {
43
+ *write++ = *read++;
44
+ *write++ = *read++;
45
+ remaining -= 2;
46
+ } else {
47
+ read += 2;
48
+ }
49
+ continue;
50
+ }
51
+ if (in_liquid) {
52
+ if (*read == '%' && read[1] == '}') {
53
+ if (remaining > 1) {
54
+ *write++ = *read++;
55
+ *write++ = *read++;
56
+ remaining -= 2;
57
+ } else {
58
+ read += 2;
59
+ }
60
+ in_liquid = false;
61
+ } else if (remaining > 0) {
62
+ *write++ = *read++;
63
+ remaining--;
64
+ } else {
65
+ read++;
66
+ }
67
+ continue;
68
+ }
69
+ /* Track code blocks (skip processing inside them) */
70
+ if (*read == '`') {
71
+ if (read[1] == '`' && read[2] == '`') {
72
+ in_code_block = !in_code_block;
73
+ } else if (!in_code_block) {
74
+ in_inline_code = !in_inline_code;
75
+ }
76
+ }
77
+
78
+ /* Track math spans (skip processing inside them) */
79
+ bool handled_math = false;
80
+ if (!in_code_block && !in_inline_code) {
81
+ /* Check for display math: $$...$$ */
82
+ if (*read == '$' && read[1] == '$') {
83
+ in_math_display = !in_math_display;
84
+ if (remaining > 1) {
85
+ *write++ = *read++;
86
+ *write++ = *read++;
87
+ remaining -= 2;
88
+ } else {
89
+ read += 2;
90
+ }
91
+ handled_math = true;
92
+ }
93
+ /* Check for inline math: $...$ */
94
+ else if (*read == '$' && !in_math_display) {
95
+ /* Check if next char is not $ (to avoid matching $$) */
96
+ if (read[1] != '$') {
97
+ /* If we're already in inline math, this is the closing delimiter */
98
+ if (in_math_inline) {
99
+ in_math_inline = false;
100
+ /* Write the closing $ */
101
+ if (remaining > 0) {
102
+ *write++ = *read++;
103
+ remaining--;
104
+ } else {
105
+ read++;
106
+ }
107
+ handled_math = true;
108
+ }
109
+ /* Otherwise, check if it's a valid opening delimiter (not whitespace) */
110
+ else if (read[1] != '\0' && read[1] != ' ' && read[1] != '\t' && read[1] != '\n') {
111
+ in_math_inline = true;
112
+ /* Write the opening $ */
113
+ if (remaining > 0) {
114
+ *write++ = *read++;
115
+ remaining--;
116
+ } else {
117
+ read++;
118
+ }
119
+ handled_math = true;
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ /* Skip processing inside code or math */
126
+ if (handled_math || in_code_block || in_inline_code || in_math_inline || in_math_display) {
127
+ if (!handled_math && remaining > 0) {
128
+ *write++ = *read++;
129
+ remaining--;
130
+ } else if (!handled_math) {
131
+ read++;
132
+ }
133
+ continue;
134
+ }
135
+
136
+ /* Check for superscript: ^word (only first word, stops at space, ^, or end) */
137
+ /* Skip if it's part of a footnote reference pattern [^ */
138
+ if (*read == '^' && read[1] != '\0' && read[1] != ' ' && read[1] != '\t' && read[1] != '\n' && read[1] != '^') {
139
+ /* Skip if previous character is '[' (footnote reference) */
140
+ if (read > text && read[-1] == '[') {
141
+ /* Copy the ^ character and continue */
142
+ if (remaining > 0) {
143
+ *write++ = *read++;
144
+ remaining--;
145
+ } else {
146
+ read++;
147
+ }
148
+ continue;
149
+ }
150
+
151
+ const char *content_start = read + 1;
152
+ const char *content_end = content_start;
153
+
154
+ /* Find end of word (stops at space, punctuation, ^, newline, or end of string) */
155
+ /* Don't include sentence terminators in the superscript */
156
+ while (*content_end && *content_end != ' ' && *content_end != '\t' && *content_end != '\n' && *content_end != '^') {
157
+ /* Stop at sentence terminators: . , ; : ! ? */
158
+ if (*content_end == '.' || *content_end == ',' || *content_end == ';' ||
159
+ *content_end == ':' || *content_end == '!' || *content_end == '?') {
160
+ break;
161
+ }
162
+ content_end++;
163
+ }
164
+
165
+ size_t content_len = content_end - content_start;
166
+
167
+ /* Only process if we have content */
168
+ if (content_len > 0) {
169
+ const char *open_tag = "<sup>";
170
+ const char *close_tag = "</sup>";
171
+ size_t open_tag_len = strlen(open_tag);
172
+ size_t close_tag_len = strlen(close_tag);
173
+ size_t total_needed = open_tag_len + content_len + close_tag_len;
174
+
175
+ /* Only write if we have enough space for all parts */
176
+ if (remaining >= total_needed) {
177
+ /* Write <sup> */
178
+ memcpy(write, open_tag, open_tag_len);
179
+ write += open_tag_len;
180
+ remaining -= open_tag_len;
181
+
182
+ /* Copy superscript content */
183
+ memcpy(write, content_start, content_len);
184
+ write += content_len;
185
+ remaining -= content_len;
186
+
187
+ /* Write </sup> - we know we have space because we checked total_needed */
188
+ memcpy(write, close_tag, close_tag_len);
189
+ write += close_tag_len;
190
+ remaining -= close_tag_len;
191
+
192
+ /* Skip past the content (and the marker if we stopped at it) */
193
+ read = content_end;
194
+ /* If we stopped at ^ or ~, skip past it so it's not reprocessed */
195
+ if (*read == '^' || *read == '~') {
196
+ read++;
197
+ }
198
+ continue;
199
+ }
200
+ }
201
+ }
202
+
203
+ /* Check for subscript: ~word (only first word, stops at space, ~, or end) */
204
+ /* First, check for critic markup patterns that use ~ */
205
+ if (*read == '~') {
206
+ /* If this ~ is part of a double-tilde sequence (~~), leave it alone
207
+ * so the strikethrough extension can handle it.
208
+ * Also skip if the previous character was ~ (already part of ~~).
209
+ */
210
+ if ((read > text && read[-1] == '~') || read[1] == '~') {
211
+ if (remaining > 0) {
212
+ *write++ = *read++;
213
+ remaining--;
214
+ } else {
215
+ read++;
216
+ }
217
+ continue;
218
+ }
219
+
220
+ /* Check for {~~ (opening critic substitution) - previous char is { and next is ~ */
221
+ if (read > text && read[-1] == '{' && read[1] == '~') {
222
+ /* Copy both ~ characters and continue */
223
+ if (remaining > 1) {
224
+ *write++ = *read++;
225
+ *write++ = *read++;
226
+ remaining -= 2;
227
+ } else {
228
+ read += 2;
229
+ }
230
+ continue;
231
+ }
232
+ /* Check for ~~} (closing critic substitution) - we're at second ~, previous is ~, next is } */
233
+ else if (read > text && read[-1] == '~' && read[1] == '}') {
234
+ /* Copy the ~ character and continue */
235
+ if (remaining > 0) {
236
+ *write++ = *read++;
237
+ remaining--;
238
+ } else {
239
+ read++;
240
+ }
241
+ continue;
242
+ }
243
+ /* Check for ~> (critic substitution separator) */
244
+ else if (read[1] == '>') {
245
+ /* Copy the ~ character and continue */
246
+ if (remaining > 0) {
247
+ *write++ = *read++;
248
+ remaining--;
249
+ } else {
250
+ read++;
251
+ }
252
+ continue;
253
+ }
254
+ }
255
+
256
+ /* Check for tilde-based syntax: ~text~ (underline), ~word (subscript), or ~~text~~ (strikethrough, already skipped) */
257
+ if (*read == '~' && read[1] != '\0' && read[1] != ' ' && read[1] != '\t' && read[1] != '\n' && read[1] != '~') {
258
+ const char *content_start = read + 1;
259
+ const char *content_end = content_start;
260
+ const char *closing_tilde = NULL;
261
+ bool is_underline = false;
262
+
263
+ /* First, check if the next character is a sentence terminator - if so, it's definitely subscript */
264
+ bool is_likely_subscript = false;
265
+ const char *check = content_start;
266
+ while (*check && *check != ' ' && *check != '\t' && *check != '\n' && *check != '~') {
267
+ if (*check == '.' || *check == ',' || *check == ';' || *check == ':' || *check == '!' || *check == '?') {
268
+ is_likely_subscript = true;
269
+ break;
270
+ }
271
+ check++;
272
+ }
273
+
274
+ if (!is_likely_subscript) {
275
+ /* No sentence terminator found, check for underline pattern: scan forward to find a closing ~ */
276
+ /* Underline requires tildes at word boundaries, subscript requires tildes within a word */
277
+ const char *scan = content_start;
278
+ while (*scan && *scan != '\n') {
279
+ if (*scan == '~') {
280
+ /* Found a potential closing ~ */
281
+ /* First check: if this is part of a double-tilde (~~), skip it - strikethrough handles this */
282
+ if (scan[1] == '~') {
283
+ /* This is part of ~~, skip both tildes and continue looking */
284
+ scan += 2;
285
+ continue;
286
+ }
287
+ /* Check if there's a space before it - if so, it's not a closing ~ for underline */
288
+ if (scan > content_start) {
289
+ unsigned char prev_char = (unsigned char)scan[-1];
290
+ if (isspace(prev_char)) {
291
+ /* Space before ~, so this is not a closing ~ for underline - continue looking */
292
+ scan++;
293
+ continue;
294
+ }
295
+ }
296
+ /* Check if tildes are within a word (subscript) or at word boundaries (underline) */
297
+ /* For subscript: char before opening ~ must be alphanumeric, and content between must be alphanumeric */
298
+ /* For underline: char before opening ~ must be non-alphanumeric (word boundary) */
299
+ bool char_before_is_word = (read > text) && isalnum((unsigned char)read[-1]);
300
+ bool char_after_is_word = scan[1] != '\0' && isalnum((unsigned char)scan[1]);
301
+ bool char_after_is_space_or_end = scan[1] == '\0' || isspace((unsigned char)scan[1]) || ispunct((unsigned char)scan[1]);
302
+
303
+ /* Check if content between tildes is alphanumeric */
304
+ bool content_is_word = true;
305
+ const char *check_content = content_start;
306
+ while (check_content < scan) {
307
+ if (!isalnum((unsigned char)*check_content)) {
308
+ content_is_word = false;
309
+ break;
310
+ }
311
+ check_content++;
312
+ }
313
+
314
+ if (char_before_is_word && content_is_word && (char_after_is_word || char_after_is_space_or_end)) {
315
+ /* Opening ~ is after alnum, content is alnum, closing ~ is before alnum or end/punct - this is subscript within a word */
316
+ /* Store the closing tilde for subscript, but don't set is_underline */
317
+ closing_tilde = scan;
318
+ break;
319
+ }
320
+
321
+ /* No space before ~, not part of ~~, and at word boundary - this is underline */
322
+ closing_tilde = scan;
323
+ is_underline = true;
324
+ break;
325
+ }
326
+ scan++;
327
+ }
328
+ }
329
+
330
+ if (is_underline && closing_tilde) {
331
+ /* Underline: content is between start and closing ~ */
332
+ content_end = closing_tilde;
333
+ } else if (closing_tilde && !is_underline) {
334
+ /* Subscript with closing ~ within a word: content is between start and closing ~ */
335
+ content_end = closing_tilde;
336
+ } else {
337
+ /* Subscript: find end of word (stops at space, punctuation, newline, or ~) */
338
+ /* Don't include sentence terminators in the subscript */
339
+ while (*content_end && *content_end != ' ' && *content_end != '\t' && *content_end != '\n' && *content_end != '~') {
340
+ /* Stop at sentence terminators: . , ; : ! ? */
341
+ if (*content_end == '.' || *content_end == ',' || *content_end == ';' ||
342
+ *content_end == ':' || *content_end == '!' || *content_end == '?') {
343
+ break;
344
+ }
345
+ content_end++;
346
+ }
347
+ }
348
+
349
+ size_t content_len = content_end - content_start;
350
+
351
+ /* Only process if we have content */
352
+ if (content_len > 0) {
353
+
354
+ const char *open_tag = is_underline ? "<u>" : "<sub>";
355
+ const char *close_tag = is_underline ? "</u>" : "</sub>";
356
+ size_t open_tag_len = strlen(open_tag);
357
+ size_t close_tag_len = strlen(close_tag);
358
+ size_t total_needed = open_tag_len + content_len + close_tag_len;
359
+
360
+ /* Only write if we have enough space for all parts */
361
+ if (remaining >= total_needed) {
362
+ /* Write opening tag */
363
+ memcpy(write, open_tag, open_tag_len);
364
+ write += open_tag_len;
365
+ remaining -= open_tag_len;
366
+
367
+ /* Copy content */
368
+ memcpy(write, content_start, content_len);
369
+ write += content_len;
370
+ remaining -= content_len;
371
+
372
+ /* Write closing tag */
373
+ memcpy(write, close_tag, close_tag_len);
374
+ write += close_tag_len;
375
+ remaining -= close_tag_len;
376
+
377
+ /* Skip past the content and closing marker */
378
+ if (is_underline && closing_tilde) {
379
+ /* For underline, skip past the closing ~ */
380
+ read = closing_tilde + 1;
381
+ } else {
382
+ /* For subscript, skip past the content */
383
+ read = content_end;
384
+ /* If we stopped at ~, skip past it so it's not reprocessed */
385
+ if (*read == '~') {
386
+ read++;
387
+ }
388
+ }
389
+ continue;
390
+ }
391
+ }
392
+ }
393
+
394
+ /* Copy character */
395
+ if (remaining > 0) {
396
+ *write++ = *read++;
397
+ remaining--;
398
+ } else {
399
+ read++;
400
+ }
401
+ }
402
+
403
+ *write = '\0';
404
+ return output;
405
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Superscript and Subscript Extension
3
+ * Handles MultiMarkdown-style ^text^ and ~text~ syntax
4
+ */
5
+
6
+ #ifndef APEX_SUP_SUB_H
7
+ #define APEX_SUP_SUB_H
8
+
9
+ /**
10
+ * Process superscript and subscript syntax in text
11
+ * Converts ^text^ to <sup>text</sup> and ~text~ to <sub>text</sub>
12
+ * Also supports ^(text)^ and ~(text)~ for complex expressions
13
+ */
14
+ char *apex_process_sup_sub(const char *text);
15
+
16
+ #endif