commonmarker 0.0.1 → 0.1.0

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 (501) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -2
  3. data/README.md +67 -42
  4. data/Rakefile +22 -2
  5. data/commonmarker.gemspec +13 -9
  6. data/ext/commonmarker/cmark/api_test/main.c +35 -0
  7. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +12 -12
  8. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +141 -141
  9. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
  10. data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
  11. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
  12. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
  13. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
  14. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
  15. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  16. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  17. data/ext/commonmarker/cmark/build/src/cmark +0 -0
  18. data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
  19. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  20. data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
  21. data/ext/commonmarker/cmark/src/houdini_html_u.c +26 -13
  22. data/ext/commonmarker/cmark/src/iterator.c +2 -2
  23. data/ext/commonmarker/cmark/test/__pycache__/cmark.cpython-34.pyc +0 -0
  24. data/ext/commonmarker/cmark/test/__pycache__/normalize.cpython-34.pyc +0 -0
  25. data/ext/commonmarker/cmark/test/cmark.pyc +0 -0
  26. data/ext/commonmarker/cmark/test/normalize.pyc +0 -0
  27. data/ext/commonmarker/commonmarker.c +276 -3
  28. data/ext/commonmarker/extconf.rb +3 -1
  29. data/lib/commonmarker.rb +70 -360
  30. data/lib/commonmarker/config.rb +1 -1
  31. data/lib/commonmarker/renderer.rb +91 -0
  32. data/lib/commonmarker/renderer/html_renderer.rb +149 -0
  33. data/lib/commonmarker/version.rb +1 -1
  34. data/test/benchinput.md +148414 -0
  35. data/test/benchmark.rb +13 -9
  36. data/test/progit/Gemfile +5 -0
  37. data/test/progit/README.md +9 -0
  38. data/test/progit/README.original.md +70 -0
  39. data/test/progit/Rakefile +285 -0
  40. data/test/progit/ar/01-introduction/01-chapter1.markdown +264 -0
  41. data/test/progit/ar/02-git-basics/01-chapter2.markdown +1124 -0
  42. data/test/progit/ar/NOTES +18 -0
  43. data/test/progit/ar/README +14 -0
  44. data/test/progit/az/01-introduction/01-chapter1.markdown +257 -0
  45. data/test/progit/az/02-git-basics/01-chapter2.markdown +1127 -0
  46. data/test/progit/az/03-git-branching/01-chapter3.markdown +598 -0
  47. data/test/progit/az/04-git-server/01-chapter4.markdown +861 -0
  48. data/test/progit/az/05-distributed-git/01-chapter5.markdown +897 -0
  49. data/test/progit/az/06-git-tools/01-chapter6.markdown +1126 -0
  50. data/test/progit/az/07-customizing-git/01-chapter7.markdown +937 -0
  51. data/test/progit/az/08-git-and-other-scms/01-chapter8.markdown +690 -0
  52. data/test/progit/az/09-git-internals/01-chapter9.markdown +977 -0
  53. data/test/progit/be/01-introduction/01-chapter1.markdown +257 -0
  54. data/test/progit/be/02-git-basics/01-chapter2.markdown +1126 -0
  55. data/test/progit/ca/01-introduction/01-chapter1.markdown +257 -0
  56. data/test/progit/ca/README.txt +1 -0
  57. data/test/progit/couchapp/Makefile +41 -0
  58. data/test/progit/couchapp/Readme.md +17 -0
  59. data/test/progit/couchapp/_id +1 -0
  60. data/test/progit/couchapp/shows/chapter.js +14 -0
  61. data/test/progit/couchapp/templates/foot.html +7 -0
  62. data/test/progit/couchapp/templates/head.html +51 -0
  63. data/test/progit/couchapp/vendor/markdown/showdown.js +420 -0
  64. data/test/progit/couchapp/vendor/mustache.js/mustache.js +302 -0
  65. data/test/progit/cs/01-introduction/01-chapter1.markdown +259 -0
  66. data/test/progit/cs/02-git-basics/01-chapter2.markdown +1225 -0
  67. data/test/progit/cs/03-git-branching/01-chapter3.markdown +606 -0
  68. data/test/progit/cs/04-git-server/01-chapter4.markdown +871 -0
  69. data/test/progit/cs/05-distributed-git/01-chapter5.markdown +914 -0
  70. data/test/progit/cs/06-git-tools/01-chapter6.markdown +1167 -0
  71. data/test/progit/cs/07-customizing-git/01-chapter7.markdown +940 -0
  72. data/test/progit/cs/08-git-and-other-scms/01-chapter8.markdown +700 -0
  73. data/test/progit/cs/09-git-internals/01-chapter9.markdown +1014 -0
  74. data/test/progit/de/01-introduction/01-chapter1.markdown +445 -0
  75. data/test/progit/de/02-git-basics/01-chapter2.markdown +1589 -0
  76. data/test/progit/de/03-git-branching/01-chapter3.markdown +964 -0
  77. data/test/progit/de/04-git-server/01-chapter4.markdown +1337 -0
  78. data/test/progit/de/05-distributed-git/01-chapter5.markdown +1329 -0
  79. data/test/progit/de/06-git-tools/01-chapter6.markdown +1502 -0
  80. data/test/progit/de/07-customizing-git/01-chapter7.markdown +1361 -0
  81. data/test/progit/de/08-git-and-other-scms/01-chapter8.markdown +919 -0
  82. data/test/progit/de/09-git-internals/01-chapter9.markdown +1361 -0
  83. data/test/progit/de/README.md +626 -0
  84. data/test/progit/ebooks/cover.png +0 -0
  85. data/test/progit/en/01-introduction/01-chapter1.markdown +263 -0
  86. data/test/progit/en/02-git-basics/01-chapter2.markdown +1228 -0
  87. data/test/progit/en/03-git-branching/01-chapter3.markdown +606 -0
  88. data/test/progit/en/04-git-server/01-chapter4.markdown +871 -0
  89. data/test/progit/en/05-distributed-git/01-chapter5.markdown +914 -0
  90. data/test/progit/en/06-git-tools/01-chapter6.markdown +1150 -0
  91. data/test/progit/en/07-customizing-git/01-chapter7.markdown +940 -0
  92. data/test/progit/en/08-git-and-other-scms/01-chapter8.markdown +700 -0
  93. data/test/progit/en/09-git-internals/01-chapter9.markdown +983 -0
  94. data/test/progit/eo/01-introduction/01-chapter1.markdown +257 -0
  95. data/test/progit/eo/02-git-basics/01-chapter2.markdown +1171 -0
  96. data/test/progit/epub/ProGit.css +28 -0
  97. data/test/progit/epub/title.png +0 -0
  98. data/test/progit/es-ni/01-introduction/01-chapter1.markdown +257 -0
  99. data/test/progit/es-ni/02-git-basics/01-chapter2.markdown +1127 -0
  100. data/test/progit/es/01-introduction/01-chapter1.markdown +262 -0
  101. data/test/progit/es/02-git-basics/01-chapter2.markdown +1165 -0
  102. data/test/progit/es/03-git-branching/01-chapter3.markdown +598 -0
  103. data/test/progit/es/04-git-server/01-chapter4.markdown +707 -0
  104. data/test/progit/es/05-distributed-git/01-chapter5.markdown +890 -0
  105. data/test/progit/es/06-git-tools/01-chapter6.markdown +1113 -0
  106. data/test/progit/es/07-customizing-git/01-chapter7.markdown +875 -0
  107. data/test/progit/es/08-git-and-other-scms/01-chapter8.markdown +686 -0
  108. data/test/progit/es/09-git-internals/01-chapter9.markdown +976 -0
  109. data/test/progit/es/NOTES +29 -0
  110. data/test/progit/es/README +3 -0
  111. data/test/progit/es/glosario-Benzirpi.txt +27 -0
  112. data/test/progit/es/omegat-Benzirpi.tmx +29075 -0
  113. data/test/progit/fa/01-introduction/01-chapter1.markdown +262 -0
  114. data/test/progit/fa/03-git-branching/01-chapter3.markdown +608 -0
  115. data/test/progit/fa/04-git-server/01-chapter4.markdown +872 -0
  116. data/test/progit/fa/NOTES.en-fa.md +143 -0
  117. data/test/progit/fa/README.md +7 -0
  118. data/test/progit/fi/01-introduction/01-chapter1.markdown +259 -0
  119. data/test/progit/fi/02-git-basics/01-chapter2.markdown +1171 -0
  120. data/test/progit/fi/NOTES +5 -0
  121. data/test/progit/figures-dia/fig0101.dia +617 -0
  122. data/test/progit/figures-dia/fig0102.dia +921 -0
  123. data/test/progit/figures-dia/fig0103.dia +1468 -0
  124. data/test/progit/figures-dia/fig0104.dia +1432 -0
  125. data/test/progit/figures-dia/fig0105.dia +1924 -0
  126. data/test/progit/figures-dia/fig0106.dia +562 -0
  127. data/test/progit/figures-dia/fig0201.dia +774 -0
  128. data/test/progit/figures-dia/fig0301.dia +2006 -0
  129. data/test/progit/figures-dia/fig0302.dia +2148 -0
  130. data/test/progit/figures-dia/fig0303.dia +719 -0
  131. data/test/progit/figures-dia/fig0304.dia +525 -0
  132. data/test/progit/figures-dia/fig0305.dia +622 -0
  133. data/test/progit/figures-dia/fig0306.dia +622 -0
  134. data/test/progit/figures-dia/fig0307.dia +719 -0
  135. data/test/progit/figures-dia/fig0308.dia +734 -0
  136. data/test/progit/figures-dia/fig0309.dia +831 -0
  137. data/test/progit/figures-dia/fig0310.dia +412 -0
  138. data/test/progit/figures-dia/fig0311.dia +493 -0
  139. data/test/progit/figures-dia/fig0312.dia +596 -0
  140. data/test/progit/figures-dia/fig0313.dia +774 -0
  141. data/test/progit/figures-dia/fig0314.dia +846 -0
  142. data/test/progit/figures-dia/fig0315.dia +787 -0
  143. data/test/progit/figures-dia/fig0316.dia +1078 -0
  144. data/test/progit/figures-dia/fig0317.dia +881 -0
  145. data/test/progit/figures-dia/fig0318.dia +968 -0
  146. data/test/progit/figures-dia/fig0319.dia +957 -0
  147. data/test/progit/figures-dia/fig0320.dia +1637 -0
  148. data/test/progit/figures-dia/fig0321.dia +1494 -0
  149. data/test/progit/figures-dia/fig0322.dia +1142 -0
  150. data/test/progit/figures-dia/fig0323.dia +1377 -0
  151. data/test/progit/figures-dia/fig0324.dia +1603 -0
  152. data/test/progit/figures-dia/fig0325.dia +2003 -0
  153. data/test/progit/figures-dia/fig0326.dia +2013 -0
  154. data/test/progit/figures-dia/fig0327.dia +687 -0
  155. data/test/progit/figures-dia/fig0328.dia +814 -0
  156. data/test/progit/figures-dia/fig0329.dia +793 -0
  157. data/test/progit/figures-dia/fig0330.dia +693 -0
  158. data/test/progit/figures-dia/fig0331.dia +1159 -0
  159. data/test/progit/figures-dia/fig0332.dia +1362 -0
  160. data/test/progit/figures-dia/fig0333.dia +1165 -0
  161. data/test/progit/figures-dia/fig0334.dia +1450 -0
  162. data/test/progit/figures-dia/fig0335.dia +994 -0
  163. data/test/progit/figures-dia/fig0336.dia +786 -0
  164. data/test/progit/figures-dia/fig0337.dia +1546 -0
  165. data/test/progit/figures-dia/fig0338.dia +1755 -0
  166. data/test/progit/figures-dia/fig0339.dia +1882 -0
  167. data/test/progit/figures-dia/fig0501.dia +456 -0
  168. data/test/progit/figures-dia/fig0502.dia +956 -0
  169. data/test/progit/figures-dia/fig0503.dia +915 -0
  170. data/test/progit/figures-dia/fig0504.dia +620 -0
  171. data/test/progit/figures-dia/fig0505.dia +744 -0
  172. data/test/progit/figures-dia/fig0506.dia +747 -0
  173. data/test/progit/figures-dia/fig0507.dia +895 -0
  174. data/test/progit/figures-dia/fig0508.dia +1122 -0
  175. data/test/progit/figures-dia/fig0509.dia +1243 -0
  176. data/test/progit/figures-dia/fig0510.dia +1240 -0
  177. data/test/progit/figures-dia/fig0511.dia +1201 -0
  178. data/test/progit/figures-dia/fig0512.dia +801 -0
  179. data/test/progit/figures-dia/fig0513.dia +1387 -0
  180. data/test/progit/figures-dia/fig0514.dia +1568 -0
  181. data/test/progit/figures-dia/fig0515.dia +1721 -0
  182. data/test/progit/figures-dia/fig0516.dia +997 -0
  183. data/test/progit/figures-dia/fig0517.dia +994 -0
  184. data/test/progit/figures-dia/fig0518.dia +1145 -0
  185. data/test/progit/figures-dia/fig0519.dia +992 -0
  186. data/test/progit/figures-dia/fig0520.dia +1240 -0
  187. data/test/progit/figures-dia/fig0521.dia +801 -0
  188. data/test/progit/figures-dia/fig0522.dia +922 -0
  189. data/test/progit/figures-dia/fig0523.dia +922 -0
  190. data/test/progit/figures-dia/fig0524.dia +1828 -0
  191. data/test/progit/figures-dia/fig0525.dia +2685 -0
  192. data/test/progit/figures-dia/fig0526.dia +717 -0
  193. data/test/progit/figures-dia/fig0527.dia +856 -0
  194. data/test/progit/figures-dia/fig0601.dia +790 -0
  195. data/test/progit/figures-dia/fig0702.dia +795 -0
  196. data/test/progit/figures-dia/fig0703.dia +795 -0
  197. data/test/progit/figures-dia/fig0901.dia +669 -0
  198. data/test/progit/figures-dia/fig0902.dia +834 -0
  199. data/test/progit/figures-dia/fig0903.dia +1483 -0
  200. data/test/progit/figures-dia/fig0904.dia +1728 -0
  201. data/test/progit/figures-dia/makeimages +25 -0
  202. data/test/progit/figures-source/progit.graffle +123108 -0
  203. data/test/progit/figures/18333fig0101-tn.png +0 -0
  204. data/test/progit/figures/18333fig0102-tn.png +0 -0
  205. data/test/progit/figures/18333fig0103-tn.png +0 -0
  206. data/test/progit/figures/18333fig0104-tn.png +0 -0
  207. data/test/progit/figures/18333fig0105-tn.png +0 -0
  208. data/test/progit/figures/18333fig0106-tn.png +0 -0
  209. data/test/progit/figures/18333fig0107-tn.png +0 -0
  210. data/test/progit/figures/18333fig0201-tn.png +0 -0
  211. data/test/progit/figures/18333fig0202-tn.png +0 -0
  212. data/test/progit/figures/18333fig0301-tn.png +0 -0
  213. data/test/progit/figures/18333fig0302-tn.png +0 -0
  214. data/test/progit/figures/18333fig0303-tn.png +0 -0
  215. data/test/progit/figures/18333fig0304-tn.png +0 -0
  216. data/test/progit/figures/18333fig0305-tn.png +0 -0
  217. data/test/progit/figures/18333fig0306-tn.png +0 -0
  218. data/test/progit/figures/18333fig0307-tn.png +0 -0
  219. data/test/progit/figures/18333fig0308-tn.png +0 -0
  220. data/test/progit/figures/18333fig0309-tn.png +0 -0
  221. data/test/progit/figures/18333fig0310-tn.png +0 -0
  222. data/test/progit/figures/18333fig0311-tn.png +0 -0
  223. data/test/progit/figures/18333fig0312-tn.png +0 -0
  224. data/test/progit/figures/18333fig0313-tn.png +0 -0
  225. data/test/progit/figures/18333fig0314-tn.png +0 -0
  226. data/test/progit/figures/18333fig0315-tn.png +0 -0
  227. data/test/progit/figures/18333fig0316-tn.png +0 -0
  228. data/test/progit/figures/18333fig0317-tn.png +0 -0
  229. data/test/progit/figures/18333fig0318-tn.png +0 -0
  230. data/test/progit/figures/18333fig0319-tn.png +0 -0
  231. data/test/progit/figures/18333fig0320-tn.png +0 -0
  232. data/test/progit/figures/18333fig0321-tn.png +0 -0
  233. data/test/progit/figures/18333fig0322-tn.png +0 -0
  234. data/test/progit/figures/18333fig0323-tn.png +0 -0
  235. data/test/progit/figures/18333fig0324-tn.png +0 -0
  236. data/test/progit/figures/18333fig0325-tn.png +0 -0
  237. data/test/progit/figures/18333fig0326-tn.png +0 -0
  238. data/test/progit/figures/18333fig0327-tn.png +0 -0
  239. data/test/progit/figures/18333fig0328-tn.png +0 -0
  240. data/test/progit/figures/18333fig0329-tn.png +0 -0
  241. data/test/progit/figures/18333fig0330-tn.png +0 -0
  242. data/test/progit/figures/18333fig0331-tn.png +0 -0
  243. data/test/progit/figures/18333fig0332-tn.png +0 -0
  244. data/test/progit/figures/18333fig0333-tn.png +0 -0
  245. data/test/progit/figures/18333fig0334-tn.png +0 -0
  246. data/test/progit/figures/18333fig0335-tn.png +0 -0
  247. data/test/progit/figures/18333fig0336-tn.png +0 -0
  248. data/test/progit/figures/18333fig0337-tn.png +0 -0
  249. data/test/progit/figures/18333fig0338-tn.png +0 -0
  250. data/test/progit/figures/18333fig0339-tn.png +0 -0
  251. data/test/progit/figures/18333fig0401-tn.png +0 -0
  252. data/test/progit/figures/18333fig0402-tn.png +0 -0
  253. data/test/progit/figures/18333fig0403-tn.png +0 -0
  254. data/test/progit/figures/18333fig0404-tn.png +0 -0
  255. data/test/progit/figures/18333fig0405-tn.png +0 -0
  256. data/test/progit/figures/18333fig0406-tn.png +0 -0
  257. data/test/progit/figures/18333fig0407-tn.png +0 -0
  258. data/test/progit/figures/18333fig0408-tn.png +0 -0
  259. data/test/progit/figures/18333fig0409-tn.png +0 -0
  260. data/test/progit/figures/18333fig0410-tn.png +0 -0
  261. data/test/progit/figures/18333fig0411-tn.png +0 -0
  262. data/test/progit/figures/18333fig0412-tn.png +0 -0
  263. data/test/progit/figures/18333fig0413-tn.png +0 -0
  264. data/test/progit/figures/18333fig0414-tn.png +0 -0
  265. data/test/progit/figures/18333fig0415-tn.png +0 -0
  266. data/test/progit/figures/18333fig0501-tn.png +0 -0
  267. data/test/progit/figures/18333fig0502-tn.png +0 -0
  268. data/test/progit/figures/18333fig0503-tn.png +0 -0
  269. data/test/progit/figures/18333fig0504-tn.png +0 -0
  270. data/test/progit/figures/18333fig0505-tn.png +0 -0
  271. data/test/progit/figures/18333fig0506-tn.png +0 -0
  272. data/test/progit/figures/18333fig0507-tn.png +0 -0
  273. data/test/progit/figures/18333fig0508-tn.png +0 -0
  274. data/test/progit/figures/18333fig0509-tn.png +0 -0
  275. data/test/progit/figures/18333fig0510-tn.png +0 -0
  276. data/test/progit/figures/18333fig0511-tn.png +0 -0
  277. data/test/progit/figures/18333fig0512-tn.png +0 -0
  278. data/test/progit/figures/18333fig0513-tn.png +0 -0
  279. data/test/progit/figures/18333fig0514-tn.png +0 -0
  280. data/test/progit/figures/18333fig0515-tn.png +0 -0
  281. data/test/progit/figures/18333fig0516-tn.png +0 -0
  282. data/test/progit/figures/18333fig0517-tn.png +0 -0
  283. data/test/progit/figures/18333fig0518-tn.png +0 -0
  284. data/test/progit/figures/18333fig0519-tn.png +0 -0
  285. data/test/progit/figures/18333fig0520-tn.png +0 -0
  286. data/test/progit/figures/18333fig0521-tn.png +0 -0
  287. data/test/progit/figures/18333fig0522-tn.png +0 -0
  288. data/test/progit/figures/18333fig0523-tn.png +0 -0
  289. data/test/progit/figures/18333fig0524-tn.png +0 -0
  290. data/test/progit/figures/18333fig0525-tn.png +0 -0
  291. data/test/progit/figures/18333fig0526-tn.png +0 -0
  292. data/test/progit/figures/18333fig0527-tn.png +0 -0
  293. data/test/progit/figures/18333fig0601-tn.png +0 -0
  294. data/test/progit/figures/18333fig0701-tn.png +0 -0
  295. data/test/progit/figures/18333fig0702-tn.png +0 -0
  296. data/test/progit/figures/18333fig0703-tn.png +0 -0
  297. data/test/progit/figures/18333fig0901-tn.png +0 -0
  298. data/test/progit/figures/18333fig0902-tn.png +0 -0
  299. data/test/progit/figures/18333fig0903-tn.png +0 -0
  300. data/test/progit/figures/18333fig0904-tn.png +0 -0
  301. data/test/progit/fr/01-introduction/01-chapter1.markdown +371 -0
  302. data/test/progit/fr/02-git-basics/01-chapter2.markdown +1378 -0
  303. data/test/progit/fr/03-git-branching/01-chapter3.markdown +781 -0
  304. data/test/progit/fr/04-git-server/01-chapter4.markdown +1141 -0
  305. data/test/progit/fr/05-distributed-git/01-chapter5.markdown +1163 -0
  306. data/test/progit/fr/06-git-tools/01-chapter6.markdown +1356 -0
  307. data/test/progit/fr/07-customizing-git/01-chapter7.markdown +1200 -0
  308. data/test/progit/fr/08-git-and-other-scms/01-chapter8.markdown +832 -0
  309. data/test/progit/fr/09-git-internals/01-chapter9.markdown +1228 -0
  310. data/test/progit/fr/NOTES.fr-fr.markdown +1 -0
  311. data/test/progit/fr/NOTES.fr-fr.md +127 -0
  312. data/test/progit/fr/README.md +43 -0
  313. data/test/progit/fr/glossaire-git.adoc +108 -0
  314. data/test/progit/hi/01-introduction/01-chapter1.markdown +7 -0
  315. data/test/progit/hu/01-introduction/01-chapter1.markdown +257 -0
  316. data/test/progit/id/01-introduction/01-chapter1.markdown +257 -0
  317. data/test/progit/id/02-git-basics/01-chapter2.markdown +1127 -0
  318. data/test/progit/id/03-git-branching/01-chapter3.markdown +598 -0
  319. data/test/progit/it/01-introduction/01-chapter1.markdown +263 -0
  320. data/test/progit/it/02-git-basics/01-chapter2.markdown +1227 -0
  321. data/test/progit/it/03-git-branching/01-chapter3.markdown +598 -0
  322. data/test/progit/it/04-git-server/01-chapter4.markdown +864 -0
  323. data/test/progit/it/05-distributed-git/01-chapter5.markdown +897 -0
  324. data/test/progit/it/06-git-tools/01-chapter6.markdown +1144 -0
  325. data/test/progit/it/07-customizing-git/01-chapter7.markdown +606 -0
  326. data/test/progit/it/08-git-and-other-scms/01-chapter8.markdown +707 -0
  327. data/test/progit/it/09-git-internals/01-chapter9.markdown +1000 -0
  328. data/test/progit/ja/01-introduction/01-chapter1.markdown +260 -0
  329. data/test/progit/ja/02-git-basics/01-chapter2.markdown +1221 -0
  330. data/test/progit/ja/03-git-branching/01-chapter3.markdown +604 -0
  331. data/test/progit/ja/04-git-server/01-chapter4.markdown +863 -0
  332. data/test/progit/ja/05-distributed-git/01-chapter5.markdown +908 -0
  333. data/test/progit/ja/06-git-tools/01-chapter6.markdown +1133 -0
  334. data/test/progit/ja/07-customizing-git/01-chapter7.markdown +936 -0
  335. data/test/progit/ja/08-git-and-other-scms/01-chapter8.markdown +690 -0
  336. data/test/progit/ja/09-git-internals/01-chapter9.markdown +984 -0
  337. data/test/progit/ja/README.md +58 -0
  338. data/test/progit/ja/translation glossaries.txt +33 -0
  339. data/test/progit/ko/01-introduction/01-chapter1.markdown +258 -0
  340. data/test/progit/ko/02-git-basics/01-chapter2.markdown +1181 -0
  341. data/test/progit/ko/03-git-branching/01-chapter3.markdown +612 -0
  342. data/test/progit/ko/04-git-server/01-chapter4.markdown +867 -0
  343. data/test/progit/ko/05-distributed-git/01-chapter5.markdown +913 -0
  344. data/test/progit/ko/06-git-tools/01-chapter6.markdown +1142 -0
  345. data/test/progit/ko/07-customizing-git/01-chapter7.markdown +935 -0
  346. data/test/progit/ko/08-git-and-other-scms/01-chapter8.markdown +688 -0
  347. data/test/progit/ko/09-git-internals/01-chapter9.markdown +976 -0
  348. data/test/progit/ko/README.md +75 -0
  349. data/test/progit/ko/translation_guide.txt +65 -0
  350. data/test/progit/latex/README +27 -0
  351. data/test/progit/latex/config.yml +144 -0
  352. data/test/progit/latex/makepdf +207 -0
  353. data/test/progit/latex/template.tex +155 -0
  354. data/test/progit/makeebooks +125 -0
  355. data/test/progit/makepdfs +47 -0
  356. data/test/progit/mk/01-introduction/01-chapter1.markdown +258 -0
  357. data/test/progit/mk/02-git-basics/01-chapter2.markdown +1125 -0
  358. data/test/progit/mk/03-git-branching/01-chapter3.markdown +598 -0
  359. data/test/progit/mk/05-distributed-git/01-chapter5.markdown +897 -0
  360. data/test/progit/nl/01-introduction/01-chapter1.markdown +296 -0
  361. data/test/progit/nl/02-git-basics/01-chapter2.markdown +1253 -0
  362. data/test/progit/nl/03-git-branching/01-chapter3.markdown +642 -0
  363. data/test/progit/nl/04-git-server/01-chapter4.markdown +902 -0
  364. data/test/progit/nl/05-distributed-git/01-chapter5.markdown +953 -0
  365. data/test/progit/nl/06-git-tools/01-chapter6.markdown +1177 -0
  366. data/test/progit/nl/07-customizing-git/01-chapter7.markdown +974 -0
  367. data/test/progit/nl/08-git-and-other-scms/01-chapter8.markdown +725 -0
  368. data/test/progit/nl/09-git-internals/01-chapter9.markdown +1013 -0
  369. data/test/progit/no-nb/01-introduction/01-chapter1.markdown +261 -0
  370. data/test/progit/no-nb/02-git-basics/01-chapter2.markdown +1225 -0
  371. data/test/progit/no-nb/03-git-branching/01-chapter3.markdown +606 -0
  372. data/test/progit/no-nb/04-git-server/01-chapter4.markdown +867 -0
  373. data/test/progit/no-nb/05-distributed-git/01-chapter5.markdown +914 -0
  374. data/test/progit/no-nb/06-git-tools/01-chapter6.markdown +1144 -0
  375. data/test/progit/no-nb/07-customizing-git/01-chapter7.markdown +936 -0
  376. data/test/progit/no-nb/08-git-and-other-scms/01-chapter8.markdown +689 -0
  377. data/test/progit/no-nb/09-git-internals/01-chapter9.markdown +977 -0
  378. data/test/progit/no-nb/README +2 -0
  379. data/test/progit/pl/01-introduction/01-chapter1.markdown +257 -0
  380. data/test/progit/pl/02-git-basics/02-chapter2.markdown +1128 -0
  381. data/test/progit/pl/03-git-branching/01-chapter3.markdown +598 -0
  382. data/test/progit/pl/04-git-server/01-chapter4.markdown +897 -0
  383. data/test/progit/pl/05-distributed-git/01-chapter5.markdown +1278 -0
  384. data/test/progit/pl/06-git-tools/01-chapter6.markdown +1550 -0
  385. data/test/progit/pl/07-customizing-git/01-chapter7.markdown +1058 -0
  386. data/test/progit/pl/08-git-and-other-scms/01-chapter8.markdown +948 -0
  387. data/test/progit/pl/09-git-internals/01-chapter9.markdown +1382 -0
  388. data/test/progit/pl/translation-guidelines.txt +70 -0
  389. data/test/progit/pt-br/01-introduction/01-chapter1.markdown +256 -0
  390. data/test/progit/pt-br/02-git-basics/01-chapter2.markdown +1127 -0
  391. data/test/progit/pt-br/03-git-branching/01-chapter3.markdown +596 -0
  392. data/test/progit/pt-br/04-git-server/01-chapter4.markdown +888 -0
  393. data/test/progit/pt-br/05-distributed-git/01-chapter5.markdown +896 -0
  394. data/test/progit/pt-br/06-git-tools/01-chapter6.markdown +1122 -0
  395. data/test/progit/pt-br/07-customizing-git/01-chapter7.markdown +932 -0
  396. data/test/progit/pt-br/08-git-and-other-scms/01-chapter8.markdown +691 -0
  397. data/test/progit/pt-br/09-git-internals/01-chapter9.markdown +978 -0
  398. data/test/progit/pt-br/figures-dia/fig0101.dia +617 -0
  399. data/test/progit/pt-br/figures-dia/fig0102.dia +921 -0
  400. data/test/progit/pt-br/figures-dia/fig0103.dia +1468 -0
  401. data/test/progit/pt-br/figures-dia/fig0104.dia +1432 -0
  402. data/test/progit/pt-br/figures-dia/fig0105.dia +1924 -0
  403. data/test/progit/pt-br/figures-dia/fig0106.dia +562 -0
  404. data/test/progit/pt-br/figures-dia/fig0201.dia +776 -0
  405. data/test/progit/pt-br/figures-dia/fig0301.dia +2006 -0
  406. data/test/progit/pt-br/figures-dia/fig0302.dia +2148 -0
  407. data/test/progit/pt-br/figures-dia/fig0316.dia +1079 -0
  408. data/test/progit/pt-br/figures-dia/fig0322.dia +1142 -0
  409. data/test/progit/pt-br/figures-dia/fig0323.dia +1407 -0
  410. data/test/progit/pt-br/figures-dia/fig0324.dia +1603 -0
  411. data/test/progit/pt-br/figures-dia/fig0325.dia +2003 -0
  412. data/test/progit/pt-br/figures-dia/fig0326.dia +2013 -0
  413. data/test/progit/pt-br/figures-dia/fig0336.dia +786 -0
  414. data/test/progit/pt-br/figures-dia/fig0337.dia +1546 -0
  415. data/test/progit/pt-br/figures-dia/fig0338.dia +1755 -0
  416. data/test/progit/pt-br/figures-dia/fig0339.dia +1882 -0
  417. data/test/progit/pt-br/figures-dia/fig0501.dia +456 -0
  418. data/test/progit/pt-br/figures-dia/fig0502.dia +965 -0
  419. data/test/progit/pt-br/figures-dia/fig0503.dia +914 -0
  420. data/test/progit/pt-br/figures-dia/fig0511.dia +1201 -0
  421. data/test/progit/pt-br/figures-dia/fig0515.dia +1721 -0
  422. data/test/progit/pt-br/figures-dia/fig0702.dia +795 -0
  423. data/test/progit/pt-br/figures-dia/fig0703.dia +795 -0
  424. data/test/progit/pt-br/figures-dia/fig0901.dia +669 -0
  425. data/test/progit/pt-br/figures-dia/fig0902.dia +834 -0
  426. data/test/progit/pt-br/figures-dia/fig0903.dia +1483 -0
  427. data/test/progit/pt-br/figures-dia/fig0904.dia +1728 -0
  428. data/test/progit/ro/01-introduction/01-chapter1.markdown +257 -0
  429. data/test/progit/ru/01-introduction/01-chapter1.markdown +259 -0
  430. data/test/progit/ru/02-git-basics/01-chapter2.markdown +1155 -0
  431. data/test/progit/ru/03-git-branching/01-chapter3.markdown +598 -0
  432. data/test/progit/ru/04-git-server/01-chapter4.markdown +854 -0
  433. data/test/progit/ru/05-distributed-git/01-chapter5.markdown +897 -0
  434. data/test/progit/ru/06-git-tools/01-chapter6.markdown +1126 -0
  435. data/test/progit/ru/07-customizing-git/01-chapter7.markdown +938 -0
  436. data/test/progit/ru/08-git-and-other-scms/01-chapter8.markdown +691 -0
  437. data/test/progit/ru/09-git-internals/01-chapter9.markdown +977 -0
  438. data/test/progit/ru/Glossary +38 -0
  439. data/test/progit/ru/README +12 -0
  440. data/test/progit/ru/figures-dia/fig0101.dia +647 -0
  441. data/test/progit/ru/figures-dia/fig0102.dia +1009 -0
  442. data/test/progit/ru/figures-dia/fig0103.dia +1468 -0
  443. data/test/progit/ru/figures-dia/fig0104.dia +1432 -0
  444. data/test/progit/ru/figures-dia/fig0105.dia +1924 -0
  445. data/test/progit/ru/figures-dia/fig0106.dia +561 -0
  446. data/test/progit/ru/figures-dia/fig0201.dia +774 -0
  447. data/test/progit/ru/figures-dia/fig0322.dia +1182 -0
  448. data/test/progit/ru/figures-dia/fig0323.dia +1457 -0
  449. data/test/progit/ru/figures-dia/fig0324.dia +1698 -0
  450. data/test/progit/ru/figures-dia/fig0325.dia +2101 -0
  451. data/test/progit/ru/figures-dia/fig0326.dia +2111 -0
  452. data/test/progit/ru/figures-dia/fig0336.dia +786 -0
  453. data/test/progit/ru/figures-dia/fig0337.dia +1546 -0
  454. data/test/progit/ru/figures-dia/fig0338.dia +1755 -0
  455. data/test/progit/ru/figures-dia/fig0339.dia +1882 -0
  456. data/test/progit/ru/figures-dia/fig0501.dia +477 -0
  457. data/test/progit/ru/figures-dia/fig0502.dia +1063 -0
  458. data/test/progit/ru/figures-dia/fig0503.dia +915 -0
  459. data/test/progit/ru/figures-dia/fig0511.dia +1201 -0
  460. data/test/progit/ru/figures-dia/fig0515.dia +1741 -0
  461. data/test/progit/ru/figures-dia/fig0702.dia +851 -0
  462. data/test/progit/ru/figures-dia/fig0703.dia +851 -0
  463. data/test/progit/sr/01-introduction/01-chapter1.markdown +257 -0
  464. data/test/progit/summary.rb +29 -0
  465. data/test/progit/th/01-introduction/01-chapter1.markdown +257 -0
  466. data/test/progit/th/02-git-basics/01-chapter2.markdown +1126 -0
  467. data/test/progit/th/README.md +47 -0
  468. data/test/progit/tr/01-introduction/01-chapter1.markdown +258 -0
  469. data/test/progit/tr/02-git-basics/01-chapter2.markdown +1129 -0
  470. data/test/progit/tr/03-git-branching/01-chapter3.markdown +598 -0
  471. data/test/progit/tr/04-git-server/01-chapter4.markdown +73 -0
  472. data/test/progit/tr/05-distributed-git/01-chapter5.markdown +215 -0
  473. data/test/progit/uk/01-introduction/01-chapter1.markdown +522 -0
  474. data/test/progit/vi/01-introduction/01-chapter1.markdown +259 -0
  475. data/test/progit/vi/02-git-basics/01-chapter2.markdown +1172 -0
  476. data/test/progit/vi/03-git-branching/01-chapter3.markdown +598 -0
  477. data/test/progit/zh-tw/01-introduction/01-chapter1.markdown +259 -0
  478. data/test/progit/zh-tw/02-git-basics/01-chapter2.markdown +1183 -0
  479. data/test/progit/zh-tw/03-git-branching/01-chapter3.markdown +604 -0
  480. data/test/progit/zh-tw/04-git-server/01-chapter4.markdown +866 -0
  481. data/test/progit/zh-tw/05-distributed-git/01-chapter5.markdown +912 -0
  482. data/test/progit/zh-tw/06-git-tools/01-chapter6.markdown +1139 -0
  483. data/test/progit/zh-tw/07-customizing-git/01-chapter7.markdown +932 -0
  484. data/test/progit/zh-tw/08-git-and-other-scms/01-chapter8.markdown +689 -0
  485. data/test/progit/zh-tw/09-git-internals/01-chapter9.markdown +977 -0
  486. data/test/progit/zh/01-introduction/01-chapter1.markdown +259 -0
  487. data/test/progit/zh/02-git-basics/01-chapter2.markdown +1177 -0
  488. data/test/progit/zh/03-git-branching/01-chapter3.markdown +604 -0
  489. data/test/progit/zh/04-git-server/01-chapter4.markdown +866 -0
  490. data/test/progit/zh/05-distributed-git/01-chapter5.markdown +912 -0
  491. data/test/progit/zh/06-git-tools/01-chapter6.markdown +1125 -0
  492. data/test/progit/zh/07-customizing-git/01-chapter7.markdown +935 -0
  493. data/test/progit/zh/08-git-and-other-scms/01-chapter8.markdown +689 -0
  494. data/test/progit/zh/09-git-internals/01-chapter9.markdown +976 -0
  495. data/test/spec_tests.json +4382 -4070
  496. data/test/test_basics.rb +1 -1
  497. data/test/test_helper.rb +1 -0
  498. data/test/test_maliciousness.rb +4 -2
  499. data/test/test_pathological_inputs.rb +31 -30
  500. data/test/test_spec.rb +5 -4
  501. metadata +972 -4
Binary file
@@ -12,32 +12,45 @@ houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src, size_t size)
12
12
  {
13
13
  size_t i = 0;
14
14
 
15
- if (size > 3 && src[0] == '#') {
16
- int codepoint = 0;
15
+ if (size >= 3 && src[0] == '#') {
16
+ int codepoint = 0;
17
+ int num_digits = 0;
17
18
 
18
19
  if (_isdigit(src[1])) {
19
20
  for (i = 1; i < size && _isdigit(src[i]); ++i) {
20
- int cp = (codepoint * 10) + (src[i] - '0');
21
+ codepoint = (codepoint * 10) + (src[i] - '0');
21
22
 
22
- if (cp < codepoint)
23
- return 0;
24
-
25
- codepoint = cp;
23
+ if (codepoint >= 0x110000) {
24
+ // Keep counting digits but
25
+ // avoid integer overflow.
26
+ codepoint = 0x110000;
27
+ }
26
28
  }
29
+
30
+ num_digits = i - 1;
27
31
  }
28
32
 
29
33
  else if (src[1] == 'x' || src[1] == 'X') {
30
34
  for (i = 2; i < size && _isxdigit(src[i]); ++i) {
31
- int cp = (codepoint * 16) + ((src[i] | 32) % 39 - 9);
35
+ codepoint = (codepoint * 16) + ((src[i] | 32) % 39 - 9);
32
36
 
33
- if (cp < codepoint)
34
- return 0;
35
-
36
- codepoint = cp;
37
+ if (codepoint >= 0x110000) {
38
+ // Keep counting digits but
39
+ // avoid integer overflow.
40
+ codepoint = 0x110000;
41
+ }
37
42
  }
43
+
44
+ num_digits = i - 2;
38
45
  }
39
46
 
40
- if (i < size && src[i] == ';' && codepoint) {
47
+ if (num_digits >= 1 && num_digits <= 8 &&
48
+ i < size && src[i] == ';') {
49
+ if (codepoint == 0 ||
50
+ (codepoint >= 0xD800 && codepoint < 0xE000) ||
51
+ codepoint >= 0x110000) {
52
+ codepoint = 0xFFFD;
53
+ }
41
54
  utf8proc_encode_char(codepoint, ob);
42
55
  return i + 1;
43
56
  }
@@ -138,8 +138,8 @@ void cmark_consolidate_text_nodes(cmark_node *root)
138
138
  cmark_node_free(tmp);
139
139
  tmp = next;
140
140
  }
141
- cmark_strbuf_putc(&buf, 0);
142
- cmark_node_set_literal(cur, (char *)buf.ptr);
141
+ cmark_chunk_free(&cur->as.literal);
142
+ cur->as.literal = cmark_chunk_buf_detach(&buf);
143
143
  }
144
144
  }
145
145
 
@@ -5,9 +5,14 @@
5
5
  VALUE rb_mCommonMark;
6
6
 
7
7
  static VALUE
8
- rb_markdown_to_html(VALUE text)
8
+ rb_markdown_to_html(VALUE self, VALUE rb_text)
9
9
  {
10
- return rb_str_new2((char *)cmark_markdown_to_html((char *)RSTRING_PTR(text), RSTRING_LEN(text), 0));
10
+ Check_Type(rb_text, T_STRING);
11
+
12
+ char *str = (char *)RSTRING_PTR(rb_text);
13
+ int len = RSTRING_LEN(rb_text);
14
+
15
+ return rb_str_new2(cmark_markdown_to_html(str, len, 0));
11
16
  }
12
17
 
13
18
  static VALUE
@@ -41,7 +46,11 @@ rb_node_get_string_content(VALUE self, VALUE n)
41
46
  cmark_node *node;
42
47
  Data_Get_Struct(n, cmark_node, node);
43
48
 
44
- return rb_str_new2(cmark_node_get_literal(node));
49
+ char *text = (char *) cmark_node_get_literal(node);
50
+ if (text == NULL)
51
+ return Qnil;
52
+
53
+ return rb_str_new2(text);
45
54
  }
46
55
 
47
56
  static VALUE
@@ -145,6 +154,250 @@ rb_render_html(VALUE self, VALUE n, VALUE rb_options)
145
154
  return rb_str_new2(cmark_render_html(node, options));
146
155
  }
147
156
 
157
+ static VALUE
158
+ rb_node_insert_after(VALUE self, VALUE n1, VALUE n2)
159
+ {
160
+ cmark_node *node1;
161
+ Data_Get_Struct(n1, cmark_node, node1);
162
+
163
+ cmark_node *node2;
164
+ Data_Get_Struct(n2, cmark_node, node2);
165
+
166
+ return INT2NUM(cmark_node_insert_after(node1, node2));
167
+ }
168
+
169
+
170
+ static VALUE
171
+ rb_node_prepend_child(VALUE self, VALUE n1, VALUE n2)
172
+ {
173
+ cmark_node *node1;
174
+ Data_Get_Struct(n1, cmark_node, node1);
175
+
176
+ cmark_node *node2;
177
+ Data_Get_Struct(n2, cmark_node, node2);
178
+
179
+ return INT2NUM(cmark_node_prepend_child(node1, node2));
180
+ }
181
+
182
+
183
+ static VALUE
184
+ rb_node_append_child(VALUE self, VALUE n1, VALUE n2)
185
+ {
186
+ cmark_node *node1;
187
+ Data_Get_Struct(n1, cmark_node, node1);
188
+
189
+ cmark_node *node2;
190
+ Data_Get_Struct(n2, cmark_node, node2);
191
+
192
+ return INT2NUM(cmark_node_append_child(node1, node2));
193
+ }
194
+
195
+
196
+ static VALUE
197
+ rb_node_last_child(VALUE self, VALUE n)
198
+ {
199
+ cmark_node *node;
200
+ Data_Get_Struct(n, cmark_node, node);
201
+
202
+ if (node == NULL)
203
+ return Qnil;
204
+
205
+ cmark_node *child = cmark_node_last_child(node);
206
+
207
+ return Data_Wrap_Struct(self, NULL, NULL, child);
208
+ }
209
+
210
+
211
+ static VALUE
212
+ rb_node_parent(VALUE self, VALUE n)
213
+ {
214
+ cmark_node *node;
215
+ Data_Get_Struct(n, cmark_node, node);
216
+
217
+ if (node == NULL)
218
+ return Qnil;
219
+
220
+ cmark_node *parent = cmark_node_parent(node);
221
+
222
+ return Data_Wrap_Struct(self, NULL, NULL, parent);
223
+ }
224
+
225
+
226
+ static VALUE
227
+ rb_node_previous(VALUE self, VALUE n)
228
+ {
229
+ cmark_node *node;
230
+ Data_Get_Struct(n, cmark_node, node);
231
+
232
+ if (node == NULL)
233
+ return Qnil;
234
+
235
+ cmark_node *previous = cmark_node_previous(node);
236
+
237
+ return Data_Wrap_Struct(self, NULL, NULL, previous);
238
+ }
239
+
240
+
241
+ static VALUE
242
+ rb_node_get_url(VALUE self, VALUE n)
243
+ {
244
+ cmark_node *node;
245
+ Data_Get_Struct(n, cmark_node, node);
246
+
247
+ char *text = (char *) cmark_node_get_url(node);
248
+ if (text == NULL)
249
+ return Qnil;
250
+
251
+ return rb_str_new2(text);
252
+ }
253
+
254
+ static VALUE
255
+ rb_node_set_url(VALUE self, VALUE n, VALUE s)
256
+ {
257
+ Check_Type(s, T_STRING);
258
+
259
+ cmark_node *node;
260
+ Data_Get_Struct(n, cmark_node, node);
261
+ char *text = (char *)RSTRING_PTR(s);
262
+
263
+ return INT2NUM(cmark_node_set_url(node, text));
264
+ }
265
+
266
+
267
+ static VALUE
268
+ rb_node_get_title(VALUE self, VALUE n)
269
+ {
270
+ cmark_node *node;
271
+ Data_Get_Struct(n, cmark_node, node);
272
+
273
+ char *text = (char *) cmark_node_get_title(node);
274
+ if (text == NULL)
275
+ return Qnil;
276
+
277
+ return rb_str_new2(text);
278
+ }
279
+
280
+ static VALUE
281
+ rb_node_set_title(VALUE self, VALUE n, VALUE s)
282
+ {
283
+ Check_Type(s, T_STRING);
284
+
285
+ cmark_node *node;
286
+ Data_Get_Struct(n, cmark_node, node);
287
+ char *text = (char *)RSTRING_PTR(s);
288
+
289
+ return INT2NUM(cmark_node_set_title(node, text));
290
+ }
291
+
292
+
293
+ static VALUE
294
+ rb_node_get_header_level(VALUE self, VALUE n)
295
+ {
296
+ cmark_node *node;
297
+ Data_Get_Struct(n, cmark_node, node);
298
+
299
+ return INT2NUM(cmark_node_get_header_level(node));
300
+ }
301
+
302
+ static VALUE
303
+ rb_node_set_header_level(VALUE self, VALUE n, VALUE l)
304
+ {
305
+ Check_Type(l, T_FIXNUM);
306
+
307
+ cmark_node *node;
308
+ Data_Get_Struct(n, cmark_node, node);
309
+ int level = FIX2INT(l);
310
+
311
+ return INT2NUM(cmark_node_set_header_level(node, level));
312
+ }
313
+
314
+
315
+ static VALUE
316
+ rb_node_get_list_type(VALUE self, VALUE n)
317
+ {
318
+ cmark_node *node;
319
+ Data_Get_Struct(n, cmark_node, node);
320
+
321
+ return INT2NUM(cmark_node_get_list_type(node));
322
+ }
323
+
324
+ static VALUE
325
+ rb_node_set_list_type(VALUE self, VALUE n, VALUE t)
326
+ {
327
+ Check_Type(t, T_FIXNUM);
328
+
329
+ cmark_node *node;
330
+ Data_Get_Struct(n, cmark_node, node);
331
+ int type = FIX2INT(t);
332
+
333
+ return INT2NUM(cmark_node_set_list_type(node, type));
334
+ }
335
+
336
+
337
+ static VALUE
338
+ rb_node_get_list_start(VALUE self, VALUE n)
339
+ {
340
+ cmark_node *node;
341
+ Data_Get_Struct(n, cmark_node, node);
342
+
343
+ return INT2NUM(cmark_node_get_list_start(node));
344
+ }
345
+
346
+ static VALUE
347
+ rb_node_set_list_start(VALUE self, VALUE n, VALUE s)
348
+ {
349
+ Check_Type(s, T_FIXNUM);
350
+
351
+ cmark_node *node;
352
+ Data_Get_Struct(n, cmark_node, node);
353
+ int start = FIX2INT(s);
354
+
355
+ return INT2NUM(cmark_node_set_list_start(node, start));
356
+ }
357
+
358
+
359
+ static VALUE
360
+ rb_node_get_list_tight(VALUE self, VALUE n)
361
+ {
362
+ cmark_node *node;
363
+ Data_Get_Struct(n, cmark_node, node);
364
+ int flag = cmark_node_get_list_tight(node);
365
+
366
+ return flag ? Qtrue : Qfalse;
367
+ }
368
+
369
+ static VALUE
370
+ rb_node_set_list_tight(VALUE self, VALUE n, VALUE t)
371
+ {
372
+ cmark_node *node;
373
+ Data_Get_Struct(n, cmark_node, node);
374
+ int tight = RTEST(t);
375
+
376
+ return INT2NUM(cmark_node_set_list_tight(node, tight));
377
+ }
378
+
379
+
380
+ static VALUE
381
+ rb_node_get_fence_info(VALUE self, VALUE n)
382
+ {
383
+ cmark_node *node;
384
+ Data_Get_Struct(n, cmark_node, node);
385
+
386
+ return rb_str_new2(cmark_node_get_fence_info(node));
387
+ }
388
+
389
+ static VALUE
390
+ rb_node_set_fence_info(VALUE self, VALUE n, VALUE s)
391
+ {
392
+ Check_Type(s, T_STRING);
393
+
394
+ cmark_node *node;
395
+ Data_Get_Struct(n, cmark_node, node);
396
+ char *text = (char *)RSTRING_PTR(s);
397
+
398
+ return INT2NUM(cmark_node_set_fence_info(node, text));
399
+ }
400
+
148
401
  __attribute__((visibility("default")))
149
402
  void Init_commonmarker()
150
403
  {
@@ -162,4 +415,24 @@ void Init_commonmarker()
162
415
  rb_define_singleton_method(rb_mCommonMark, "node_next", rb_node_next, 1);
163
416
  rb_define_singleton_method(rb_mCommonMark, "node_insert_before", rb_node_insert_before, 2);
164
417
  rb_define_singleton_method(rb_mCommonMark, "render_html", rb_render_html, 2);
418
+ rb_define_singleton_method(rb_mCommonMark, "node_insert_after", rb_node_insert_after, 2);
419
+ rb_define_singleton_method(rb_mCommonMark, "node_prepend_child", rb_node_prepend_child, 2);
420
+ rb_define_singleton_method(rb_mCommonMark, "node_append_child", rb_node_append_child, 2);
421
+ rb_define_singleton_method(rb_mCommonMark, "node_last_child", rb_node_last_child, 1);
422
+ rb_define_singleton_method(rb_mCommonMark, "node_parent", rb_node_parent, 1);
423
+ rb_define_singleton_method(rb_mCommonMark, "node_previous", rb_node_previous, 1);
424
+ rb_define_singleton_method(rb_mCommonMark, "node_get_url", rb_node_get_url, 1);
425
+ rb_define_singleton_method(rb_mCommonMark, "node_set_url", rb_node_set_url, 2);
426
+ rb_define_singleton_method(rb_mCommonMark, "node_get_title", rb_node_get_title, 1);
427
+ rb_define_singleton_method(rb_mCommonMark, "node_set_title", rb_node_set_title, 2);
428
+ rb_define_singleton_method(rb_mCommonMark, "node_get_header_level", rb_node_get_header_level, 1);
429
+ rb_define_singleton_method(rb_mCommonMark, "node_set_header_level", rb_node_set_header_level, 2);
430
+ rb_define_singleton_method(rb_mCommonMark, "node_get_list_type", rb_node_get_list_type, 1);
431
+ rb_define_singleton_method(rb_mCommonMark, "node_set_list_type", rb_node_set_list_type, 2);
432
+ rb_define_singleton_method(rb_mCommonMark, "node_get_list_start", rb_node_get_list_start, 1);
433
+ rb_define_singleton_method(rb_mCommonMark, "node_set_list_start", rb_node_set_list_start, 2);
434
+ rb_define_singleton_method(rb_mCommonMark, "node_get_list_tight", rb_node_get_list_tight, 1);
435
+ rb_define_singleton_method(rb_mCommonMark, "node_set_list_tight", rb_node_set_list_tight, 2);
436
+ rb_define_singleton_method(rb_mCommonMark, "node_get_fence_info", rb_node_get_fence_info, 1);
437
+ rb_define_singleton_method(rb_mCommonMark, "node_set_fence_info", rb_node_set_fence_info, 2);
165
438
  }
@@ -10,9 +10,11 @@ FileUtils.mkdir_p(CMARK_BUILD_DIR)
10
10
  Dir.chdir(CMARK_BUILD_DIR) do
11
11
  system 'cmake ..'
12
12
  system 'make'
13
+ # rake-compiler seems to complain about this line, not sure why it's messing with it
14
+ FileUtils.rm_rf(File.join(CMARK_BUILD_DIR, 'Testing', 'Temporary'))
13
15
  end
14
16
 
17
+ $LDFLAGS << " -Wl,-rpath,#{CMARK_BUILD_DIR}/src -L#{CMARK_BUILD_DIR}/src -lcmark"
15
18
  $CFLAGS << " -I#{CMARK_DIR}/src -I#{CMARK_BUILD_DIR}/src"
16
- $LOCAL_LIBS << "#{CMARK_BUILD_DIR}/src/libcmark.a"
17
19
 
18
20
  create_makefile('commonmarker/commonmarker')
data/lib/commonmarker.rb CHANGED
@@ -1,53 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'commonmarker/commonmarker'
3
3
  require 'commonmarker/config'
4
- require 'stringio'
5
- require 'cgi'
6
- require 'set'
7
- require 'uri'
8
-
9
- NODE_TYPES = [:none, :document, :blockquote, :list, :list_item,
10
- :code_block, :html, :paragraph,
11
- :header, :hrule, :text, :softbreak,
12
- :linebreak, :code, :inline_html,
13
- :emph, :strong, :link, :image]
14
- LIST_TYPES = [:no_list, :bullet_list, :ordered_list]
15
-
16
- # module CMark
17
-
18
- # attach_function :cmark_node_new, [:node_type], :node
19
- # attach_function :cmark_node_free, [:node], :void
20
- # attach_function :cmark_node_unlink, [:node], :void
21
- # attach_function :cmark_node_insert_before, [:node, :node], :int
22
- # attach_function :cmark_node_insert_after, [:node, :node], :int
23
- # attach_function :cmark_node_prepend_child, [:node, :node], :int
24
- # attach_function :cmark_node_append_child, [:node, :node], :int
25
- # attach_function :cmark_markdown_to_html, [:string, :int], :string
26
- # attach_function :cmark_render_html, [:node], :string
27
- # attach_function :cmark_parse_document, [:string, :int], :node
28
- # attach_function :cmark_node_first_child, [:node], :node
29
- # attach_function :cmark_node_last_child, [:node], :node
30
- # attach_function :cmark_node_parent, [:node], :node
31
- # attach_function :cmark_node_next, [:node], :node
32
- # attach_function :cmark_node_previous, [:node], :node
33
- # attach_function :cmark_node_get_type, [:node], :node_type
34
- # attach_function :cmark_node_get_literal, [:node], :string
35
- # attach_function :cmark_node_set_literal, [:node, :string], :int
36
- # attach_function :cmark_node_get_url, [:node], :string
37
- # attach_function :cmark_node_set_url, [:node, :string], :int
38
- # attach_function :cmark_node_get_title, [:node], :string
39
- # attach_function :cmark_node_set_title, [:node, :string], :int
40
- # attach_function :cmark_node_get_header_level, [:node], :int
41
- # attach_function :cmark_node_set_header_level, [:node, :int], :int
42
- # attach_function :cmark_node_get_list_type, [:node], :list_type
43
- # attach_function :cmark_node_set_list_type, [:node, :list_type], :int
44
- # attach_function :cmark_node_get_list_start, [:node], :int
45
- # attach_function :cmark_node_set_list_start, [:node, :int], :int
46
- # attach_function :cmark_node_get_list_tight, [:node], :bool
47
- # attach_function :cmark_node_set_list_tight, [:node, :bool], :int
48
- # attach_function :cmark_node_get_fence_info, [:node], :string
49
- # attach_function :cmark_node_set_fence_info, [:node, :string], :int
50
- # end
4
+ require 'commonmarker/renderer'
5
+ require 'commonmarker/renderer/html_renderer'
6
+
7
+ begin
8
+ require 'awesome_print'
9
+ rescue LoadError; end
10
+
11
+ NODE_TYPES = %i(none document blockquote list list_item
12
+ code_block html paragraph
13
+ header hrule text softbreak
14
+ linebreak code inline_html
15
+ emph strong link image)
16
+
17
+ LIST_TYPES = %i(no_list bullet_list ordered_list)
18
+
19
+ NONE_TYPE = 'NONE'
51
20
 
52
21
  module CommonMarker
53
22
  class NodeError < StandardError
@@ -63,18 +32,17 @@ module CommonMarker
63
32
  # Params:
64
33
  # +type+:: +node_type+ of the node to be created (nil if +pointer+ is used).
65
34
  # +pointer+:: pointer to C node (nil if +type+ is used).
66
- def initialize(type=nil, pointer=nil)
35
+ def initialize(type = nil, pointer = nil)
67
36
  if pointer
68
37
  @pointer = pointer
69
38
  else
70
39
  unless NODE_TYPES.include?(type)
71
- raise NodeError, "node type does not exist #{type}"
40
+ fail NodeError, "node type does not exist #{type}"
72
41
  end
73
42
  @pointer = CMark.node_new(type)
74
43
  end
75
- if @pointer.nil?
76
- raise NodeError, "could not create node of type #{type}"
77
- end
44
+
45
+ fail NodeError, "could not create node of type #{type}" if @pointer.nil?
78
46
  end
79
47
 
80
48
  # Parses a string into a :document Node. The
@@ -106,10 +74,22 @@ module CommonMarker
106
74
  Node.new(nil, CMark.node_last_child(@pointer))
107
75
  end
108
76
 
77
+ def parent
78
+ Node.new(nil, CMark.node_parent(@pointer))
79
+ end
80
+
81
+ def previous
82
+ Node.new(nil, CMark.node_previous(@pointer))
83
+ end
84
+
85
+ def next
86
+ Node.new(nil, CMark.node_next(@pointer))
87
+ end
88
+
109
89
  # Iterator over the children (if any) of this Node.
110
90
  def each_child
111
91
  childptr = CMark.node_first_child(@pointer)
112
- until CMark.node_get_type_string(childptr) == "NONE" do
92
+ until CMark.node_get_type_string(childptr) == NONE_TYPE
113
93
  nextptr = CMark.node_next(childptr)
114
94
  yield Node.new(nil, childptr)
115
95
  childptr = nextptr
@@ -128,31 +108,23 @@ module CommonMarker
128
108
  # +sibling+:: Sibling node to insert.
129
109
  def insert_before(sibling)
130
110
  res = CMark.node_insert_before(@pointer, sibling.pointer)
131
- if res == 0 then raise NodeError, "could not insert before" end
111
+ fail NodeError, 'could not insert before' if res == 0
132
112
  end
133
113
 
134
114
  # Insert a node after this Node.
135
115
  # Params:
136
116
  # +sibling+:: Sibling Node to insert.
137
117
  def insert_after(sibling)
138
- CMark.node_insert_before(@pointer, sibling.pointer)
139
- if res == 0 then raise NodeError, "could not insert after" end
118
+ res = CMark.node_insert_before(@pointer, sibling.pointer)
119
+ fail NodeError, 'could not insert after' if res == 0
140
120
  end
141
121
 
142
122
  # Prepend a child to this Node.
143
123
  # Params:
144
124
  # +child+:: Child Node to prepend.
145
125
  def prepend_child(child)
146
- CMark.node_prepend_child(@pointer, child.pointer)
147
- if res == 0 then raise NodeError, "could not prepend child" end
148
- end
149
-
150
- # Append a child to this Node.
151
- # Params:
152
- # +child+:: Child Node to append.
153
- def prepend_child(child)
154
- CMark.node_append_child(@pointer, child.pointer)
155
- if res == 0 then raise NodeError, "could not append child" end
126
+ res = CMark.node_prepend_child(@pointer, child.pointer)
127
+ fail NodeError, 'could not prepend child' if res == 0
156
128
  end
157
129
 
158
130
  # Returns string content of this Node.
@@ -165,14 +137,12 @@ module CommonMarker
165
137
  # +s+:: +String+ containing new content.
166
138
  def string_content=(s)
167
139
  res = CMark.node_set_string_content(@pointer, s)
168
- if res == 0 then raise NodeError, "could not set string content" end
140
+ fail NodeError, 'could not set string content' if res == 0
169
141
  end
170
142
 
171
143
  # Returns header level of this Node (must be a :header).
172
144
  def header_level
173
- if self.type != :header
174
- raise NodeError, "can't get header_level for non-header"
175
- end
145
+ fail NodeError, 'can\'t get header_level for non-header' unless type == :header
176
146
  CMark.node_get_header_level(@pointer)
177
147
  end
178
148
 
@@ -180,22 +150,18 @@ module CommonMarker
180
150
  # Params:
181
151
  # +level+:: New header level (+Integer+).
182
152
  def header_level=(level)
183
- if self.type != :header
184
- raise NodeError, "can't set header_level for non-header"
185
- end
186
- if !level.kind_of?(Integer) || level < 0 || level > 6
187
- raise NodeError, "level must be between 1-6"
153
+ fail NodeError, 'can\'t set header_level for non-header' unless type == :header
154
+ if !level.is_a?(Integer) || level < 0 || level > 6
155
+ fail NodeError, 'level must be between 1-6'
188
156
  end
189
157
  res = CMark.node_set_header_level(@pointer, level)
190
- if res == 0 then raise NodeError, "could not set header level" end
158
+ fail NodeError, 'could not set header level' if res == 0
191
159
  end
192
160
 
193
161
  # Returns list type of this Node (must be a :list).
194
162
  def list_type
195
- if self.type != :list
196
- raise NodeError, "can't get list_type for non-list"
197
- end
198
- CMark.node_get_list_type(@pointer)
163
+ fail NodeError, 'can\'t get list_type for non-list' unless type == :list
164
+ LIST_TYPES[CMark.node_get_list_type(@pointer)]
199
165
  end
200
166
 
201
167
  # Sets list type of this Node (must be a :list).
@@ -203,18 +169,16 @@ module CommonMarker
203
169
  # +list_type+:: New list type (+:list_type+), either
204
170
  # :ordered_list or :bullet_list.
205
171
  def list_type=(list_type)
206
- if self.type != :list
207
- raise NodeError, "can't set list_type for non-list"
208
- end
172
+ fail NodeError, 'can\'t set list_type for non-list' unless type == :list
209
173
  res = CMark.node_set_list_type(@pointer, list_type)
210
- if res == 0 then raise NodeError, "could not set list_type" end
174
+ fail NodeError, 'could not set list_type' if res == 0
211
175
  end
212
176
 
213
177
  # Returns start number of this Node (must be a :list of
214
178
  # list_type :ordered_list).
215
179
  def list_start
216
- if self.type != :list || self.list_type != :ordered_list
217
- raise NodeError, "can't get list_start for non-ordered list"
180
+ if type != :list || list_type != :ordered_list
181
+ fail NodeError, 'can\'t get list_start for non-ordered list'
218
182
  end
219
183
  CMark.node_get_list_start(@pointer)
220
184
  end
@@ -224,21 +188,17 @@ module CommonMarker
224
188
  # Params:
225
189
  # +start+:: New start number (+Integer+).
226
190
  def list_start=(start)
227
- if self.type != :list || self.list_type != :ordered_list
228
- raise NodeError, "can't set list_start for non-ordered list"
229
- end
230
- if !start.kind_of?(Integer)
231
- raise NodeError, "start must be Integer"
191
+ if type != :list || list_type != :ordered_list
192
+ fail NodeError, 'can\'t set list_start for non-ordered list'
232
193
  end
194
+ fail NodeError, 'start must be Integer' unless start.is_a?(Integer)
233
195
  res = CMark.node_set_list_start(@pointer, start)
234
- if res == 0 then raise NodeError, "could not set list_start" end
196
+ fail NodeError, 'could not set list_start' if res == 0
235
197
  end
236
198
 
237
199
  # Returns tight status of this Node (must be a :list).
238
200
  def list_tight
239
- if self.type != :list
240
- raise NodeError, "can't get list_tight for non-list"
241
- end
201
+ fail NodeError, 'can\'t get list_tight for non-list' unless type == :list
242
202
  CMark.node_get_list_tight(@pointer)
243
203
  end
244
204
 
@@ -246,18 +206,14 @@ module CommonMarker
246
206
  # Params:
247
207
  # +tight+:: New tight status (boolean).
248
208
  def list_tight=(tight)
249
- if self.type != :list
250
- raise NodeError, "can't set list_tight for non-list"
251
- end
209
+ fail NodeError, 'can\'t set list_tight for non-list' unless type == :list
252
210
  res = CMark.node_set_list_tight(@pointer, tight)
253
- if res == 0 then raise NodeError, "could not set list_tight" end
211
+ fail NodeError, 'could not set list_tight' if res == 0
254
212
  end
255
213
 
256
214
  # Returns URL of this Node (must be a :link or :image).
257
215
  def url
258
- if not (self.type == :link || self.type == :image)
259
- raise NodeError, "can't get URL for non-link or image"
260
- end
216
+ fail NodeError, 'can\'t get URL for non-link or image' if !(type == :link || type == :image)
261
217
  CMark.node_get_url(@pointer)
262
218
  end
263
219
 
@@ -265,23 +221,17 @@ module CommonMarker
265
221
  # Params:
266
222
  # +URL+:: New URL (+String+).
267
223
  def url=(url)
268
- if not (self.type == :link || self.type == :image)
269
- raise NodeError, "can't set URL for non-link or image"
270
- end
271
- if !url.kind_of?(String)
272
- raise NodeError, "url must be a String"
273
- end
224
+ fail NodeError, 'can\'t set URL for non-link or image' if !(type == :link || type == :image)
225
+ fail NodeError, 'url must be a String' unless url.is_a?(String)
274
226
  # Make our own copy so ruby won't garbage-collect it:
275
227
  c_url = FFI::MemoryPointer.from_string(url)
276
228
  res = CMark.node_set_url(@pointer, c_url)
277
- if res == 0 then raise NodeError, "could not set header level" end
229
+ fail NodeError, 'could not set header level' if res == 0
278
230
  end
279
231
 
280
232
  # Returns title of this Node (must be a :link or :image).
281
233
  def title
282
- if not (self.type == :link || self.type == :image)
283
- raise NodeError, "can't get title for non-link or image"
284
- end
234
+ fail NodeError, 'can\'t get title for non-link or image' if !(type == :link || type == :image)
285
235
  CMark.node_get_title(@pointer)
286
236
  end
287
237
 
@@ -289,23 +239,17 @@ module CommonMarker
289
239
  # Params:
290
240
  # +title+:: New title (+String+).
291
241
  def title=(title)
292
- if not (self.type == :link || self.type == :image)
293
- raise NodeError, "can't set title for non-link or image"
294
- end
295
- if !title.kind_of?(String)
296
- raise NodeError, "title must be a String"
297
- end
242
+ fail NodeError, 'can\'t set title for non-link or image' if !(type == :link || type == :image)
243
+ fail NodeError, 'title must be a String' unless title.is_a?(String)
298
244
  # Make our own copy so ruby won't garbage-collect it:
299
245
  c_title = FFI::MemoryPointer.from_string(title)
300
246
  res = CMark.node_set_title(@pointer, c_title)
301
- if res == 0 then raise NodeError, "could not set header level" end
247
+ fail NodeError, 'could not set header level' if res == 0
302
248
  end
303
249
 
304
250
  # Returns fence info of this Node (must be a :code_block).
305
251
  def fence_info
306
- if not (self.type == :code_block)
307
- raise NodeError, "can't get fence_info for non code_block"
308
- end
252
+ fail NodeError, 'can\'t get fence_info for non code_block' unless type == :code_block
309
253
  CMark.node_get_fence_info(@pointer)
310
254
  end
311
255
 
@@ -313,23 +257,19 @@ module CommonMarker
313
257
  # Params:
314
258
  # +info+:: New info (+String+).
315
259
  def fence_info=(info)
316
- if self.type != :code_block
317
- raise NodeError, "can't set fence_info for non code_block"
318
- end
319
- if !info.kind_of?(String)
320
- raise NodeError, "info must be a String"
321
- end
260
+ fail NodeError, 'can\'t set fence_info for non code_block' unless type == :code_block
261
+ fail NodeError, 'info must be a String' unless info.is_a?(String)
322
262
  # Make our own copy so ruby won't garbage-collect it:
323
263
  c_info = FFI::MemoryPointer.from_string(info)
324
264
  res = CMark.node_set_fence_info(@pointer, c_info)
325
- if res == 0 then raise NodeError, "could not set info" end
265
+ fail NodeError, 'could not set info' if res == 0
326
266
  end
327
267
 
328
268
  # An iterator that "walks the tree," descending into children
329
269
  # recursively.
330
270
  def walk(&blk)
331
271
  yield self
332
- self.each_child do |child|
272
+ each_child do |child|
333
273
  child.walk(&blk)
334
274
  end
335
275
  end
@@ -343,7 +283,6 @@ module CommonMarker
343
283
  CMark.node_get_type_string(@pointer)
344
284
  end
345
285
 
346
-
347
286
  # Convert to HTML using libcmark's fast (but uncustomizable) renderer.
348
287
  def to_html(option = :default)
349
288
  Config.option_exists?(option)
@@ -356,233 +295,4 @@ module CommonMarker
356
295
  # CMark.node_free(@pointer)
357
296
  end
358
297
  end
359
-
360
- class Renderer
361
- attr_accessor :in_tight, :warnings, :in_plain
362
- def initialize
363
- @stream = StringIO.new
364
- @need_blocksep = false
365
- @warnings = Set.new []
366
- @in_tight = false
367
- @in_plain = false
368
- end
369
-
370
- def out(*args)
371
- args.each do |arg|
372
- if arg == :children
373
- @node.each_child do |child|
374
- self.out(child)
375
- end
376
- elsif arg.kind_of?(Array)
377
- arg.each do |x|
378
- self.render(x)
379
- end
380
- elsif arg.kind_of?(Node)
381
- self.render(arg)
382
- else
383
- @stream.write(arg)
384
- end
385
- end
386
- end
387
-
388
- def render(node)
389
- @node = node
390
- if node.type == :document
391
- self.document(node)
392
- return @stream.string
393
- elsif self.in_plain && node.type != :text && node.type != :softbreak
394
- node.each_child do |child|
395
- render(child)
396
- end
397
- else
398
- begin
399
- self.send(node.type, node)
400
- rescue NoMethodError => e
401
- @warnings.add("WARNING: " + node.type.to_s + " not implemented.")
402
- raise e
403
- end
404
- end
405
- end
406
-
407
- def document(node)
408
- self.out(:children)
409
- end
410
-
411
- def code_block(node)
412
- self.code_block(node)
413
- end
414
-
415
- def reference_def(node)
416
- end
417
-
418
- def blocksep
419
- self.out("\n")
420
- end
421
-
422
- def containersep
423
- if !self.in_tight
424
- self.out("\n")
425
- end
426
- end
427
-
428
- def block(&blk)
429
- if @need_blocksep
430
- self.blocksep
431
- end
432
- blk.call
433
- @need_blocksep = true
434
- end
435
-
436
- def container(starter, ender, &blk)
437
- self.out(starter)
438
- self.containersep
439
- @need_blocksep = false
440
- blk.call
441
- self.containersep
442
- self.out(ender)
443
- end
444
-
445
- def plain(&blk)
446
- old_in_plain = @in_plain
447
- @in_plain = true
448
- blk.call
449
- @in_plain = old_in_plain
450
- end
451
- end
452
-
453
- class HtmlRenderer < Renderer
454
- def render(node)
455
- result = super(node)
456
- if node.type == :document
457
- result += "\n"
458
- end
459
- end
460
-
461
- def header(node)
462
- block do
463
- self.out("<h", node.header_level, ">", :children,
464
- "</h", node.header_level, ">")
465
- end
466
- end
467
-
468
- def paragraph(node)
469
- block do
470
- if self.in_tight
471
- self.out(:children)
472
- else
473
- self.out("<p>", :children, "</p>")
474
- end
475
- end
476
- end
477
-
478
- def list(node)
479
- old_in_tight = self.in_tight
480
- self.in_tight = node.list_tight
481
- block do
482
- if node.list_type == :bullet_list
483
- container("<ul>", "</ul>") do
484
- self.out(:children)
485
- end
486
- else
487
- start = node.list_start == 1 ? '' :
488
- (' start="' + node.list_start.to_s + '"')
489
- container(start, "</ol>") do
490
- self.out(:children)
491
- end
492
- end
493
- end
494
- self.in_tight = old_in_tight
495
- end
496
-
497
- def list_item(node)
498
- block do
499
- container("<li>", "</li>") do
500
- self.out(:children)
501
- end
502
- end
503
- end
504
-
505
- def blockquote(node)
506
- block do
507
- container("<blockquote>", "</blockquote>") do
508
- self.out(:children)
509
- end
510
- end
511
- end
512
-
513
- def hrule(node)
514
- block do
515
- self.out("<hr />")
516
- end
517
- end
518
-
519
- def code_block(node)
520
- block do
521
- self.out("<pre><code")
522
- if node.fence_info && node.fence_info.length > 0
523
- self.out(" class=\"language-", node.fence_info.split(/\s+/)[0], "\">")
524
- else
525
- self.out(">")
526
- end
527
- self.out(CGI.escapeHTML(node.string_content))
528
- self.out("</code></pre>")
529
- end
530
- end
531
-
532
- def html(node)
533
- block do
534
- self.out(node.string_content)
535
- end
536
- end
537
-
538
- def inline_html(node)
539
- self.out(node.string_content)
540
- end
541
-
542
- def emph(node)
543
- self.out("<em>", :children, "</em>")
544
- end
545
-
546
- def strong(node)
547
- self.out("<strong>", :children, "</strong>")
548
- end
549
-
550
- def link(node)
551
- self.out('<a href="', node.url.nil? ? '' : URI.escape(node.url), '"')
552
- if node.title && node.title.length > 0
553
- self.out(' title="', CGI.escapeHTML(node.title), '"')
554
- end
555
- self.out('>', :children, '</a>')
556
- end
557
-
558
- def image(node)
559
- self.out('<img src="', URI.escape(node.url), '"')
560
- if node.title && node.title.length > 0
561
- self.out(' title="', CGI.escapeHTML(node.title), '"')
562
- end
563
- plain do
564
- self.out(' alt="', :children, '" />')
565
- end
566
- end
567
-
568
- def text(node)
569
- self.out(CGI.escapeHTML(node.string_content))
570
- end
571
-
572
- def code(node)
573
- self.out("<code>")
574
- self.out(CGI.escapeHTML(node.string_content))
575
- self.out("</code>")
576
- end
577
-
578
- def linebreak(node)
579
- self.out("<br/>")
580
- self.softbreak(node)
581
- end
582
-
583
- def softbreak(node)
584
- self.out("\n")
585
- end
586
- end
587
-
588
298
  end