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,710 @@
1
+ /**
2
+ * GitHub Emoji Extension for Apex
3
+ * Complete implementation with 861 emoji mappings
4
+ */
5
+
6
+ #include <string.h>
7
+ #include <stdlib.h>
8
+ #include <stdio.h>
9
+ #include <ctype.h>
10
+ #include <stdint.h>
11
+ #include "emoji_data.h"
12
+
13
+ /* Forward declarations */
14
+ static void normalize_emoji_name(char *name);
15
+ static int is_table_alignment_pattern(const char *start, const char *end);
16
+ static int is_inside_html_attribute(const char *pos, const char *start);
17
+
18
+ /**
19
+ * Find emoji entry by name
20
+ * Returns pointer to emoji_entry or NULL if not found
21
+ */
22
+ static const emoji_entry *find_emoji_entry(const char *name, int len) {
23
+ for (int i = 0; complete_emoji_map[i].name; i++) {
24
+ if (strlen(complete_emoji_map[i].name) == (size_t)len &&
25
+ strncmp(complete_emoji_map[i].name, name, len) == 0) {
26
+ return &complete_emoji_map[i];
27
+ }
28
+ }
29
+ return NULL;
30
+ }
31
+
32
+ /**
33
+ * Check if we're inside a header tag (h1-h6)
34
+ * Simple state machine to track if we're between <h1> and </h1> etc.
35
+ */
36
+ static int is_in_header(const char *pos, const char *start) {
37
+ /* Look backwards for opening header tag */
38
+ const char *p = pos;
39
+ int depth = 0;
40
+
41
+ while (p >= start) {
42
+ if (p[0] == '>' && p > start + 3) {
43
+ /* Check if this is a closing tag */
44
+ if (p[-1] == '/' && p[-2] == '<') {
45
+ /* Check for </h1> through </h6> */
46
+ if (p >= start + 5) {
47
+ if ((p[-3] == 'h' || p[-3] == 'H') &&
48
+ p[-4] >= '1' && p[-4] <= '6') {
49
+ depth--;
50
+ if (depth < 0) return 0; /* Outside header */
51
+ }
52
+ }
53
+ } else if (p > start + 2) {
54
+ /* Check for <h1> through <h6> */
55
+ if (p[-1] == 'h' || p[-1] == 'H') {
56
+ if (p >= start + 3 && p[-2] >= '1' && p[-2] <= '6' && p[-3] == '<') {
57
+ depth++;
58
+ if (depth > 0) return 1; /* Inside header */
59
+ }
60
+ }
61
+ }
62
+ }
63
+ p--;
64
+ }
65
+ return 0;
66
+ }
67
+
68
+ /**
69
+ * Check if we're inside an HTML tag attribute
70
+ * Returns 1 if inside an attribute value, 0 otherwise
71
+ *
72
+ * Handles both raw HTML (<img>) and HTML-encoded tags (&lt;img&gt;)
73
+ */
74
+ static int is_inside_html_attribute(const char *pos, const char *start) {
75
+ if (!pos || !start || pos < start) return 0;
76
+
77
+ /* First, check if we're inside a tag (between < and > or &lt; and &gt;) */
78
+ const char *p = pos - 1;
79
+ const char *tag_start = NULL;
80
+ const char *tag_end = NULL;
81
+
82
+ /* Find nearest < or > before pos, or &lt; or &gt; */
83
+ while (p >= start) {
84
+ if (*p == '>') {
85
+ tag_end = p;
86
+ break;
87
+ } else if (*p == '<') {
88
+ tag_start = p;
89
+ break;
90
+ } else if (p >= start + 3 && p[-2] == '&' && p[-1] == 'l' && *p == 't' && p[1] == ';') {
91
+ /* Found &lt; (encoded <) - tag_start is at the & */
92
+ tag_start = p - 2;
93
+ break;
94
+ } else if (p >= start + 3 && p[-2] == '&' && p[-1] == 'g' && *p == 't' && p[1] == ';') {
95
+ /* Found &gt; (encoded >) - tag_end is at the & */
96
+ tag_end = p - 2;
97
+ break;
98
+ }
99
+ p--;
100
+ }
101
+
102
+ /* If > comes before <, we're outside any tag */
103
+ if (tag_end && (!tag_start || tag_end > tag_start)) {
104
+ return 0;
105
+ }
106
+
107
+ /* If we're not inside a tag, we can't be in an attribute */
108
+ if (!tag_start) {
109
+ return 0;
110
+ }
111
+
112
+ /* Now look backwards from pos to find the nearest = sign within this tag */
113
+ p = pos - 1;
114
+ const char *equals_pos = NULL;
115
+ while (p > tag_start) {
116
+ if (*p == '=') {
117
+ equals_pos = p;
118
+ break;
119
+ } else if (*p == '>') {
120
+ /* Hit tag end, no = found before this */
121
+ return 0;
122
+ } else if (p >= start + 3 && p[-2] == '&' && p[-1] == 'g' && *p == 't' && p[1] == ';') {
123
+ /* Hit &gt; (encoded tag end), no = found before this */
124
+ return 0;
125
+ }
126
+ p--;
127
+ }
128
+
129
+ if (!equals_pos) {
130
+ return 0; /* No = found, not in an attribute */
131
+ }
132
+
133
+ /* Check what comes after the = */
134
+ const char *after_equals = equals_pos + 1;
135
+ /* Skip whitespace */
136
+ while (after_equals < pos && isspace((unsigned char)*after_equals)) {
137
+ after_equals++;
138
+ }
139
+
140
+ if (after_equals >= pos) {
141
+ return 0; /* pos is at or before the value starts */
142
+ }
143
+
144
+ /* Check if it's a quoted attribute */
145
+ if (*after_equals == '"' || *after_equals == '\'') {
146
+ char quote = *after_equals;
147
+ const char *value_start = after_equals + 1; /* After opening quote */
148
+
149
+ /* If pos is after the opening quote, check if we're inside */
150
+ if (pos > value_start) {
151
+ /* Look for the closing quote - scan forward from value_start */
152
+ const char *quote_end = value_start;
153
+ while (quote_end < pos && *quote_end != quote && *quote_end != '\0') {
154
+ quote_end++;
155
+ }
156
+
157
+ /* If we haven't found the closing quote by the time we reach pos, we're inside */
158
+ if (quote_end >= pos || *quote_end != quote) {
159
+ return 1;
160
+ }
161
+ /* If quote_end < pos and *quote_end == quote, we found the closing quote before pos, so we're not inside */
162
+ } else if (pos == value_start) {
163
+ /* pos is exactly at the start of the value (right after opening quote) */
164
+ /* Check if there's a closing quote immediately */
165
+ if (pos[0] == quote) {
166
+ return 0; /* Empty attribute value */
167
+ }
168
+ /* Otherwise we're inside (at the start of the value) */
169
+ return 1;
170
+ }
171
+ } else {
172
+ /* Unquoted attribute - value is between = and next space or > or &gt; */
173
+ const char *value_start = after_equals;
174
+ if (pos > value_start) {
175
+ const char *value_end = value_start;
176
+ while (value_end < pos && !isspace((unsigned char)*value_end) && *value_end != '>') {
177
+ /* Also check for &gt; */
178
+ if (value_end >= start + 3 && value_end[-2] == '&' && value_end[-1] == 'g' && *value_end == 't' && value_end[1] == ';') {
179
+ break;
180
+ }
181
+ value_end++;
182
+ }
183
+ /* If pos is in this unquoted value, return 1 */
184
+ if (pos <= value_end) {
185
+ return 1;
186
+ }
187
+ }
188
+ }
189
+
190
+ return 0;
191
+ }
192
+
193
+ /**
194
+ * Find emoji name from unicode emoji (reverse lookup)
195
+ * Compares the unicode string against the emoji map
196
+ */
197
+ const char *apex_find_emoji_name(const char *unicode, size_t unicode_len) {
198
+ if (!unicode || unicode_len == 0) return NULL;
199
+
200
+ const char *best_match = NULL;
201
+ size_t best_match_len = 0;
202
+
203
+ for (int i = 0; complete_emoji_map[i].name; i++) {
204
+ const char *emoji_unicode = complete_emoji_map[i].unicode;
205
+ if (emoji_unicode) {
206
+ size_t emoji_len = strlen(emoji_unicode);
207
+ /* Check if the unicode matches (exact match) */
208
+ if (emoji_len == unicode_len &&
209
+ strncmp(emoji_unicode, unicode, unicode_len) == 0) {
210
+ size_t name_len = strlen(complete_emoji_map[i].name);
211
+ /* Prefer longer names (more descriptive) over shorter ones (like "+1" vs "thumbsup") */
212
+ if (!best_match || name_len > best_match_len) {
213
+ best_match = complete_emoji_map[i].name;
214
+ best_match_len = name_len;
215
+ }
216
+ }
217
+ }
218
+ }
219
+ return best_match;
220
+ }
221
+
222
+ /**
223
+ * Replace :emoji: patterns in HTML
224
+ * Handles both unicode and image-based emojis
225
+ */
226
+ char *apex_replace_emoji(const char *html) {
227
+ if (!html) return NULL;
228
+
229
+ size_t capacity = strlen(html) * 3; /* Extra space for image tags */
230
+ char *output = malloc(capacity);
231
+ if (!output) return strdup(html);
232
+
233
+ const char *read = html;
234
+ char *write = output;
235
+ size_t remaining = capacity;
236
+
237
+ while (*read) {
238
+ /* Check if we're inside an index placeholder <!--IDX:...--> - if so, skip emoji processing */
239
+ if (read >= html + 7 && strncmp(read - 7, "<!--IDX:", 8) == 0) {
240
+ /* Find the end of the placeholder */
241
+ const char *placeholder_end = strstr(read, "-->");
242
+ if (placeholder_end) {
243
+ /* Copy the entire placeholder as-is */
244
+ size_t placeholder_len = placeholder_end + 3 - read;
245
+ if (placeholder_len <= remaining) {
246
+ memcpy(write, read, placeholder_len);
247
+ write += placeholder_len;
248
+ remaining -= placeholder_len;
249
+ read = placeholder_end + 3;
250
+ continue;
251
+ }
252
+ }
253
+ }
254
+
255
+ if (*read == ':') {
256
+ /* Check if we're inside an HTML tag attribute - if so, skip emoji processing */
257
+ if (is_inside_html_attribute(read, html)) {
258
+ /* Inside HTML attribute, copy as-is */
259
+ if (remaining > 0) {
260
+ *write++ = *read++;
261
+ remaining--;
262
+ } else {
263
+ read++;
264
+ }
265
+ continue;
266
+ }
267
+
268
+ /* Also check if we're inside an <img> tag (even if not in an attribute) */
269
+ /* This prevents processing emoji patterns that are part of img tag content */
270
+ /* Handles both raw HTML (<img>) and HTML-encoded tags (&lt;img&gt;) */
271
+ const char *img_check = read - 1;
272
+ while (img_check >= html && img_check > read - 50) {
273
+ if (*img_check == '>') {
274
+ break; /* Hit tag end, we're outside */
275
+ } else if (*img_check == '<') {
276
+ /* Check if this is an <img> tag */
277
+ if (img_check + 4 < read &&
278
+ (img_check[1] == 'i' || img_check[1] == 'I') &&
279
+ (img_check[2] == 'm' || img_check[2] == 'M') &&
280
+ (img_check[3] == 'g' || img_check[3] == 'G') &&
281
+ (isspace((unsigned char)img_check[4]) || img_check[4] == '>')) {
282
+ /* We're inside an <img> tag - skip emoji processing */
283
+ if (remaining > 0) {
284
+ *write++ = *read++;
285
+ remaining--;
286
+ } else {
287
+ read++;
288
+ }
289
+ continue;
290
+ }
291
+ break;
292
+ } else if (img_check >= html + 3 && img_check[-2] == '&' && img_check[-1] == 'l' && *img_check == 't' && img_check[1] == ';') {
293
+ /* Found &lt; (encoded <) - check if this is an &lt;img&gt; tag */
294
+ const char *tag_start = img_check - 2;
295
+ if (tag_start + 6 < read &&
296
+ (tag_start[3] == 'i' || tag_start[3] == 'I') &&
297
+ (tag_start[4] == 'm' || tag_start[4] == 'M') &&
298
+ (tag_start[5] == 'g' || tag_start[5] == 'G') &&
299
+ (isspace((unsigned char)tag_start[6]) || (tag_start + 6 < read && tag_start[6] == '&'))) {
300
+ /* We're inside an &lt;img&gt; tag - skip emoji processing */
301
+ if (remaining > 0) {
302
+ *write++ = *read++;
303
+ remaining--;
304
+ } else {
305
+ read++;
306
+ }
307
+ continue;
308
+ }
309
+ break;
310
+ }
311
+ img_check--;
312
+ }
313
+
314
+ /* Look for closing : */
315
+ const char *end = strchr(read + 1, ':');
316
+ if (end && (end - read) < 50) { /* Reasonable emoji name length */
317
+ /* Extract emoji name */
318
+ int name_len = end - (read + 1);
319
+ const char *name_start = read + 1;
320
+
321
+ /* Validate: must have at least one character and no spaces */
322
+ if (name_len > 0) {
323
+ /* Check for spaces in the name */
324
+ int has_space = 0;
325
+ for (int i = 0; i < name_len; i++) {
326
+ if (name_start[i] == ' ' || name_start[i] == '\t' || name_start[i] == '\n') {
327
+ has_space = 1;
328
+ break;
329
+ }
330
+ }
331
+
332
+ /* Skip if it contains only table alignment characters (pipes, dashes, colons) */
333
+ if (!has_space && is_table_alignment_pattern(name_start, end)) {
334
+ /* This is a table alignment pattern like :---:, :|:, :|---:, etc. */
335
+ /* Copy the colon pair as-is */
336
+ size_t pattern_len = end - read + 1;
337
+ if (pattern_len < remaining) {
338
+ memcpy(write, read, pattern_len);
339
+ write += pattern_len;
340
+ remaining -= pattern_len;
341
+ }
342
+ read = end + 1;
343
+ continue;
344
+ }
345
+
346
+ if (!has_space) {
347
+ /* Normalize the name for comparison */
348
+ char normalized[64];
349
+ if ((size_t)name_len >= sizeof(normalized)) {
350
+ name_len = sizeof(normalized) - 1;
351
+ }
352
+ memcpy(normalized, name_start, name_len);
353
+ normalized[name_len] = '\0';
354
+ normalize_emoji_name(normalized);
355
+ size_t normalized_len = strlen(normalized);
356
+
357
+ const emoji_entry *entry = find_emoji_entry(normalized, (int)normalized_len);
358
+
359
+ if (entry) {
360
+ int in_header = is_in_header(read, html);
361
+
362
+ if (entry->unicode) {
363
+ /* Unicode emoji */
364
+ size_t emoji_len = strlen(entry->unicode);
365
+ if (emoji_len < remaining) {
366
+ memcpy(write, entry->unicode, emoji_len);
367
+ write += emoji_len;
368
+ remaining -= emoji_len;
369
+ read = end + 1;
370
+ continue;
371
+ } else {
372
+ /* Not enough space, copy original pattern as-is */
373
+ size_t pattern_len = end - read + 1;
374
+ if (pattern_len < remaining) {
375
+ memcpy(write, read, pattern_len);
376
+ write += pattern_len;
377
+ remaining -= pattern_len;
378
+ }
379
+ read = end + 1;
380
+ continue;
381
+ }
382
+ } else if (entry->image_url) {
383
+ /* Image-based emoji */
384
+ const char *img_tag;
385
+ if (in_header) {
386
+ /* In header: use em units for sizing */
387
+ img_tag = "<img class=\"emoji\" src=\"%s\" alt=\":%s:\" style=\"height: 1em; width: auto; vertical-align: middle;\">";
388
+ } else {
389
+ /* Regular text: use fixed size */
390
+ img_tag = "<img class=\"emoji\" src=\"%s\" alt=\":%s:\" height=\"20\" width=\"20\" align=\"absmiddle\">";
391
+ }
392
+
393
+ int needed = snprintf(write, remaining, img_tag, entry->image_url, entry->name);
394
+ if (needed > 0 && (size_t)needed < remaining) {
395
+ write += needed;
396
+ remaining -= needed;
397
+ read = end + 1;
398
+ continue;
399
+ } else {
400
+ /* Not enough space, copy original pattern as-is */
401
+ size_t pattern_len = end - read + 1;
402
+ if (pattern_len < remaining) {
403
+ memcpy(write, read, pattern_len);
404
+ write += pattern_len;
405
+ remaining -= pattern_len;
406
+ }
407
+ read = end + 1;
408
+ continue;
409
+ }
410
+ }
411
+ } else {
412
+ /* No match found, copy the entire pattern as-is */
413
+ size_t pattern_len = end - read + 1;
414
+ if (pattern_len < remaining) {
415
+ memcpy(write, read, pattern_len);
416
+ write += pattern_len;
417
+ remaining -= pattern_len;
418
+ }
419
+ read = end + 1;
420
+ continue;
421
+ }
422
+ }
423
+ }
424
+ }
425
+ }
426
+
427
+ /* Not an emoji pattern, copy character */
428
+ if (remaining > 0) {
429
+ *write++ = *read++;
430
+ remaining--;
431
+ } else {
432
+ read++;
433
+ }
434
+ }
435
+
436
+ *write = '\0';
437
+ return output;
438
+ }
439
+
440
+ /**
441
+ * Normalize emoji name: lowercase, hyphens to underscores, remove colons
442
+ */
443
+ static void normalize_emoji_name(char *name) {
444
+ size_t len = strlen(name);
445
+ size_t write_pos = 0;
446
+
447
+ for (size_t i = 0; i < len; i++) {
448
+ if (name[i] == ':') {
449
+ /* Skip colons */
450
+ continue;
451
+ } else if (name[i] == '-') {
452
+ name[write_pos++] = '_';
453
+ } else {
454
+ name[write_pos++] = (char)tolower((unsigned char)name[i]);
455
+ }
456
+ }
457
+ name[write_pos] = '\0';
458
+ }
459
+
460
+ /**
461
+ * Calculate Levenshtein distance between two strings
462
+ */
463
+ static int levenshtein_distance(const char *s1, size_t len1, const char *s2, size_t len2) {
464
+ if (len1 == 0) return (int)len2;
465
+ if (len2 == 0) return (int)len1;
466
+
467
+ /* Use dynamic programming with minimal memory */
468
+ int *prev_row = malloc((len2 + 1) * sizeof(int));
469
+ int *curr_row = malloc((len2 + 1) * sizeof(int));
470
+ if (!prev_row || !curr_row) {
471
+ free(prev_row);
472
+ free(curr_row);
473
+ return (int)(len1 > len2 ? len1 : len2); /* Fallback: return max length */
474
+ }
475
+
476
+ /* Initialize first row */
477
+ for (size_t i = 0; i <= len2; i++) {
478
+ prev_row[i] = (int)i;
479
+ }
480
+
481
+ /* Fill the matrix */
482
+ for (size_t i = 0; i < len1; i++) {
483
+ curr_row[0] = (int)(i + 1);
484
+ for (size_t j = 0; j < len2; j++) {
485
+ int cost = (s1[i] == s2[j]) ? 0 : 1;
486
+ int deletion = prev_row[j + 1] + 1;
487
+ int insertion = curr_row[j] + 1;
488
+ int substitution = prev_row[j] + cost;
489
+
490
+ curr_row[j + 1] = (deletion < insertion) ?
491
+ (deletion < substitution ? deletion : substitution) :
492
+ (insertion < substitution ? insertion : substitution);
493
+ }
494
+
495
+ /* Swap rows */
496
+ int *temp = prev_row;
497
+ prev_row = curr_row;
498
+ curr_row = temp;
499
+ }
500
+
501
+ int result = prev_row[len2];
502
+ free(prev_row);
503
+ free(curr_row);
504
+ return result;
505
+ }
506
+
507
+ /**
508
+ * Find best emoji match using fuzzy matching
509
+ * Returns the shortest matching emoji name within max_distance, or NULL if no match
510
+ */
511
+ static const char *find_best_emoji_match(const char *name, size_t name_len, int max_distance) {
512
+ char normalized[64];
513
+ if (name_len >= sizeof(normalized)) {
514
+ name_len = sizeof(normalized) - 1;
515
+ }
516
+ memcpy(normalized, name, name_len);
517
+ normalized[name_len] = '\0';
518
+ normalize_emoji_name(normalized);
519
+ size_t normalized_len = strlen(normalized);
520
+
521
+ /* Check exact match first */
522
+ const emoji_entry *exact = find_emoji_entry(normalized, (int)normalized_len);
523
+ if (exact) {
524
+ return exact->name;
525
+ }
526
+
527
+ /* Find fuzzy matches */
528
+ int best_distance = max_distance + 1;
529
+ size_t best_length = SIZE_MAX;
530
+ const char *best_match = NULL;
531
+
532
+ for (int i = 0; complete_emoji_map[i].name; i++) {
533
+ const char *emoji_name = complete_emoji_map[i].name;
534
+ size_t emoji_len = strlen(emoji_name);
535
+
536
+ int distance = levenshtein_distance(normalized, normalized_len, emoji_name, emoji_len);
537
+
538
+ if (distance <= max_distance) {
539
+ if (distance < best_distance ||
540
+ (distance == best_distance && emoji_len < best_length)) {
541
+ best_distance = distance;
542
+ best_length = emoji_len;
543
+ best_match = emoji_name;
544
+ }
545
+ }
546
+ }
547
+
548
+ return best_match;
549
+ }
550
+
551
+ /**
552
+ * Check if a colon pair contains only table-related characters (pipes, dashes, colons)
553
+ * This helps identify table alignment markers like :---:, :|:, :|---:, etc.
554
+ * Note: Patterns with spaces are already filtered out before this check.
555
+ */
556
+ static int is_table_alignment_pattern(const char *start, const char *end) {
557
+ if (!start || !end || start >= end) return 0;
558
+
559
+ /* Check if content between colons contains only pipes, dashes, or colons */
560
+ /* (spaces are already checked separately and rejected) */
561
+ for (const char *p = start; p < end; p++) {
562
+ if (*p != '|' && *p != '-' && *p != ':') {
563
+ /* Found a character that's not part of table alignment syntax */
564
+ return 0;
565
+ }
566
+ }
567
+
568
+ /* If we only have pipes, dashes, or colons, it's a table alignment pattern */
569
+ return 1;
570
+ }
571
+
572
+ /**
573
+ * Autocorrect emoji names in markdown text
574
+ * Processes :emoji_name: patterns and corrects typos using fuzzy matching
575
+ */
576
+ char *apex_autocorrect_emoji_names(const char *text) {
577
+ if (!text) return NULL;
578
+
579
+ size_t capacity = strlen(text) * 2;
580
+ char *output = malloc(capacity);
581
+ if (!output) return strdup(text);
582
+
583
+ const char *read = text;
584
+ char *write = output;
585
+ size_t remaining = capacity;
586
+
587
+ while (*read) {
588
+ if (*read == ':') {
589
+ /* Look for closing : */
590
+ const char *end = strchr(read + 1, ':');
591
+ if (end && (end - read) < 50) { /* Reasonable emoji name length */
592
+ /* Extract emoji name */
593
+ int name_len = end - (read + 1);
594
+ const char *name_start = read + 1;
595
+
596
+ /* Validate: must have at least one character and no spaces */
597
+ if (name_len > 0) {
598
+ /* Check for spaces in the name */
599
+ int has_space = 0;
600
+ for (int i = 0; i < name_len; i++) {
601
+ if (name_start[i] == ' ' || name_start[i] == '\t' || name_start[i] == '\n') {
602
+ has_space = 1;
603
+ break;
604
+ }
605
+ }
606
+
607
+ /* Skip if it contains only table alignment characters (pipes, dashes, colons) */
608
+ if (!has_space && is_table_alignment_pattern(name_start, end)) {
609
+ /* This is a table alignment pattern like :---:, :|:, :|---:, etc. */
610
+ /* Copy the colon pair as-is */
611
+ size_t pattern_len = end - read + 1;
612
+ if (pattern_len < remaining) {
613
+ memcpy(write, read, pattern_len);
614
+ write += pattern_len;
615
+ remaining -= pattern_len;
616
+ }
617
+ read = end + 1;
618
+ continue;
619
+ }
620
+
621
+ if (!has_space) {
622
+ /* Normalize the name for comparison */
623
+ char normalized[64];
624
+ if ((size_t)name_len >= sizeof(normalized)) {
625
+ name_len = sizeof(normalized) - 1;
626
+ }
627
+ memcpy(normalized, name_start, name_len);
628
+ normalized[name_len] = '\0';
629
+ normalize_emoji_name(normalized);
630
+ size_t normalized_len = strlen(normalized);
631
+
632
+ /* Check if it's already correct (using normalized name) */
633
+ const emoji_entry *entry = find_emoji_entry(normalized, (int)normalized_len);
634
+
635
+ if (entry) {
636
+ /* Already correct (after normalization), write normalized version */
637
+ /* Check if we have enough space for :name: */
638
+ if (normalized_len + 2 <= remaining) {
639
+ *write++ = ':';
640
+ remaining--;
641
+ memcpy(write, normalized, normalized_len);
642
+ write += normalized_len;
643
+ remaining -= normalized_len;
644
+ *write++ = ':';
645
+ remaining--;
646
+ } else {
647
+ /* Not enough space, copy original pattern as-is */
648
+ size_t pattern_len = end - read + 1;
649
+ if (pattern_len < remaining) {
650
+ memcpy(write, read, pattern_len);
651
+ write += pattern_len;
652
+ remaining -= pattern_len;
653
+ }
654
+ }
655
+ read = end + 1;
656
+ continue;
657
+ } else {
658
+ /* Try fuzzy matching */
659
+ const char *best_match = find_best_emoji_match(name_start, (size_t)name_len, 4);
660
+ if (best_match) {
661
+ /* Replace with corrected name */
662
+ size_t match_len = strlen(best_match);
663
+ /* Check if we have enough space for :name: */
664
+ if (match_len + 2 <= remaining) {
665
+ *write++ = ':';
666
+ remaining--;
667
+ memcpy(write, best_match, match_len);
668
+ write += match_len;
669
+ remaining -= match_len;
670
+ *write++ = ':';
671
+ remaining--;
672
+ } else {
673
+ /* Not enough space, copy original pattern as-is */
674
+ size_t pattern_len = end - read + 1;
675
+ if (pattern_len < remaining) {
676
+ memcpy(write, read, pattern_len);
677
+ write += pattern_len;
678
+ remaining -= pattern_len;
679
+ }
680
+ }
681
+ read = end + 1;
682
+ continue;
683
+ }
684
+ /* No match found, copy the entire pattern as-is */
685
+ size_t pattern_len = end - read + 1;
686
+ if (pattern_len < remaining) {
687
+ memcpy(write, read, pattern_len);
688
+ write += pattern_len;
689
+ remaining -= pattern_len;
690
+ }
691
+ read = end + 1;
692
+ continue;
693
+ }
694
+ }
695
+ }
696
+ }
697
+ }
698
+
699
+ /* Not an emoji pattern, copy character */
700
+ if (remaining > 0) {
701
+ *write++ = *read++;
702
+ remaining--;
703
+ } else {
704
+ read++;
705
+ }
706
+ }
707
+
708
+ *write = '\0';
709
+ return output;
710
+ }