commonmarker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

Files changed (291) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +119 -0
  5. data/Rakefile +39 -0
  6. data/bin/commonmarker +41 -0
  7. data/commonmarker.gemspec +30 -0
  8. data/ext/commonmarker/cmark/CMakeLists.txt +25 -0
  9. data/ext/commonmarker/cmark/COPYING +192 -0
  10. data/ext/commonmarker/cmark/FindAsan.cmake +74 -0
  11. data/ext/commonmarker/cmark/Makefile +170 -0
  12. data/ext/commonmarker/cmark/Makefile.nmake +36 -0
  13. data/ext/commonmarker/cmark/README.md +169 -0
  14. data/ext/commonmarker/cmark/api_test/CMakeLists.txt +25 -0
  15. data/ext/commonmarker/cmark/api_test/cplusplus.cpp +15 -0
  16. data/ext/commonmarker/cmark/api_test/cplusplus.h +17 -0
  17. data/ext/commonmarker/cmark/api_test/harness.c +102 -0
  18. data/ext/commonmarker/cmark/api_test/harness.h +42 -0
  19. data/ext/commonmarker/cmark/api_test/main.c +700 -0
  20. data/ext/commonmarker/cmark/appveyor.yml +15 -0
  21. data/ext/commonmarker/cmark/bench/statistics.py +595 -0
  22. data/ext/commonmarker/cmark/bench/stats.py +19 -0
  23. data/ext/commonmarker/cmark/benchmarks.md +33 -0
  24. data/ext/commonmarker/cmark/build/CMakeCache.txt +362 -0
  25. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeCCompiler.cmake +63 -0
  26. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeCXXCompiler.cmake +64 -0
  27. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeDetermineCompilerABI_C.bin +0 -0
  28. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
  29. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeSystem.cmake +15 -0
  30. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdC/CMakeCCompilerId.c +499 -0
  31. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdC/a.out +0 -0
  32. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +489 -0
  33. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdCXX/a.out +0 -0
  34. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  35. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +30 -0
  36. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +598 -0
  37. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile.cmake +77 -0
  38. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile2 +268 -0
  39. data/ext/commonmarker/cmark/build/CMakeFiles/TargetDirectories.txt +4 -0
  40. data/ext/commonmarker/cmark/build/CMakeFiles/cmake.check_cache +1 -0
  41. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.bin +0 -0
  42. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.c +34 -0
  43. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.cxx +405 -0
  44. data/ext/commonmarker/cmark/build/CMakeFiles/progress.marks +1 -0
  45. data/ext/commonmarker/cmark/build/CTestTestfile.cmake +10 -0
  46. data/ext/commonmarker/cmark/build/Makefile +237 -0
  47. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  48. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/C.includecache +92 -0
  49. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/CXX.includecache +36 -0
  50. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/DependInfo.cmake +29 -0
  51. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/build.make +155 -0
  52. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cmake_clean.cmake +12 -0
  53. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cplusplus.cpp.o +0 -0
  54. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.internal +25 -0
  55. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.make +25 -0
  56. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/flags.make +13 -0
  57. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/harness.c.o +0 -0
  58. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/link.txt +1 -0
  59. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
  60. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/progress.make +4 -0
  61. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/progress.marks +1 -0
  62. data/ext/commonmarker/cmark/build/api_test/Makefile +277 -0
  63. data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
  64. data/ext/commonmarker/cmark/build/api_test/cmake_install.cmake +29 -0
  65. data/ext/commonmarker/cmark/build/cmake_install.cmake +48 -0
  66. data/ext/commonmarker/cmark/build/man/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  67. data/ext/commonmarker/cmark/build/man/CMakeFiles/progress.marks +1 -0
  68. data/ext/commonmarker/cmark/build/man/Makefile +181 -0
  69. data/ext/commonmarker/cmark/build/man/cmake_install.cmake +37 -0
  70. data/ext/commonmarker/cmark/build/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  71. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/C.includecache +422 -0
  72. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/DependInfo.cmake +39 -0
  73. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/blocks.c.o +0 -0
  74. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/buffer.c.o +0 -0
  75. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/build.make +544 -0
  76. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmake_clean.cmake +27 -0
  77. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmark.c.o +0 -0
  78. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmark_ctype.c.o +0 -0
  79. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/commonmark.c.o +0 -0
  80. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.internal +177 -0
  81. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.make +177 -0
  82. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/flags.make +8 -0
  83. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_href_e.c.o +0 -0
  84. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_e.c.o +0 -0
  85. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
  86. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/html.c.o +0 -0
  87. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/inlines.c.o +0 -0
  88. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
  89. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/link.txt +1 -0
  90. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/main.c.o +0 -0
  91. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/man.c.o +0 -0
  92. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/node.c.o +0 -0
  93. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/progress.make +19 -0
  94. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/references.c.o +0 -0
  95. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/scanners.c.o +0 -0
  96. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/utf8.c.o +0 -0
  97. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/xml.c.o +0 -0
  98. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/C.includecache +394 -0
  99. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/DependInfo.cmake +44 -0
  100. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/blocks.c.o +0 -0
  101. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/buffer.c.o +0 -0
  102. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/build.make +522 -0
  103. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmake_clean.cmake +27 -0
  104. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmark.c.o +0 -0
  105. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmark_ctype.c.o +0 -0
  106. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/commonmark.c.o +0 -0
  107. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.internal +169 -0
  108. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.make +169 -0
  109. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/flags.make +8 -0
  110. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_href_e.c.o +0 -0
  111. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_e.c.o +0 -0
  112. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
  113. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/html.c.o +0 -0
  114. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/inlines.c.o +0 -0
  115. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
  116. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/link.txt +1 -0
  117. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/man.c.o +0 -0
  118. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/node.c.o +0 -0
  119. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/progress.make +18 -0
  120. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/references.c.o +0 -0
  121. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/scanners.c.o +0 -0
  122. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/utf8.c.o +0 -0
  123. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/xml.c.o +0 -0
  124. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/C.includecache +394 -0
  125. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/DependInfo.cmake +38 -0
  126. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/blocks.c.o +0 -0
  127. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/buffer.c.o +0 -0
  128. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/build.make +519 -0
  129. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean.cmake +26 -0
  130. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean_target.cmake +3 -0
  131. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark.c.o +0 -0
  132. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark_ctype.c.o +0 -0
  133. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/commonmark.c.o +0 -0
  134. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.internal +169 -0
  135. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.make +169 -0
  136. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/flags.make +8 -0
  137. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_href_e.c.o +0 -0
  138. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_e.c.o +0 -0
  139. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  140. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/html.c.o +0 -0
  141. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/inlines.c.o +0 -0
  142. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  143. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/link.txt +2 -0
  144. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/man.c.o +0 -0
  145. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/node.c.o +0 -0
  146. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/progress.make +18 -0
  147. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/references.c.o +0 -0
  148. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/scanners.c.o +0 -0
  149. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/utf8.c.o +0 -0
  150. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/xml.c.o +0 -0
  151. data/ext/commonmarker/cmark/build/src/CMakeFiles/progress.marks +1 -0
  152. data/ext/commonmarker/cmark/build/src/Makefile +814 -0
  153. data/ext/commonmarker/cmark/build/src/cmake_install.cmake +69 -0
  154. data/ext/commonmarker/cmark/build/src/cmark +0 -0
  155. data/ext/commonmarker/cmark/build/src/cmark_export.h +41 -0
  156. data/ext/commonmarker/cmark/build/src/cmark_version.h +7 -0
  157. data/ext/commonmarker/cmark/build/src/config.h +23 -0
  158. data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
  159. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  160. data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
  161. data/ext/commonmarker/cmark/build/src/libcmark.pc +10 -0
  162. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  163. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/progress.marks +1 -0
  164. data/ext/commonmarker/cmark/build/testdir/CTestTestfile.cmake +12 -0
  165. data/ext/commonmarker/cmark/build/testdir/Makefile +181 -0
  166. data/ext/commonmarker/cmark/build/testdir/cmake_install.cmake +29 -0
  167. data/ext/commonmarker/cmark/changelog.txt +153 -0
  168. data/ext/commonmarker/cmark/data/CaseFolding-3.2.0.txt +912 -0
  169. data/ext/commonmarker/cmark/man/CMakeLists.txt +8 -0
  170. data/ext/commonmarker/cmark/man/make_man_page.py +131 -0
  171. data/ext/commonmarker/cmark/man/man1/cmark.1 +54 -0
  172. data/ext/commonmarker/cmark/man/man3/cmark.3 +583 -0
  173. data/ext/commonmarker/cmark/nmake.bat +1 -0
  174. data/ext/commonmarker/cmark/src/CMakeLists.txt +166 -0
  175. data/ext/commonmarker/cmark/src/bench.h +27 -0
  176. data/ext/commonmarker/cmark/src/blocks.c +887 -0
  177. data/ext/commonmarker/cmark/src/buffer.c +381 -0
  178. data/ext/commonmarker/cmark/src/buffer.h +113 -0
  179. data/ext/commonmarker/cmark/src/case_fold_switch.inc +2637 -0
  180. data/ext/commonmarker/cmark/src/chunk.h +110 -0
  181. data/ext/commonmarker/cmark/src/cmark.c +24 -0
  182. data/ext/commonmarker/cmark/src/cmark.h +565 -0
  183. data/ext/commonmarker/cmark/src/cmark_ctype.c +53 -0
  184. data/ext/commonmarker/cmark/src/cmark_ctype.h +24 -0
  185. data/ext/commonmarker/cmark/src/cmark_version.h.in +7 -0
  186. data/ext/commonmarker/cmark/src/commonmark.c +607 -0
  187. data/ext/commonmarker/cmark/src/config.h.in +23 -0
  188. data/ext/commonmarker/cmark/src/debug.h +36 -0
  189. data/ext/commonmarker/cmark/src/houdini.h +52 -0
  190. data/ext/commonmarker/cmark/src/houdini_href_e.c +107 -0
  191. data/ext/commonmarker/cmark/src/houdini_html_e.c +81 -0
  192. data/ext/commonmarker/cmark/src/houdini_html_u.c +116 -0
  193. data/ext/commonmarker/cmark/src/html.c +322 -0
  194. data/ext/commonmarker/cmark/src/html_unescape.gperf +2130 -0
  195. data/ext/commonmarker/cmark/src/html_unescape.h +13375 -0
  196. data/ext/commonmarker/cmark/src/inlines.c +1147 -0
  197. data/ext/commonmarker/cmark/src/inlines.h +19 -0
  198. data/ext/commonmarker/cmark/src/iterator.c +148 -0
  199. data/ext/commonmarker/cmark/src/iterator.h +25 -0
  200. data/ext/commonmarker/cmark/src/libcmark.pc.in +10 -0
  201. data/ext/commonmarker/cmark/src/main.c +191 -0
  202. data/ext/commonmarker/cmark/src/man.c +287 -0
  203. data/ext/commonmarker/cmark/src/node.c +873 -0
  204. data/ext/commonmarker/cmark/src/node.h +82 -0
  205. data/ext/commonmarker/cmark/src/parser.h +29 -0
  206. data/ext/commonmarker/cmark/src/references.c +154 -0
  207. data/ext/commonmarker/cmark/src/references.h +37 -0
  208. data/ext/commonmarker/cmark/src/scanners.c +15291 -0
  209. data/ext/commonmarker/cmark/src/scanners.h +41 -0
  210. data/ext/commonmarker/cmark/src/scanners.re +247 -0
  211. data/ext/commonmarker/cmark/src/utf8.c +452 -0
  212. data/ext/commonmarker/cmark/src/utf8.h +22 -0
  213. data/ext/commonmarker/cmark/src/xml.c +170 -0
  214. data/ext/commonmarker/cmark/test/CMakeLists.txt +53 -0
  215. data/ext/commonmarker/cmark/test/afl_dictionary/asterisk +1 -0
  216. data/ext/commonmarker/cmark/test/afl_dictionary/attr_generic +1 -0
  217. data/ext/commonmarker/cmark/test/afl_dictionary/attr_href +1 -0
  218. data/ext/commonmarker/cmark/test/afl_dictionary/attr_xml_lang +1 -0
  219. data/ext/commonmarker/cmark/test/afl_dictionary/attr_xmlns +1 -0
  220. data/ext/commonmarker/cmark/test/afl_dictionary/backslash +1 -0
  221. data/ext/commonmarker/cmark/test/afl_dictionary/backtick +1 -0
  222. data/ext/commonmarker/cmark/test/afl_dictionary/colon +1 -0
  223. data/ext/commonmarker/cmark/test/afl_dictionary/dashes +1 -0
  224. data/ext/commonmarker/cmark/test/afl_dictionary/double_quote +1 -0
  225. data/ext/commonmarker/cmark/test/afl_dictionary/entity_builtin +1 -0
  226. data/ext/commonmarker/cmark/test/afl_dictionary/entity_decimal +1 -0
  227. data/ext/commonmarker/cmark/test/afl_dictionary/entity_external +1 -0
  228. data/ext/commonmarker/cmark/test/afl_dictionary/entity_hex +1 -0
  229. data/ext/commonmarker/cmark/test/afl_dictionary/equals +1 -0
  230. data/ext/commonmarker/cmark/test/afl_dictionary/exclamation +1 -0
  231. data/ext/commonmarker/cmark/test/afl_dictionary/greater_than +1 -0
  232. data/ext/commonmarker/cmark/test/afl_dictionary/hash +1 -0
  233. data/ext/commonmarker/cmark/test/afl_dictionary/hyphen +0 -0
  234. data/ext/commonmarker/cmark/test/afl_dictionary/indent +1 -0
  235. data/ext/commonmarker/cmark/test/afl_dictionary/left_bracket +1 -0
  236. data/ext/commonmarker/cmark/test/afl_dictionary/left_paren +1 -0
  237. data/ext/commonmarker/cmark/test/afl_dictionary/less_than +1 -0
  238. data/ext/commonmarker/cmark/test/afl_dictionary/plus +1 -0
  239. data/ext/commonmarker/cmark/test/afl_dictionary/right_bracket +1 -0
  240. data/ext/commonmarker/cmark/test/afl_dictionary/right_paren +1 -0
  241. data/ext/commonmarker/cmark/test/afl_dictionary/single_quote +1 -0
  242. data/ext/commonmarker/cmark/test/afl_dictionary/string_any +1 -0
  243. data/ext/commonmarker/cmark/test/afl_dictionary/string_brackets +1 -0
  244. data/ext/commonmarker/cmark/test/afl_dictionary/string_cdata +1 -0
  245. data/ext/commonmarker/cmark/test/afl_dictionary/string_dashes +1 -0
  246. data/ext/commonmarker/cmark/test/afl_dictionary/string_empty_dblquotes +1 -0
  247. data/ext/commonmarker/cmark/test/afl_dictionary/string_empty_quotes +1 -0
  248. data/ext/commonmarker/cmark/test/afl_dictionary/string_idrefs +1 -0
  249. data/ext/commonmarker/cmark/test/afl_dictionary/string_parentheses +1 -0
  250. data/ext/commonmarker/cmark/test/afl_dictionary/string_pcdata +1 -0
  251. data/ext/commonmarker/cmark/test/afl_dictionary/tag_cdata +1 -0
  252. data/ext/commonmarker/cmark/test/afl_dictionary/tag_close +1 -0
  253. data/ext/commonmarker/cmark/test/afl_dictionary/tag_doctype +1 -0
  254. data/ext/commonmarker/cmark/test/afl_dictionary/tag_element +1 -0
  255. data/ext/commonmarker/cmark/test/afl_dictionary/tag_entity +1 -0
  256. data/ext/commonmarker/cmark/test/afl_dictionary/tag_notation +1 -0
  257. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open +1 -0
  258. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_close +1 -0
  259. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_exclamation +1 -0
  260. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_q +1 -0
  261. data/ext/commonmarker/cmark/test/afl_dictionary/tag_sq2_close +1 -0
  262. data/ext/commonmarker/cmark/test/afl_dictionary/tag_xml_q +1 -0
  263. data/ext/commonmarker/cmark/test/afl_dictionary/underscore +1 -0
  264. data/ext/commonmarker/cmark/test/afl_test_cases/test.md +36 -0
  265. data/ext/commonmarker/cmark/test/cmark.py +40 -0
  266. data/ext/commonmarker/cmark/test/normalize.py +179 -0
  267. data/ext/commonmarker/cmark/test/pathological_tests.py +63 -0
  268. data/ext/commonmarker/cmark/test/roundtrip.sh +2 -0
  269. data/ext/commonmarker/cmark/test/smart_punct.txt +96 -0
  270. data/ext/commonmarker/cmark/test/spec.txt +7505 -0
  271. data/ext/commonmarker/cmark/test/spec_tests.py +139 -0
  272. data/ext/commonmarker/cmark/toolchain-mingw32.cmake +17 -0
  273. data/ext/commonmarker/cmark/tools/mkcasefold.pl +22 -0
  274. data/ext/commonmarker/cmark/wrappers/wrapper.lua +239 -0
  275. data/ext/commonmarker/cmark/wrappers/wrapper.py +37 -0
  276. data/ext/commonmarker/cmark/wrappers/wrapper.rb +15 -0
  277. data/ext/commonmarker/cmark/wrappers/wrapper.rkt +190 -0
  278. data/ext/commonmarker/commonmarker.c +165 -0
  279. data/ext/commonmarker/commonmarker.h +11 -0
  280. data/ext/commonmarker/extconf.rb +18 -0
  281. data/lib/commonmarker/config.rb +20 -0
  282. data/lib/commonmarker/version.rb +3 -0
  283. data/lib/commonmarker.rb +588 -0
  284. data/test/benchmark.rb +30 -0
  285. data/test/spec_tests.json +4074 -0
  286. data/test/test_basics.rb +44 -0
  287. data/test/test_helper.rb +5 -0
  288. data/test/test_maliciousness.rb +9 -0
  289. data/test/test_pathological_inputs.rb +52 -0
  290. data/test/test_spec.rb +20 -0
  291. metadata +399 -0
@@ -0,0 +1,700 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+
5
+ #define CMARK_NO_SHORT_NAMES
6
+ #include "cmark.h"
7
+ #include "node.h"
8
+
9
+ #include "harness.h"
10
+ #include "cplusplus.h"
11
+
12
+ #define UTF8_REPL "\xEF\xBF\xBD"
13
+
14
+ static const cmark_node_type node_types[] = {
15
+ CMARK_NODE_DOCUMENT,
16
+ CMARK_NODE_BLOCK_QUOTE,
17
+ CMARK_NODE_LIST,
18
+ CMARK_NODE_ITEM,
19
+ CMARK_NODE_CODE_BLOCK,
20
+ CMARK_NODE_HTML,
21
+ CMARK_NODE_PARAGRAPH,
22
+ CMARK_NODE_HEADER,
23
+ CMARK_NODE_HRULE,
24
+ CMARK_NODE_TEXT,
25
+ CMARK_NODE_SOFTBREAK,
26
+ CMARK_NODE_LINEBREAK,
27
+ CMARK_NODE_CODE,
28
+ CMARK_NODE_INLINE_HTML,
29
+ CMARK_NODE_EMPH,
30
+ CMARK_NODE_STRONG,
31
+ CMARK_NODE_LINK,
32
+ CMARK_NODE_IMAGE
33
+ };
34
+ static const int num_node_types = sizeof(node_types) / sizeof(*node_types);
35
+
36
+ static void
37
+ test_md_to_html(test_batch_runner *runner, const char *markdown,
38
+ const char *expected_html, const char *msg);
39
+
40
+ static void
41
+ test_content(test_batch_runner *runner, cmark_node_type type,
42
+ int allowed_content);
43
+
44
+ static void
45
+ test_char(test_batch_runner *runner, int valid, const char *utf8,
46
+ const char *msg);
47
+
48
+ static void
49
+ test_incomplete_char(test_batch_runner *runner, const char *utf8,
50
+ const char *msg);
51
+
52
+ static void
53
+ test_continuation_byte(test_batch_runner *runner, const char *utf8);
54
+
55
+ static void
56
+ version(test_batch_runner *runner)
57
+ {
58
+ INT_EQ(runner, cmark_version, CMARK_VERSION, "cmark_version");
59
+ STR_EQ(runner, cmark_version_string, CMARK_VERSION_STRING,
60
+ "cmark_version_string");
61
+ }
62
+
63
+ static void
64
+ constructor(test_batch_runner *runner)
65
+ {
66
+ for (int i = 0; i < num_node_types; ++i) {
67
+ cmark_node_type type = node_types[i];
68
+ cmark_node *node = cmark_node_new(type);
69
+ OK(runner, node != NULL, "new type %d", type);
70
+ INT_EQ(runner, cmark_node_get_type(node), type,
71
+ "get_type %d", type);
72
+
73
+ switch (node->type) {
74
+ case CMARK_NODE_HEADER:
75
+ INT_EQ(runner, cmark_node_get_header_level(node), 1,
76
+ "default header level is 1");
77
+ node->as.header.level = 1;
78
+ break;
79
+
80
+ case CMARK_NODE_LIST:
81
+ INT_EQ(runner, cmark_node_get_list_type(node),
82
+ CMARK_BULLET_LIST,
83
+ "default is list type is bullet");
84
+ INT_EQ(runner, cmark_node_get_list_delim(node),
85
+ CMARK_NO_DELIM,
86
+ "default is list delim is NO_DELIM");
87
+ INT_EQ(runner, cmark_node_get_list_start(node), 1,
88
+ "default is list start is 1");
89
+ INT_EQ(runner, cmark_node_get_list_tight(node), 0,
90
+ "default is list is loose");
91
+ break;
92
+
93
+ default:
94
+ break;
95
+ }
96
+
97
+ cmark_node_free(node);
98
+ }
99
+ }
100
+
101
+ static void
102
+ accessors(test_batch_runner *runner)
103
+ {
104
+ static const char markdown[] =
105
+ "## Header\n"
106
+ "\n"
107
+ "* Item 1\n"
108
+ "* Item 2\n"
109
+ "\n"
110
+ "2. Item 1\n"
111
+ "\n"
112
+ "3. Item 2\n"
113
+ "\n"
114
+ "\n"
115
+ " code\n"
116
+ "\n"
117
+ "``` lang\n"
118
+ "fenced\n"
119
+ "```\n"
120
+ "\n"
121
+ "<div>html</div>\n"
122
+ "\n"
123
+ "[link](url 'title')\n";
124
+
125
+ cmark_node *doc = cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT);
126
+
127
+ // Getters
128
+
129
+ cmark_node *header = cmark_node_first_child(doc);
130
+ INT_EQ(runner, cmark_node_get_header_level(header), 2,
131
+ "get_header_level");
132
+
133
+ cmark_node *bullet_list = cmark_node_next(header);
134
+ INT_EQ(runner, cmark_node_get_list_type(bullet_list),
135
+ CMARK_BULLET_LIST, "get_list_type bullet");
136
+ INT_EQ(runner, cmark_node_get_list_tight(bullet_list), 1,
137
+ "get_list_tight tight");
138
+
139
+ cmark_node *ordered_list = cmark_node_next(bullet_list);
140
+ INT_EQ(runner, cmark_node_get_list_type(ordered_list),
141
+ CMARK_ORDERED_LIST, "get_list_type ordered");
142
+ INT_EQ(runner, cmark_node_get_list_delim(ordered_list),
143
+ CMARK_PERIOD_DELIM, "get_list_delim ordered");
144
+ INT_EQ(runner, cmark_node_get_list_start(ordered_list), 2,
145
+ "get_list_start");
146
+ INT_EQ(runner, cmark_node_get_list_tight(ordered_list), 0,
147
+ "get_list_tight loose");
148
+
149
+ cmark_node *code = cmark_node_next(ordered_list);
150
+ STR_EQ(runner, cmark_node_get_literal(code), "code\n",
151
+ "get_literal indented code");
152
+
153
+ cmark_node *fenced = cmark_node_next(code);
154
+ STR_EQ(runner, cmark_node_get_literal(fenced), "fenced\n",
155
+ "get_literal fenced code");
156
+ STR_EQ(runner, cmark_node_get_fence_info(fenced), "lang",
157
+ "get_fence_info");
158
+
159
+ cmark_node *html = cmark_node_next(fenced);
160
+ STR_EQ(runner, cmark_node_get_literal(html),
161
+ "<div>html</div>\n", "get_literal html");
162
+
163
+ cmark_node *paragraph = cmark_node_next(html);
164
+ INT_EQ(runner, cmark_node_get_start_line(paragraph), 19,
165
+ "get_start_line");
166
+ INT_EQ(runner, cmark_node_get_start_column(paragraph), 1,
167
+ "get_start_column");
168
+ INT_EQ(runner, cmark_node_get_end_line(paragraph), 19,
169
+ "get_end_line");
170
+
171
+ cmark_node *link = cmark_node_first_child(paragraph);
172
+ STR_EQ(runner, cmark_node_get_url(link), "url",
173
+ "get_url");
174
+ STR_EQ(runner, cmark_node_get_title(link), "title",
175
+ "get_title");
176
+
177
+ cmark_node *string = cmark_node_first_child(link);
178
+ STR_EQ(runner, cmark_node_get_literal(string), "link",
179
+ "get_literal string");
180
+
181
+ // Setters
182
+
183
+ OK(runner, cmark_node_set_header_level(header, 3),
184
+ "set_header_level");
185
+
186
+ OK(runner, cmark_node_set_list_type(bullet_list, CMARK_ORDERED_LIST),
187
+ "set_list_type ordered");
188
+ OK(runner, cmark_node_set_list_delim(bullet_list, CMARK_PAREN_DELIM),
189
+ "set_list_delim paren");
190
+ OK(runner, cmark_node_set_list_start(bullet_list, 3),
191
+ "set_list_start");
192
+ OK(runner, cmark_node_set_list_tight(bullet_list, 0),
193
+ "set_list_tight loose");
194
+
195
+ OK(runner, cmark_node_set_list_type(ordered_list, CMARK_BULLET_LIST),
196
+ "set_list_type bullet");
197
+ OK(runner, cmark_node_set_list_tight(ordered_list, 1),
198
+ "set_list_tight tight");
199
+
200
+ OK(runner, cmark_node_set_literal(code, "CODE\n"),
201
+ "set_literal indented code");
202
+
203
+ OK(runner, cmark_node_set_literal(fenced, "FENCED\n"),
204
+ "set_literal fenced code");
205
+ OK(runner, cmark_node_set_fence_info(fenced, "LANG"),
206
+ "set_fence_info");
207
+
208
+ OK(runner, cmark_node_set_literal(html, "<div>HTML</div>\n"),
209
+ "set_literal html");
210
+
211
+ OK(runner, cmark_node_set_url(link, "URL"),
212
+ "set_url");
213
+ OK(runner, cmark_node_set_title(link, "TITLE"),
214
+ "set_title");
215
+
216
+ OK(runner, cmark_node_set_literal(string, "LINK"),
217
+ "set_literal string");
218
+
219
+ char *rendered_html = cmark_render_html(doc, CMARK_OPT_DEFAULT);
220
+ static const char expected_html[] =
221
+ "<h3>Header</h3>\n"
222
+ "<ol start=\"3\">\n"
223
+ "<li>\n"
224
+ "<p>Item 1</p>\n"
225
+ "</li>\n"
226
+ "<li>\n"
227
+ "<p>Item 2</p>\n"
228
+ "</li>\n"
229
+ "</ol>\n"
230
+ "<ul>\n"
231
+ "<li>Item 1</li>\n"
232
+ "<li>Item 2</li>\n"
233
+ "</ul>\n"
234
+ "<pre><code>CODE\n"
235
+ "</code></pre>\n"
236
+ "<pre><code class=\"language-LANG\">FENCED\n"
237
+ "</code></pre>\n"
238
+ "<div>HTML</div>\n"
239
+ "<p><a href=\"URL\" title=\"TITLE\">LINK</a></p>\n";
240
+ STR_EQ(runner, rendered_html, expected_html, "setters work");
241
+ free(rendered_html);
242
+
243
+ // Getter errors
244
+
245
+ INT_EQ(runner, cmark_node_get_header_level(bullet_list), 0,
246
+ "get_header_level error");
247
+ INT_EQ(runner, cmark_node_get_list_type(header), CMARK_NO_LIST,
248
+ "get_list_type error");
249
+ INT_EQ(runner, cmark_node_get_list_start(code), 0,
250
+ "get_list_start error");
251
+ INT_EQ(runner, cmark_node_get_list_tight(fenced), 0,
252
+ "get_list_tight error");
253
+ OK(runner, cmark_node_get_literal(ordered_list) == NULL,
254
+ "get_literal error");
255
+ OK(runner, cmark_node_get_fence_info(paragraph) == NULL,
256
+ "get_fence_info error");
257
+ OK(runner, cmark_node_get_url(html) == NULL,
258
+ "get_url error");
259
+ OK(runner, cmark_node_get_title(header) == NULL,
260
+ "get_title error");
261
+
262
+ // Setter errors
263
+
264
+ OK(runner, !cmark_node_set_header_level(bullet_list, 3),
265
+ "set_header_level error");
266
+ OK(runner, !cmark_node_set_list_type(header, CMARK_ORDERED_LIST),
267
+ "set_list_type error");
268
+ OK(runner, !cmark_node_set_list_start(code, 3),
269
+ "set_list_start error");
270
+ OK(runner, !cmark_node_set_list_tight(fenced, 0),
271
+ "set_list_tight error");
272
+ OK(runner, !cmark_node_set_literal(ordered_list, "content\n"),
273
+ "set_literal error");
274
+ OK(runner, !cmark_node_set_fence_info(paragraph, "lang"),
275
+ "set_fence_info error");
276
+ OK(runner, !cmark_node_set_url(html, "url"),
277
+ "set_url error");
278
+ OK(runner, !cmark_node_set_title(header, "title"),
279
+ "set_title error");
280
+
281
+ OK(runner, !cmark_node_set_header_level(header, 0),
282
+ "set_header_level too small");
283
+ OK(runner, !cmark_node_set_header_level(header, 7),
284
+ "set_header_level too large");
285
+ OK(runner, !cmark_node_set_list_type(bullet_list, CMARK_NO_LIST),
286
+ "set_list_type invalid");
287
+ OK(runner, !cmark_node_set_list_start(bullet_list, -1),
288
+ "set_list_start negative");
289
+
290
+ cmark_node_free(doc);
291
+ }
292
+
293
+ static void
294
+ node_check(test_batch_runner *runner) {
295
+ // Construct an incomplete tree.
296
+ cmark_node *doc = cmark_node_new(CMARK_NODE_DOCUMENT);
297
+ cmark_node *p1 = cmark_node_new(CMARK_NODE_PARAGRAPH);
298
+ cmark_node *p2 = cmark_node_new(CMARK_NODE_PARAGRAPH);
299
+ doc->first_child = p1;
300
+ p1->next = p2;
301
+
302
+ INT_EQ(runner, cmark_node_check(doc, NULL), 4, "node_check works");
303
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0,
304
+ "node_check fixes tree");
305
+
306
+ cmark_node_free(doc);
307
+ }
308
+
309
+ static void
310
+ iterator(test_batch_runner *runner) {
311
+ cmark_node *doc = cmark_parse_document("> a *b*\n\nc", 10, CMARK_OPT_DEFAULT);
312
+ int parnodes = 0;
313
+ cmark_event_type ev_type;
314
+ cmark_iter *iter = cmark_iter_new(doc);
315
+ cmark_node *cur;
316
+
317
+ while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
318
+ cur = cmark_iter_get_node(iter);
319
+ if (cur->type == CMARK_NODE_PARAGRAPH &&
320
+ ev_type == CMARK_EVENT_ENTER) {
321
+ parnodes += 1;
322
+ }
323
+ }
324
+ INT_EQ(runner, parnodes, 2, "iterate correctly counts paragraphs");
325
+
326
+ cmark_iter_free(iter);
327
+ cmark_node_free(doc);
328
+ }
329
+
330
+ static void
331
+ iterator_delete(test_batch_runner *runner) {
332
+ static const char md[] =
333
+ "a *b* c\n"
334
+ "\n"
335
+ "* item1\n"
336
+ "* item2\n"
337
+ "\n"
338
+ "a `b` c\n"
339
+ "\n"
340
+ "* item1\n"
341
+ "* item2\n";
342
+ cmark_node *doc = cmark_parse_document(md, sizeof(md) - 1,
343
+ CMARK_OPT_DEFAULT);
344
+ cmark_iter *iter = cmark_iter_new(doc);
345
+ cmark_event_type ev_type;
346
+
347
+ while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
348
+ cmark_node *node = cmark_iter_get_node(iter);
349
+ // Delete list, emph, and code nodes.
350
+ if ((ev_type == CMARK_EVENT_EXIT &&
351
+ node->type == CMARK_NODE_LIST) ||
352
+ (ev_type == CMARK_EVENT_EXIT &&
353
+ node->type == CMARK_NODE_EMPH) ||
354
+ (ev_type == CMARK_EVENT_ENTER &&
355
+ node->type == CMARK_NODE_CODE)) {
356
+ cmark_node_free(node);
357
+ }
358
+ }
359
+
360
+ char *html = cmark_render_html(doc, CMARK_OPT_DEFAULT);
361
+ static const char expected[] =
362
+ "<p>a c</p>\n"
363
+ "<p>a c</p>\n";
364
+ STR_EQ(runner, html, expected, "iterate and delete nodes");
365
+
366
+ free(html);
367
+ cmark_iter_free(iter);
368
+ cmark_node_free(doc);
369
+ }
370
+
371
+ static void
372
+ create_tree(test_batch_runner *runner)
373
+ {
374
+ char *html;
375
+ cmark_node *doc = cmark_node_new(CMARK_NODE_DOCUMENT);
376
+
377
+ cmark_node *p = cmark_node_new(CMARK_NODE_PARAGRAPH);
378
+ OK(runner, !cmark_node_insert_before(doc, p),
379
+ "insert before root fails");
380
+ OK(runner, !cmark_node_insert_after(doc, p),
381
+ "insert after root fails");
382
+ OK(runner, cmark_node_append_child(doc, p), "append1");
383
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0, "append1 consistent");
384
+ OK(runner, cmark_node_parent(p) == doc, "node_parent");
385
+
386
+ cmark_node *emph = cmark_node_new(CMARK_NODE_EMPH);
387
+ OK(runner, cmark_node_prepend_child(p, emph), "prepend1");
388
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0, "prepend1 consistent");
389
+
390
+ cmark_node *str1 = cmark_node_new(CMARK_NODE_TEXT);
391
+ cmark_node_set_literal(str1, "Hello, ");
392
+ OK(runner, cmark_node_prepend_child(p, str1), "prepend2");
393
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0, "prepend2 consistent");
394
+
395
+ cmark_node *str3 = cmark_node_new(CMARK_NODE_TEXT);
396
+ cmark_node_set_literal(str3, "!");
397
+ OK(runner, cmark_node_append_child(p, str3), "append2");
398
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0, "append2 consistent");
399
+
400
+ cmark_node *str2 = cmark_node_new(CMARK_NODE_TEXT);
401
+ cmark_node_set_literal(str2, "world");
402
+ OK(runner, cmark_node_append_child(emph, str2), "append3");
403
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0, "append3 consistent");
404
+
405
+ html = cmark_render_html(doc, CMARK_OPT_DEFAULT);
406
+ STR_EQ(runner, html, "<p>Hello, <em>world</em>!</p>\n",
407
+ "render_html");
408
+ free(html);
409
+
410
+ OK(runner, cmark_node_insert_before(str1, str3), "ins before1");
411
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0,
412
+ "ins before1 consistent");
413
+ // 31e
414
+ OK(runner, cmark_node_first_child(p) == str3, "ins before1 works");
415
+
416
+ OK(runner, cmark_node_insert_before(str1, emph), "ins before2");
417
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0,
418
+ "ins before2 consistent");
419
+ // 3e1
420
+ OK(runner, cmark_node_last_child(p) == str1, "ins before2 works");
421
+
422
+ OK(runner, cmark_node_insert_after(str1, str3), "ins after1");
423
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0,
424
+ "ins after1 consistent");
425
+ // e13
426
+ OK(runner, cmark_node_next(str1) == str3, "ins after1 works");
427
+
428
+ OK(runner, cmark_node_insert_after(str1, emph), "ins after2");
429
+ INT_EQ(runner, cmark_node_check(doc, NULL), 0,
430
+ "ins after2 consistent");
431
+ // 1e3
432
+ OK(runner, cmark_node_previous(emph) == str1, "ins after2 works");
433
+
434
+ cmark_node_unlink(emph);
435
+
436
+ html = cmark_render_html(doc, CMARK_OPT_DEFAULT);
437
+ STR_EQ(runner, html, "<p>Hello, !</p>\n",
438
+ "render_html after shuffling");
439
+ free(html);
440
+
441
+ cmark_node_free(doc);
442
+
443
+ // TODO: Test that the contents of an unlinked inline are valid
444
+ // after the parent block was destroyed. This doesn't work so far.
445
+ cmark_node_free(emph);
446
+ }
447
+
448
+ void
449
+ hierarchy(test_batch_runner *runner)
450
+ {
451
+ cmark_node *bquote1 = cmark_node_new(CMARK_NODE_BLOCK_QUOTE);
452
+ cmark_node *bquote2 = cmark_node_new(CMARK_NODE_BLOCK_QUOTE);
453
+ cmark_node *bquote3 = cmark_node_new(CMARK_NODE_BLOCK_QUOTE);
454
+
455
+ OK(runner, cmark_node_append_child(bquote1, bquote2),
456
+ "append bquote2");
457
+ OK(runner, cmark_node_append_child(bquote2, bquote3),
458
+ "append bquote3");
459
+ OK(runner, !cmark_node_append_child(bquote3, bquote3),
460
+ "adding a node as child of itself fails");
461
+ OK(runner, !cmark_node_append_child(bquote3, bquote1),
462
+ "adding a parent as child fails");
463
+
464
+ cmark_node_free(bquote1);
465
+
466
+ int max_node_type = CMARK_NODE_LAST_BLOCK > CMARK_NODE_LAST_INLINE
467
+ ? CMARK_NODE_LAST_BLOCK : CMARK_NODE_LAST_INLINE;
468
+ OK(runner, max_node_type < 32, "all node types < 32");
469
+
470
+ int list_item_flag = 1 << CMARK_NODE_ITEM;
471
+ int top_level_blocks =
472
+ (1 << CMARK_NODE_BLOCK_QUOTE) |
473
+ (1 << CMARK_NODE_LIST) |
474
+ (1 << CMARK_NODE_CODE_BLOCK) |
475
+ (1 << CMARK_NODE_HTML) |
476
+ (1 << CMARK_NODE_PARAGRAPH) |
477
+ (1 << CMARK_NODE_HEADER) |
478
+ (1 << CMARK_NODE_HRULE);
479
+ int all_inlines =
480
+ (1 << CMARK_NODE_TEXT) |
481
+ (1 << CMARK_NODE_SOFTBREAK) |
482
+ (1 << CMARK_NODE_LINEBREAK) |
483
+ (1 << CMARK_NODE_CODE) |
484
+ (1 << CMARK_NODE_INLINE_HTML) |
485
+ (1 << CMARK_NODE_EMPH) |
486
+ (1 << CMARK_NODE_STRONG) |
487
+ (1 << CMARK_NODE_LINK) |
488
+ (1 << CMARK_NODE_IMAGE);
489
+
490
+ test_content(runner, CMARK_NODE_DOCUMENT, top_level_blocks);
491
+ test_content(runner, CMARK_NODE_BLOCK_QUOTE, top_level_blocks);
492
+ test_content(runner, CMARK_NODE_LIST, list_item_flag);
493
+ test_content(runner, CMARK_NODE_ITEM, top_level_blocks);
494
+ test_content(runner, CMARK_NODE_CODE_BLOCK , 0);
495
+ test_content(runner, CMARK_NODE_HTML, 0);
496
+ test_content(runner, CMARK_NODE_PARAGRAPH, all_inlines);
497
+ test_content(runner, CMARK_NODE_HEADER, all_inlines);
498
+ test_content(runner, CMARK_NODE_HRULE, 0);
499
+ test_content(runner, CMARK_NODE_TEXT, 0);
500
+ test_content(runner, CMARK_NODE_SOFTBREAK, 0);
501
+ test_content(runner, CMARK_NODE_LINEBREAK, 0);
502
+ test_content(runner, CMARK_NODE_CODE, 0);
503
+ test_content(runner, CMARK_NODE_INLINE_HTML, 0);
504
+ test_content(runner, CMARK_NODE_EMPH, all_inlines);
505
+ test_content(runner, CMARK_NODE_STRONG, all_inlines);
506
+ test_content(runner, CMARK_NODE_LINK, all_inlines);
507
+ test_content(runner, CMARK_NODE_IMAGE, all_inlines);
508
+ }
509
+
510
+ static void
511
+ test_content(test_batch_runner *runner, cmark_node_type type,
512
+ int allowed_content)
513
+ {
514
+ cmark_node *node = cmark_node_new(type);
515
+
516
+ for (int i = 0; i < num_node_types; ++i) {
517
+ cmark_node_type child_type = node_types[i];
518
+ cmark_node *child = cmark_node_new(child_type);
519
+
520
+ int got = cmark_node_append_child(node, child);
521
+ int expected = (allowed_content >> child_type) & 1;
522
+
523
+ INT_EQ(runner, got, expected,
524
+ "add %d as child of %d", child_type, type);
525
+
526
+ cmark_node_free(child);
527
+ }
528
+
529
+ cmark_node_free(node);
530
+ }
531
+
532
+ static void
533
+ parser(test_batch_runner *runner)
534
+ {
535
+ test_md_to_html(runner, "No newline", "<p>No newline</p>\n",
536
+ "document without trailing newline");
537
+ }
538
+
539
+ static void
540
+ render_html(test_batch_runner *runner)
541
+ {
542
+ char *html;
543
+
544
+ static const char markdown[] =
545
+ "foo *bar*\n"
546
+ "\n"
547
+ "paragraph 2\n";
548
+ cmark_node *doc = cmark_parse_document(markdown, sizeof(markdown) - 1,
549
+ CMARK_OPT_DEFAULT);
550
+
551
+ cmark_node *paragraph = cmark_node_first_child(doc);
552
+ html = cmark_render_html(paragraph, CMARK_OPT_DEFAULT);
553
+ STR_EQ(runner, html, "<p>foo <em>bar</em></p>\n",
554
+ "render single paragraph");
555
+ free(html);
556
+
557
+ cmark_node *string = cmark_node_first_child(paragraph);
558
+ html = cmark_render_html(string, CMARK_OPT_DEFAULT);
559
+ STR_EQ(runner, html, "foo ", "render single inline");
560
+ free(html);
561
+
562
+ cmark_node *emph = cmark_node_next(string);
563
+ html = cmark_render_html(emph, CMARK_OPT_DEFAULT);
564
+ STR_EQ(runner, html, "<em>bar</em>", "render inline with children");
565
+ free(html);
566
+
567
+ cmark_node_free(doc);
568
+ }
569
+
570
+ static void
571
+ utf8(test_batch_runner *runner)
572
+ {
573
+ // Ranges
574
+ test_char(runner, 1, "\x01", "valid utf8 01");
575
+ test_char(runner, 1, "\x7F", "valid utf8 7F");
576
+ test_char(runner, 0, "\x80", "invalid utf8 80");
577
+ test_char(runner, 0, "\xBF", "invalid utf8 BF");
578
+ test_char(runner, 0, "\xC0\x80", "invalid utf8 C080");
579
+ test_char(runner, 0, "\xC1\xBF", "invalid utf8 C1BF");
580
+ test_char(runner, 1, "\xC2\x80", "valid utf8 C280");
581
+ test_char(runner, 1, "\xDF\xBF", "valid utf8 DFBF");
582
+ test_char(runner, 0, "\xE0\x80\x80", "invalid utf8 E08080");
583
+ test_char(runner, 0, "\xE0\x9F\xBF", "invalid utf8 E09FBF");
584
+ test_char(runner, 1, "\xE0\xA0\x80", "valid utf8 E0A080");
585
+ test_char(runner, 1, "\xED\x9F\xBF", "valid utf8 ED9FBF");
586
+ test_char(runner, 0, "\xED\xA0\x80", "invalid utf8 EDA080");
587
+ test_char(runner, 0, "\xED\xBF\xBF", "invalid utf8 EDBFBF");
588
+ test_char(runner, 0, "\xF0\x80\x80\x80", "invalid utf8 F0808080");
589
+ test_char(runner, 0, "\xF0\x8F\xBF\xBF", "invalid utf8 F08FBFBF");
590
+ test_char(runner, 1, "\xF0\x90\x80\x80", "valid utf8 F0908080");
591
+ test_char(runner, 1, "\xF4\x8F\xBF\xBF", "valid utf8 F48FBFBF");
592
+ test_char(runner, 0, "\xF4\x90\x80\x80", "invalid utf8 F4908080");
593
+ test_char(runner, 0, "\xF7\xBF\xBF\xBF", "invalid utf8 F7BFBFBF");
594
+ test_char(runner, 0, "\xF8", "invalid utf8 F8");
595
+ test_char(runner, 0, "\xFF", "invalid utf8 FF");
596
+
597
+ // Incomplete byte sequences at end of input
598
+ test_incomplete_char(runner, "\xE0\xA0", "invalid utf8 E0A0");
599
+ test_incomplete_char(runner, "\xF0\x90\x80", "invalid utf8 F09080");
600
+
601
+ // Invalid continuation bytes
602
+ test_continuation_byte(runner, "\xC2\x80");
603
+ test_continuation_byte(runner, "\xE0\xA0\x80");
604
+ test_continuation_byte(runner, "\xF0\x90\x80\x80");
605
+
606
+ // Test string containing null character
607
+ static const char string_with_null[] = "((((\0))))";
608
+ char *html = cmark_markdown_to_html(string_with_null,
609
+ sizeof(string_with_null) - 1,
610
+ CMARK_OPT_DEFAULT);
611
+ STR_EQ(runner, html, "<p>((((" UTF8_REPL "))))</p>\n",
612
+ "utf8 with U+0000");
613
+ free(html);
614
+ }
615
+
616
+ static void
617
+ test_char(test_batch_runner *runner, int valid, const char *utf8,
618
+ const char *msg)
619
+ {
620
+ char buf[20];
621
+ sprintf(buf, "((((%s))))", utf8);
622
+
623
+ if (valid) {
624
+ char expected[30];
625
+ sprintf(expected, "<p>((((%s))))</p>\n", utf8);
626
+ test_md_to_html(runner, buf, expected, msg);
627
+ }
628
+ else {
629
+ test_md_to_html(runner, buf, "<p>((((" UTF8_REPL "))))</p>\n",
630
+ msg);
631
+ }
632
+ }
633
+
634
+ static void
635
+ test_incomplete_char(test_batch_runner *runner, const char *utf8,
636
+ const char *msg)
637
+ {
638
+ char buf[20];
639
+ sprintf(buf, "----%s", utf8);
640
+ test_md_to_html(runner, buf, "<p>----" UTF8_REPL "</p>\n", msg);
641
+ }
642
+
643
+ static void
644
+ test_continuation_byte(test_batch_runner *runner, const char *utf8)
645
+ {
646
+ int len = strlen(utf8);
647
+
648
+ for (int pos = 1; pos < len; ++pos) {
649
+ char buf[20];
650
+ sprintf(buf, "((((%s))))", utf8);
651
+ buf[4+pos] = '\x20';
652
+
653
+ char expected[50];
654
+ strcpy(expected, "<p>((((" UTF8_REPL "\x20");
655
+ for (int i = pos + 1; i < len; ++i) {
656
+ strcat(expected, UTF8_REPL);
657
+ }
658
+ strcat(expected, "))))</p>\n");
659
+
660
+ char *html = cmark_markdown_to_html(buf, strlen(buf),
661
+ CMARK_OPT_DEFAULT);
662
+ STR_EQ(runner, html, expected,
663
+ "invalid utf8 continuation byte %d/%d", pos, len);
664
+ free(html);
665
+ }
666
+ }
667
+
668
+ static void
669
+ test_md_to_html(test_batch_runner *runner, const char *markdown,
670
+ const char *expected_html, const char *msg)
671
+ {
672
+ char *html = cmark_markdown_to_html(markdown, strlen(markdown),
673
+ CMARK_OPT_DEFAULT);
674
+ STR_EQ(runner, html, expected_html, msg);
675
+ free(html);
676
+ }
677
+
678
+ int main() {
679
+ int retval;
680
+ test_batch_runner *runner = test_batch_runner_new();
681
+
682
+ version(runner);
683
+ constructor(runner);
684
+ accessors(runner);
685
+ node_check(runner);
686
+ iterator(runner);
687
+ iterator_delete(runner);
688
+ create_tree(runner);
689
+ hierarchy(runner);
690
+ parser(runner);
691
+ render_html(runner);
692
+ utf8(runner);
693
+ test_cplusplus(runner);
694
+
695
+ test_print_summary(runner);
696
+ retval = test_ok(runner) ? 0 : 1;
697
+ free(runner);
698
+
699
+ return retval;
700
+ }
@@ -0,0 +1,15 @@
1
+ environment:
2
+ PYTHON: "C:\\Python34-x64"
3
+ PYTHON_VERSION: "3.4.3"
4
+ PYTHON_ARCH: "64"
5
+
6
+ # set up for nmake:
7
+ install:
8
+ - '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64'
9
+ - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
10
+
11
+ build_script:
12
+ - 'nmake'
13
+
14
+ test_script:
15
+ - 'nmake test'