newstile 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. data/AUTHORS +1 -0
  2. data/CONTRIBUTERS +6 -0
  3. data/COPYING +24 -0
  4. data/ChangeLog +5489 -0
  5. data/GPL +674 -0
  6. data/README +31 -0
  7. data/Rakefile +342 -0
  8. data/VERSION +1 -0
  9. data/benchmark/benchmark.rb +34 -0
  10. data/benchmark/generate_data.rb +112 -0
  11. data/benchmark/historic-jruby-1.4.0.dat +7 -0
  12. data/benchmark/historic-ruby-1.8.6.dat +7 -0
  13. data/benchmark/historic-ruby-1.8.7.dat +7 -0
  14. data/benchmark/historic-ruby-1.9.1p243.dat +7 -0
  15. data/benchmark/historic-ruby-1.9.2dev.dat +7 -0
  16. data/benchmark/mdbasics.text +306 -0
  17. data/benchmark/mdsyntax.text +888 -0
  18. data/benchmark/static-jruby-1.4.0.dat +7 -0
  19. data/benchmark/static-ruby-1.8.6.dat +7 -0
  20. data/benchmark/static-ruby-1.8.7.dat +7 -0
  21. data/benchmark/static-ruby-1.9.1p243.dat +7 -0
  22. data/benchmark/static-ruby-1.9.2dev.dat +7 -0
  23. data/benchmark/testing.sh +9 -0
  24. data/benchmark/timing.sh +10 -0
  25. data/bin/newstile +82 -0
  26. data/data/newstile/document.html +18 -0
  27. data/data/newstile/document.latex +43 -0
  28. data/doc/default.scss.css +519 -0
  29. data/doc/default.template +80 -0
  30. data/doc/documentation.page +72 -0
  31. data/doc/index.page +96 -0
  32. data/doc/installation.page +90 -0
  33. data/doc/links.markdown +6 -0
  34. data/doc/news.feed +10 -0
  35. data/doc/news.page +28 -0
  36. data/doc/quickref.page +564 -0
  37. data/doc/syntax.page +1615 -0
  38. data/doc/tests.page +51 -0
  39. data/doc/virtual +2 -0
  40. data/lib/newstile.rb +23 -0
  41. data/lib/newstile/compatibility.rb +34 -0
  42. data/lib/newstile/converter.rb +43 -0
  43. data/lib/newstile/converter/base.rb +111 -0
  44. data/lib/newstile/converter/html.rb +405 -0
  45. data/lib/newstile/converter/latex.rb +577 -0
  46. data/lib/newstile/converter/markdown.rb +426 -0
  47. data/lib/newstile/converter/newstile.rb +426 -0
  48. data/lib/newstile/document.rb +168 -0
  49. data/lib/newstile/error.rb +27 -0
  50. data/lib/newstile/options.rb +296 -0
  51. data/lib/newstile/parser.rb +39 -0
  52. data/lib/newstile/parser/base.rb +94 -0
  53. data/lib/newstile/parser/html.rb +499 -0
  54. data/lib/newstile/parser/newstile.rb +325 -0
  55. data/lib/newstile/parser/newstile/abbreviation.rb +66 -0
  56. data/lib/newstile/parser/newstile/attribute_list.rb +111 -0
  57. data/lib/newstile/parser/newstile/autolink.rb +54 -0
  58. data/lib/newstile/parser/newstile/blank_line.rb +43 -0
  59. data/lib/newstile/parser/newstile/block_boundary.rb +46 -0
  60. data/lib/newstile/parser/newstile/blockquote.rb +63 -0
  61. data/lib/newstile/parser/newstile/codeblock.rb +60 -0
  62. data/lib/newstile/parser/newstile/codespan.rb +57 -0
  63. data/lib/newstile/parser/newstile/emphasis.rb +70 -0
  64. data/lib/newstile/parser/newstile/eob.rb +39 -0
  65. data/lib/newstile/parser/newstile/escaped_chars.rb +38 -0
  66. data/lib/newstile/parser/newstile/extension.rb +116 -0
  67. data/lib/newstile/parser/newstile/footnote.rb +74 -0
  68. data/lib/newstile/parser/newstile/header.rb +84 -0
  69. data/lib/newstile/parser/newstile/horizontal_rule.rb +39 -0
  70. data/lib/newstile/parser/newstile/html.rb +175 -0
  71. data/lib/newstile/parser/newstile/html_entity.rb +39 -0
  72. data/lib/newstile/parser/newstile/line_break.rb +38 -0
  73. data/lib/newstile/parser/newstile/link.rb +177 -0
  74. data/lib/newstile/parser/newstile/list.rb +239 -0
  75. data/lib/newstile/parser/newstile/math.rb +64 -0
  76. data/lib/newstile/parser/newstile/paragraph.rb +55 -0
  77. data/lib/newstile/parser/newstile/smart_quotes.rb +214 -0
  78. data/lib/newstile/parser/newstile/table.rb +134 -0
  79. data/lib/newstile/parser/newstile/typographic_symbol.rb +54 -0
  80. data/lib/newstile/utils.rb +37 -0
  81. data/lib/newstile/utils/entities.rb +336 -0
  82. data/lib/newstile/utils/html.rb +75 -0
  83. data/lib/newstile/utils/ordered_hash.rb +79 -0
  84. data/lib/newstile/version.rb +28 -0
  85. data/man/man1/newstile.1 +246 -0
  86. data/setup.rb +1585 -0
  87. data/test/run_tests.rb +59 -0
  88. data/test/test_files.rb +162 -0
  89. data/test/testcases/block/01_blank_line/spaces.html +1 -0
  90. data/test/testcases/block/01_blank_line/spaces.text +3 -0
  91. data/test/testcases/block/01_blank_line/tabs.html +1 -0
  92. data/test/testcases/block/01_blank_line/tabs.text +6 -0
  93. data/test/testcases/block/02_eob/beginning.html +1 -0
  94. data/test/testcases/block/02_eob/beginning.text +3 -0
  95. data/test/testcases/block/02_eob/end.html +1 -0
  96. data/test/testcases/block/02_eob/end.text +3 -0
  97. data/test/testcases/block/02_eob/middle.html +1 -0
  98. data/test/testcases/block/02_eob/middle.text +5 -0
  99. data/test/testcases/block/03_paragraph/indented.html +18 -0
  100. data/test/testcases/block/03_paragraph/indented.text +19 -0
  101. data/test/testcases/block/03_paragraph/no_newline_at_end.html +5 -0
  102. data/test/testcases/block/03_paragraph/no_newline_at_end.text +5 -0
  103. data/test/testcases/block/03_paragraph/one_para.html +1 -0
  104. data/test/testcases/block/03_paragraph/one_para.text +1 -0
  105. data/test/testcases/block/03_paragraph/two_para.html +4 -0
  106. data/test/testcases/block/03_paragraph/two_para.text +4 -0
  107. data/test/testcases/block/04_header/atx_header.html +37 -0
  108. data/test/testcases/block/04_header/atx_header.text +34 -0
  109. data/test/testcases/block/04_header/atx_header_no_newline_at_end.html +1 -0
  110. data/test/testcases/block/04_header/atx_header_no_newline_at_end.text +1 -0
  111. data/test/testcases/block/04_header/setext_header.html +30 -0
  112. data/test/testcases/block/04_header/setext_header.html.19 +30 -0
  113. data/test/testcases/block/04_header/setext_header.text +36 -0
  114. data/test/testcases/block/04_header/setext_header_no_newline_at_end.html +1 -0
  115. data/test/testcases/block/04_header/setext_header_no_newline_at_end.text +2 -0
  116. data/test/testcases/block/04_header/with_auto_id_prefix.html +3 -0
  117. data/test/testcases/block/04_header/with_auto_id_prefix.options +2 -0
  118. data/test/testcases/block/04_header/with_auto_id_prefix.text +3 -0
  119. data/test/testcases/block/04_header/with_auto_ids.html +17 -0
  120. data/test/testcases/block/04_header/with_auto_ids.options +1 -0
  121. data/test/testcases/block/04_header/with_auto_ids.text +19 -0
  122. data/test/testcases/block/05_blockquote/indented.html +25 -0
  123. data/test/testcases/block/05_blockquote/indented.text +14 -0
  124. data/test/testcases/block/05_blockquote/lazy.html +34 -0
  125. data/test/testcases/block/05_blockquote/lazy.text +20 -0
  126. data/test/testcases/block/05_blockquote/nested.html +10 -0
  127. data/test/testcases/block/05_blockquote/nested.text +6 -0
  128. data/test/testcases/block/05_blockquote/no_newline_at_end.html +4 -0
  129. data/test/testcases/block/05_blockquote/no_newline_at_end.text +2 -0
  130. data/test/testcases/block/05_blockquote/with_code_blocks.html +15 -0
  131. data/test/testcases/block/05_blockquote/with_code_blocks.text +11 -0
  132. data/test/testcases/block/06_codeblock/error.html +4 -0
  133. data/test/testcases/block/06_codeblock/error.text +4 -0
  134. data/test/testcases/block/06_codeblock/lazy.html +4 -0
  135. data/test/testcases/block/06_codeblock/lazy.text +5 -0
  136. data/test/testcases/block/06_codeblock/no_newline_at_end.html +2 -0
  137. data/test/testcases/block/06_codeblock/no_newline_at_end.text +1 -0
  138. data/test/testcases/block/06_codeblock/no_newline_at_end_1.html +2 -0
  139. data/test/testcases/block/06_codeblock/no_newline_at_end_1.text +2 -0
  140. data/test/testcases/block/06_codeblock/normal.html +13 -0
  141. data/test/testcases/block/06_codeblock/normal.text +10 -0
  142. data/test/testcases/block/06_codeblock/tilde_syntax.html +7 -0
  143. data/test/testcases/block/06_codeblock/tilde_syntax.text +9 -0
  144. data/test/testcases/block/06_codeblock/whitespace.html +3 -0
  145. data/test/testcases/block/06_codeblock/whitespace.text +3 -0
  146. data/test/testcases/block/06_codeblock/with_blank_line.html +13 -0
  147. data/test/testcases/block/06_codeblock/with_blank_line.text +12 -0
  148. data/test/testcases/block/06_codeblock/with_eob_marker.html +6 -0
  149. data/test/testcases/block/06_codeblock/with_eob_marker.text +5 -0
  150. data/test/testcases/block/06_codeblock/with_ial.html +6 -0
  151. data/test/testcases/block/06_codeblock/with_ial.text +5 -0
  152. data/test/testcases/block/07_horizontal_rule/error.html +7 -0
  153. data/test/testcases/block/07_horizontal_rule/error.html.19 +7 -0
  154. data/test/testcases/block/07_horizontal_rule/error.text +7 -0
  155. data/test/testcases/block/07_horizontal_rule/normal.html +17 -0
  156. data/test/testcases/block/07_horizontal_rule/normal.text +17 -0
  157. data/test/testcases/block/07_horizontal_rule/sepspaces.html +3 -0
  158. data/test/testcases/block/07_horizontal_rule/sepspaces.text +3 -0
  159. data/test/testcases/block/07_horizontal_rule/septabs.html +3 -0
  160. data/test/testcases/block/07_horizontal_rule/septabs.text +3 -0
  161. data/test/testcases/block/08_list/escaping.html +17 -0
  162. data/test/testcases/block/08_list/escaping.text +17 -0
  163. data/test/testcases/block/08_list/item_ial.html +7 -0
  164. data/test/testcases/block/08_list/item_ial.text +5 -0
  165. data/test/testcases/block/08_list/lazy.html +39 -0
  166. data/test/testcases/block/08_list/lazy.text +29 -0
  167. data/test/testcases/block/08_list/list_and_hr.html +9 -0
  168. data/test/testcases/block/08_list/list_and_hr.text +5 -0
  169. data/test/testcases/block/08_list/list_and_others.html +40 -0
  170. data/test/testcases/block/08_list/list_and_others.text +26 -0
  171. data/test/testcases/block/08_list/mixed.html +117 -0
  172. data/test/testcases/block/08_list/mixed.text +66 -0
  173. data/test/testcases/block/08_list/nested.html +17 -0
  174. data/test/testcases/block/08_list/nested.text +7 -0
  175. data/test/testcases/block/08_list/other_first_element.html +39 -0
  176. data/test/testcases/block/08_list/other_first_element.text +18 -0
  177. data/test/testcases/block/08_list/simple_ol.html +19 -0
  178. data/test/testcases/block/08_list/simple_ol.text +13 -0
  179. data/test/testcases/block/08_list/simple_ul.html +48 -0
  180. data/test/testcases/block/08_list/simple_ul.text +36 -0
  181. data/test/testcases/block/08_list/single_item.html +3 -0
  182. data/test/testcases/block/08_list/single_item.text +1 -0
  183. data/test/testcases/block/08_list/special_cases.html +55 -0
  184. data/test/testcases/block/08_list/special_cases.text +35 -0
  185. data/test/testcases/block/09_html/comment.html +18 -0
  186. data/test/testcases/block/09_html/comment.text +15 -0
  187. data/test/testcases/block/09_html/content_model/deflists.html +6 -0
  188. data/test/testcases/block/09_html/content_model/deflists.options +1 -0
  189. data/test/testcases/block/09_html/content_model/deflists.text +6 -0
  190. data/test/testcases/block/09_html/content_model/tables.html +14 -0
  191. data/test/testcases/block/09_html/content_model/tables.options +1 -0
  192. data/test/testcases/block/09_html/content_model/tables.text +14 -0
  193. data/test/testcases/block/09_html/html_and_codeblocks.html +15 -0
  194. data/test/testcases/block/09_html/html_and_codeblocks.options +1 -0
  195. data/test/testcases/block/09_html/html_and_codeblocks.text +13 -0
  196. data/test/testcases/block/09_html/html_to_native/code.html +10 -0
  197. data/test/testcases/block/09_html/html_to_native/code.text +9 -0
  198. data/test/testcases/block/09_html/html_to_native/comment.html +7 -0
  199. data/test/testcases/block/09_html/html_to_native/comment.text +8 -0
  200. data/test/testcases/block/09_html/html_to_native/emphasis.html +3 -0
  201. data/test/testcases/block/09_html/html_to_native/emphasis.text +3 -0
  202. data/test/testcases/block/09_html/html_to_native/entity.html +1 -0
  203. data/test/testcases/block/09_html/html_to_native/entity.text +1 -0
  204. data/test/testcases/block/09_html/html_to_native/header.html +6 -0
  205. data/test/testcases/block/09_html/html_to_native/header.options +2 -0
  206. data/test/testcases/block/09_html/html_to_native/header.text +6 -0
  207. data/test/testcases/block/09_html/html_to_native/list_dl.html +8 -0
  208. data/test/testcases/block/09_html/html_to_native/list_dl.text +8 -0
  209. data/test/testcases/block/09_html/html_to_native/list_ol.html +15 -0
  210. data/test/testcases/block/09_html/html_to_native/list_ol.text +17 -0
  211. data/test/testcases/block/09_html/html_to_native/list_ul.html +19 -0
  212. data/test/testcases/block/09_html/html_to_native/list_ul.text +22 -0
  213. data/test/testcases/block/09_html/html_to_native/options +1 -0
  214. data/test/testcases/block/09_html/html_to_native/paragraph.html +3 -0
  215. data/test/testcases/block/09_html/html_to_native/paragraph.text +4 -0
  216. data/test/testcases/block/09_html/html_to_native/table_normal.html +14 -0
  217. data/test/testcases/block/09_html/html_to_native/table_normal.text +12 -0
  218. data/test/testcases/block/09_html/html_to_native/table_simple.html +48 -0
  219. data/test/testcases/block/09_html/html_to_native/table_simple.text +56 -0
  220. data/test/testcases/block/09_html/html_to_native/typography.html +1 -0
  221. data/test/testcases/block/09_html/html_to_native/typography.html.19 +1 -0
  222. data/test/testcases/block/09_html/html_to_native/typography.text +1 -0
  223. data/test/testcases/block/09_html/invalid_html_1.html +5 -0
  224. data/test/testcases/block/09_html/invalid_html_1.text +5 -0
  225. data/test/testcases/block/09_html/invalid_html_2.html +5 -0
  226. data/test/testcases/block/09_html/invalid_html_2.text +5 -0
  227. data/test/testcases/block/09_html/markdown_attr.html +38 -0
  228. data/test/testcases/block/09_html/markdown_attr.text +38 -0
  229. data/test/testcases/block/09_html/not_parsed.html +24 -0
  230. data/test/testcases/block/09_html/not_parsed.text +24 -0
  231. data/test/testcases/block/09_html/parse_as_raw.html +30 -0
  232. data/test/testcases/block/09_html/parse_as_raw.options +1 -0
  233. data/test/testcases/block/09_html/parse_as_raw.text +29 -0
  234. data/test/testcases/block/09_html/parse_as_span.html +12 -0
  235. data/test/testcases/block/09_html/parse_as_span.options +1 -0
  236. data/test/testcases/block/09_html/parse_as_span.text +9 -0
  237. data/test/testcases/block/09_html/parse_block_html.html +21 -0
  238. data/test/testcases/block/09_html/parse_block_html.options +1 -0
  239. data/test/testcases/block/09_html/parse_block_html.text +17 -0
  240. data/test/testcases/block/09_html/processing_instruction.html +13 -0
  241. data/test/testcases/block/09_html/processing_instruction.text +12 -0
  242. data/test/testcases/block/09_html/simple.html +64 -0
  243. data/test/testcases/block/09_html/simple.html.19 +64 -0
  244. data/test/testcases/block/09_html/simple.options +1 -0
  245. data/test/testcases/block/09_html/simple.text +59 -0
  246. data/test/testcases/block/10_ald/simple.html +2 -0
  247. data/test/testcases/block/10_ald/simple.text +8 -0
  248. data/test/testcases/block/11_ial/auto_id_and_ial.html +1 -0
  249. data/test/testcases/block/11_ial/auto_id_and_ial.options +1 -0
  250. data/test/testcases/block/11_ial/auto_id_and_ial.text +2 -0
  251. data/test/testcases/block/11_ial/simple.html +25 -0
  252. data/test/testcases/block/11_ial/simple.text +34 -0
  253. data/test/testcases/block/12_extension/comment.html +8 -0
  254. data/test/testcases/block/12_extension/comment.text +12 -0
  255. data/test/testcases/block/12_extension/ignored.html +8 -0
  256. data/test/testcases/block/12_extension/ignored.text +8 -0
  257. data/test/testcases/block/12_extension/nomarkdown.html +10 -0
  258. data/test/testcases/block/12_extension/nomarkdown.kramdown +20 -0
  259. data/test/testcases/block/12_extension/nomarkdown.latex +13 -0
  260. data/test/testcases/block/12_extension/nomarkdown.text +21 -0
  261. data/test/testcases/block/12_extension/options.html +21 -0
  262. data/test/testcases/block/12_extension/options.text +21 -0
  263. data/test/testcases/block/12_extension/options2.html +10 -0
  264. data/test/testcases/block/12_extension/options2.text +5 -0
  265. data/test/testcases/block/12_extension/options3.html +7 -0
  266. data/test/testcases/block/12_extension/options3.text +7 -0
  267. data/test/testcases/block/13_definition_list/definition_at_beginning.html +1 -0
  268. data/test/testcases/block/13_definition_list/definition_at_beginning.text +1 -0
  269. data/test/testcases/block/13_definition_list/item_ial.html +12 -0
  270. data/test/testcases/block/13_definition_list/item_ial.text +8 -0
  271. data/test/testcases/block/13_definition_list/multiple_terms.html +13 -0
  272. data/test/testcases/block/13_definition_list/multiple_terms.text +10 -0
  273. data/test/testcases/block/13_definition_list/no_def_list.html +2 -0
  274. data/test/testcases/block/13_definition_list/no_def_list.text +2 -0
  275. data/test/testcases/block/13_definition_list/para_wrapping.html +10 -0
  276. data/test/testcases/block/13_definition_list/para_wrapping.text +6 -0
  277. data/test/testcases/block/13_definition_list/separated_by_eob.html +8 -0
  278. data/test/testcases/block/13_definition_list/separated_by_eob.text +5 -0
  279. data/test/testcases/block/13_definition_list/simple.html +8 -0
  280. data/test/testcases/block/13_definition_list/simple.text +7 -0
  281. data/test/testcases/block/13_definition_list/styled_terms.html +4 -0
  282. data/test/testcases/block/13_definition_list/styled_terms.text +2 -0
  283. data/test/testcases/block/13_definition_list/too_much_space.html +3 -0
  284. data/test/testcases/block/13_definition_list/too_much_space.text +4 -0
  285. data/test/testcases/block/13_definition_list/with_blocks.html +38 -0
  286. data/test/testcases/block/13_definition_list/with_blocks.text +24 -0
  287. data/test/testcases/block/14_table/errors.html +8 -0
  288. data/test/testcases/block/14_table/errors.text +9 -0
  289. data/test/testcases/block/14_table/footer.html +65 -0
  290. data/test/testcases/block/14_table/footer.text +25 -0
  291. data/test/testcases/block/14_table/header.html +103 -0
  292. data/test/testcases/block/14_table/header.text +32 -0
  293. data/test/testcases/block/14_table/no_table.html +3 -0
  294. data/test/testcases/block/14_table/no_table.text +3 -0
  295. data/test/testcases/block/14_table/simple.html +139 -0
  296. data/test/testcases/block/14_table/simple.text +38 -0
  297. data/test/testcases/block/15_math/normal.html +26 -0
  298. data/test/testcases/block/15_math/normal.text +28 -0
  299. data/test/testcases/block/16_toc/no_toc_depth.html +33 -0
  300. data/test/testcases/block/16_toc/no_toc_depth.options +1 -0
  301. data/test/testcases/block/16_toc/no_toc_depth.text +16 -0
  302. data/test/testcases/block/16_toc/toc_depth_2.html +24 -0
  303. data/test/testcases/block/16_toc/toc_depth_2.options +1 -0
  304. data/test/testcases/block/16_toc/toc_depth_2.text +16 -0
  305. data/test/testcases/encoding.html +46 -0
  306. data/test/testcases/encoding.text +28 -0
  307. data/test/testcases/span/01_link/empty.html +5 -0
  308. data/test/testcases/span/01_link/empty.text +5 -0
  309. data/test/testcases/span/01_link/image_in_a.html +5 -0
  310. data/test/testcases/span/01_link/image_in_a.text +5 -0
  311. data/test/testcases/span/01_link/imagelinks.html +14 -0
  312. data/test/testcases/span/01_link/imagelinks.text +16 -0
  313. data/test/testcases/span/01_link/inline.html +46 -0
  314. data/test/testcases/span/01_link/inline.html.19 +46 -0
  315. data/test/testcases/span/01_link/inline.text +48 -0
  316. data/test/testcases/span/01_link/link_defs.html +9 -0
  317. data/test/testcases/span/01_link/link_defs.text +26 -0
  318. data/test/testcases/span/01_link/links_with_angle_brackets.html +3 -0
  319. data/test/testcases/span/01_link/links_with_angle_brackets.text +3 -0
  320. data/test/testcases/span/01_link/reference.html +35 -0
  321. data/test/testcases/span/01_link/reference.html.19 +35 -0
  322. data/test/testcases/span/01_link/reference.text +47 -0
  323. data/test/testcases/span/02_emphasis/empty.html +3 -0
  324. data/test/testcases/span/02_emphasis/empty.text +3 -0
  325. data/test/testcases/span/02_emphasis/errors.html +9 -0
  326. data/test/testcases/span/02_emphasis/errors.text +9 -0
  327. data/test/testcases/span/02_emphasis/nesting.html +38 -0
  328. data/test/testcases/span/02_emphasis/nesting.text +33 -0
  329. data/test/testcases/span/02_emphasis/normal.html +46 -0
  330. data/test/testcases/span/02_emphasis/normal.text +46 -0
  331. data/test/testcases/span/03_codespan/empty.html +5 -0
  332. data/test/testcases/span/03_codespan/empty.text +5 -0
  333. data/test/testcases/span/03_codespan/errors.html +1 -0
  334. data/test/testcases/span/03_codespan/errors.text +1 -0
  335. data/test/testcases/span/03_codespan/highlighting.html +1 -0
  336. data/test/testcases/span/03_codespan/highlighting.text +1 -0
  337. data/test/testcases/span/03_codespan/normal.html +16 -0
  338. data/test/testcases/span/03_codespan/normal.text +16 -0
  339. data/test/testcases/span/04_footnote/definitions.html +17 -0
  340. data/test/testcases/span/04_footnote/definitions.latex +17 -0
  341. data/test/testcases/span/04_footnote/definitions.text +24 -0
  342. data/test/testcases/span/04_footnote/footnote_nr.html +12 -0
  343. data/test/testcases/span/04_footnote/footnote_nr.latex +2 -0
  344. data/test/testcases/span/04_footnote/footnote_nr.options +1 -0
  345. data/test/testcases/span/04_footnote/footnote_nr.text +4 -0
  346. data/test/testcases/span/04_footnote/markers.html +46 -0
  347. data/test/testcases/span/04_footnote/markers.latex +23 -0
  348. data/test/testcases/span/04_footnote/markers.text +26 -0
  349. data/test/testcases/span/05_html/across_lines.html +1 -0
  350. data/test/testcases/span/05_html/across_lines.text +2 -0
  351. data/test/testcases/span/05_html/invalid.html +1 -0
  352. data/test/testcases/span/05_html/invalid.text +1 -0
  353. data/test/testcases/span/05_html/link_with_mailto.html +1 -0
  354. data/test/testcases/span/05_html/link_with_mailto.text +1 -0
  355. data/test/testcases/span/05_html/markdown_attr.html +6 -0
  356. data/test/testcases/span/05_html/markdown_attr.text +6 -0
  357. data/test/testcases/span/05_html/normal.html +30 -0
  358. data/test/testcases/span/05_html/normal.text +30 -0
  359. data/test/testcases/span/abbreviations/abbrev.html +8 -0
  360. data/test/testcases/span/abbreviations/abbrev.text +15 -0
  361. data/test/testcases/span/abbreviations/abbrev_defs.html +2 -0
  362. data/test/testcases/span/abbreviations/abbrev_defs.text +5 -0
  363. data/test/testcases/span/autolinks/url_links.html +12 -0
  364. data/test/testcases/span/autolinks/url_links.text +12 -0
  365. data/test/testcases/span/escaped_chars/normal.html +43 -0
  366. data/test/testcases/span/escaped_chars/normal.text +43 -0
  367. data/test/testcases/span/extension/comment.html +6 -0
  368. data/test/testcases/span/extension/comment.text +6 -0
  369. data/test/testcases/span/extension/ignored.html +1 -0
  370. data/test/testcases/span/extension/ignored.text +1 -0
  371. data/test/testcases/span/extension/nomarkdown.html +1 -0
  372. data/test/testcases/span/extension/nomarkdown.text +1 -0
  373. data/test/testcases/span/extension/options.html +1 -0
  374. data/test/testcases/span/extension/options.text +1 -0
  375. data/test/testcases/span/ial/simple.html +6 -0
  376. data/test/testcases/span/ial/simple.text +6 -0
  377. data/test/testcases/span/line_breaks/normal.html +11 -0
  378. data/test/testcases/span/line_breaks/normal.latex +12 -0
  379. data/test/testcases/span/line_breaks/normal.text +11 -0
  380. data/test/testcases/span/math/normal.html +5 -0
  381. data/test/testcases/span/math/normal.text +5 -0
  382. data/test/testcases/span/text_substitutions/entities.html +4 -0
  383. data/test/testcases/span/text_substitutions/entities.options +1 -0
  384. data/test/testcases/span/text_substitutions/entities.text +4 -0
  385. data/test/testcases/span/text_substitutions/entities_as_char.html +1 -0
  386. data/test/testcases/span/text_substitutions/entities_as_char.html.19 +1 -0
  387. data/test/testcases/span/text_substitutions/entities_as_char.options +1 -0
  388. data/test/testcases/span/text_substitutions/entities_as_char.text +1 -0
  389. data/test/testcases/span/text_substitutions/entities_as_input.html +1 -0
  390. data/test/testcases/span/text_substitutions/entities_as_input.options +1 -0
  391. data/test/testcases/span/text_substitutions/entities_as_input.text +1 -0
  392. data/test/testcases/span/text_substitutions/entities_numeric.html +1 -0
  393. data/test/testcases/span/text_substitutions/entities_numeric.options +1 -0
  394. data/test/testcases/span/text_substitutions/entities_numeric.text +1 -0
  395. data/test/testcases/span/text_substitutions/entities_symbolic.html +1 -0
  396. data/test/testcases/span/text_substitutions/entities_symbolic.options +1 -0
  397. data/test/testcases/span/text_substitutions/entities_symbolic.text +1 -0
  398. data/test/testcases/span/text_substitutions/greaterthan.html +1 -0
  399. data/test/testcases/span/text_substitutions/greaterthan.text +1 -0
  400. data/test/testcases/span/text_substitutions/lowerthan.html +1 -0
  401. data/test/testcases/span/text_substitutions/lowerthan.text +1 -0
  402. data/test/testcases/span/text_substitutions/typography.html +18 -0
  403. data/test/testcases/span/text_substitutions/typography.html.19 +18 -0
  404. data/test/testcases/span/text_substitutions/typography.text +18 -0
  405. metadata +476 -0
@@ -0,0 +1,325 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of newstile.
7
+ #
8
+ # newstile is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ #++
21
+ #
22
+
23
+ require 'strscan'
24
+ require 'stringio'
25
+
26
+ #TODO: use [[:alpha:]] in all regexp to allow parsing of international values in 1.9.1
27
+ #NOTE: use @src.pre_match only before other check/match?/... operations, otherwise the content is changed
28
+
29
+ module Newstile
30
+
31
+ module Parser
32
+
33
+ # Used for parsing a document in newstile format.
34
+ #
35
+ # If you want to extend the functionality of the parser, you need to the following:
36
+ #
37
+ # * Create a new subclass
38
+ # * add the needed parser methods
39
+ # * modify the @block_parsers and @span_parsers variables and add the names of your parser
40
+ # methods
41
+ #
42
+ # Here is a small example for an extended parser class that parses ERB style tags as raw text if
43
+ # they are used as span level elements (an equivalent block level parser should probably also be
44
+ # made to handle the block case):
45
+ #
46
+ # require 'newstile/parser/newstile'
47
+ #
48
+ # class Newstile::Parser::ERBNewstile < Kramdown::Parser::Kramdown
49
+ #
50
+ # def initialize(doc)
51
+ # super(doc)
52
+ # @span_parsers.unshift(:erb_tags)
53
+ # end
54
+ #
55
+ # ERB_TAGS_START = /<%.*?%>/
56
+ #
57
+ # def parse_erb_tags
58
+ # @src.pos += @src.matched_size
59
+ # @tree.children << Element.new(:raw, @src.matched)
60
+ # end
61
+ # define_parser(:erb_tags, ERB_TAGS_START, '<%')
62
+ #
63
+ # end
64
+ #
65
+ # The new parser can be used like this:
66
+ #
67
+ # require 'newstile/document'
68
+ # # require the file with the above parser class
69
+ #
70
+ # Newstile::Document.new(input_text, :input => 'ERBNewstile').to_html
71
+ #
72
+ class Newstile < Base
73
+
74
+ include ::Newstile
75
+
76
+ attr_reader :tree
77
+ attr_reader :doc
78
+ attr_reader :options
79
+
80
+ # Create a new Newstile parser object for the Newstile::Document +doc+.
81
+ def initialize(doc)
82
+ super(doc)
83
+
84
+ @src = nil
85
+ @tree = nil
86
+ @stack = []
87
+ @text_type = :raw_text
88
+ @block_ial = nil
89
+
90
+ @doc.parse_infos[:ald] = {}
91
+ @doc.parse_infos[:link_defs] = {}
92
+ @doc.parse_infos[:abbrev_defs] = {}
93
+ @doc.parse_infos[:footnotes] = {}
94
+
95
+ @block_parsers = [:blank_line, :codeblock, :codeblock_fenced, :blockquote, :summary, :table, :atx_header,
96
+ :setext_header,
97
+ :newstile_header,
98
+ :horizontal_rule, :list, :definition_list, :link_definition, :block_html,
99
+ :footnote_definition, :abbrev_definition, :ald, :block_math,
100
+ :block_extension, :block_ial, :eob_marker, :paragraph]
101
+ @span_parsers = [
102
+ :emphasis, :codespan, :autolink, :span_html, :footnote_marker, :link,
103
+ :newstile_link,
104
+ :smart_quotes,
105
+ :inline_math,
106
+ :span_extension, :span_ial, :html_entity, :typographic_syms, :line_break, :escaped_chars]
107
+
108
+ end
109
+ private_class_method(:new, :allocate)
110
+
111
+
112
+ # The source string provided on initialization is parsed and the created +tree+ is returned.
113
+ def parse(source)
114
+ configure_parser
115
+ tree = Element.new(:root)
116
+ parse_blocks(tree, adapt_source(source))
117
+ update_tree(tree)
118
+ replace_abbreviations(tree)
119
+ @doc.parse_infos[:footnotes].each do |name, data|
120
+ update_tree(data[:content])
121
+ end
122
+ tree
123
+ end
124
+
125
+ #######
126
+ protected
127
+ #######
128
+
129
+ # Adapt the object to allow parsing like specified in the options.
130
+ def configure_parser
131
+ @parsers = {}
132
+ (@block_parsers + @span_parsers).each do |name|
133
+ if self.class.has_parser?(name)
134
+ @parsers[name] = self.class.parser(name)
135
+ else
136
+ raise Newstile::Error, "Unknown parser: #{name}"
137
+ end
138
+ end
139
+ @span_start, @span_start_re = span_parser_regexps
140
+ end
141
+
142
+ # Create the needed span parser regexps.
143
+ def span_parser_regexps(parsers = @span_parsers)
144
+ span_start = /#{parsers.map {|name| @parsers[name].span_start}.join('|')}/
145
+ [span_start, /(?=#{span_start})/]
146
+ end
147
+
148
+ # Parse all block level elements in +text+ into the element +el+.
149
+ def parse_blocks(el, text = nil)
150
+ @stack.push([@tree, @src])
151
+ @tree, @src = el, (text.nil? ? @src : StringScanner.new(text))
152
+
153
+ status = catch(:stop_block_parsing) do
154
+ while !@src.eos?
155
+ block_ial_set = @block_ial
156
+ @block_parsers.any? do |name|
157
+ if @src.check(@parsers[name].start_re)
158
+ send(@parsers[name].method)
159
+ else
160
+ false
161
+ end
162
+ end || begin
163
+ warning('Warning: this should not occur - no block parser handled the line')
164
+ add_text(@src.scan(/.*\n/))
165
+ end
166
+ @block_ial = nil if block_ial_set
167
+ end
168
+ end
169
+
170
+ @tree, @src = *@stack.pop
171
+ status
172
+ end
173
+
174
+ # Update the tree by parsing all <tt>:raw_text</tt> elements with the span level parser
175
+ # (resets +@tree+, +@src+ and the +@stack+) and by updating the attributes from the IALs.
176
+ def update_tree(element)
177
+ last_blank = nil
178
+ element.children.map! do |child|
179
+ if child.type == :raw_text
180
+ last_blank = nil
181
+ @stack, @tree, @text_type = [], nil, :text
182
+ @src = StringScanner.new(child.value)
183
+ parse_spans(child)
184
+ child.children
185
+ elsif child.type == :eob
186
+ []
187
+ elsif child.type == :blank
188
+ if last_blank
189
+ last_blank.value += child.value
190
+ []
191
+ else
192
+ last_blank = child
193
+ child
194
+ end
195
+ else
196
+ last_blank = nil
197
+ update_tree(child)
198
+ update_attr_with_ial(child.attr, child.options[:ial]) if child.options[:ial]
199
+ child
200
+ end
201
+ end.flatten!
202
+ end
203
+
204
+ # Parse all span level elements in the source string.
205
+ def parse_spans(el, stop_re = nil, parsers = nil, text_type = @text_type)
206
+ @stack.push([@tree, @text_type]) unless @tree.nil?
207
+ @tree, @text_type = el, text_type
208
+
209
+ span_start = @span_start
210
+ span_start_re = @span_start_re
211
+ span_start, span_start_re = span_parser_regexps(parsers) if parsers
212
+ parsers = parsers || @span_parsers
213
+
214
+ used_re = (stop_re.nil? ? span_start_re : /(?=#{Regexp.union(stop_re, span_start)})/)
215
+ stop_re_found = false
216
+ while !@src.eos? && !stop_re_found
217
+ if result = @src.scan_until(used_re)
218
+ add_text(result)
219
+ if stop_re && (stop_re_matched = @src.check(stop_re))
220
+ stop_re_found = (block_given? ? yield : true)
221
+ end
222
+ processed = parsers.any? do |name|
223
+ if @src.check(@parsers[name].start_re)
224
+ send(@parsers[name].method)
225
+ true
226
+ else
227
+ false
228
+ end
229
+ end unless stop_re_found
230
+ add_text(@src.scan(/./)) if !processed && !stop_re_found
231
+ else
232
+ add_text(@src.scan(/.*/m)) unless stop_re
233
+ break
234
+ end
235
+ end
236
+
237
+ @tree, @text_type = @stack.pop
238
+
239
+ stop_re_found
240
+ end
241
+
242
+ # Update the attributes with the information from the inline attribute list and all referenced ALDs.
243
+ def update_attr_with_ial(attr, ial)
244
+ ial[:refs].each do |ref|
245
+ update_attr_with_ial(attr, ref) if ref = @doc.parse_infos[:ald][ref]
246
+ end if ial[:refs]
247
+ ial.each do |k,v|
248
+ if k == 'class'
249
+ attr[k] = ((attr[k] || '') + " #{v}").lstrip
250
+ elsif k.kind_of?(String)
251
+ attr[k] = v
252
+ end
253
+ end
254
+ end
255
+
256
+ # Create a new block level element, taking care of applying a preceding block IAL if it exists.
257
+ def new_block_el(*args)
258
+ el = Element.new(*args)
259
+ el.options[:category] ||= :block
260
+ el.options[:ial] = @block_ial if @block_ial && el.type != :blank && el.type != :eob
261
+ el
262
+ end
263
+
264
+ @@parsers = {}
265
+
266
+ # Holds all the needed data for one block/span level parser.
267
+ Data = Struct.new(:name, :start_re, :span_start, :method)
268
+
269
+ # Add a parser method
270
+ #
271
+ # * with the given +name+,
272
+ # * using +start_re+ as start regexp
273
+ # * and, for span parsers, +span_start+ as a String that can be used in a regexp and
274
+ # which identifies the starting character(s)
275
+ #
276
+ # to the registry. The method name is automatically derived from the +name+ or can explicitly
277
+ # be set by using the +meth_name+ parameter.
278
+ def self.define_parser(name, start_re, span_start = nil, meth_name = "parse_#{name}")
279
+ raise "A parser with the name #{name} already exists!" if @@parsers.has_key?(name)
280
+ @@parsers[name] = Data.new(name, start_re, span_start, meth_name)
281
+ end
282
+
283
+ # Return the Data structure for the parser +name+.
284
+ def self.parser(name = nil)
285
+ @@parsers[name]
286
+ end
287
+
288
+ # Return +true+ if there is a parser called +name+.
289
+ def self.has_parser?(name)
290
+ @@parsers.has_key?(name)
291
+ end
292
+
293
+ INDENT = /^(?:\t| {4})/
294
+ OPT_SPACE = / {0,3}/
295
+
296
+ require 'newstile/parser/newstile/blank_line'
297
+ require 'newstile/parser/newstile/eob'
298
+ require 'newstile/parser/newstile/paragraph'
299
+ require 'newstile/parser/newstile/header'
300
+ require 'newstile/parser/newstile/blockquote'
301
+ require 'newstile/parser/newstile/table'
302
+ require 'newstile/parser/newstile/codeblock'
303
+ require 'newstile/parser/newstile/horizontal_rule'
304
+ require 'newstile/parser/newstile/list'
305
+ require 'newstile/parser/newstile/link'
306
+ require 'newstile/parser/newstile/attribute_list'
307
+ require 'newstile/parser/newstile/extension'
308
+ require 'newstile/parser/newstile/footnote'
309
+ require 'newstile/parser/newstile/html'
310
+ require 'newstile/parser/newstile/escaped_chars'
311
+ require 'newstile/parser/newstile/html_entity'
312
+ require 'newstile/parser/newstile/line_break'
313
+ require 'newstile/parser/newstile/typographic_symbol'
314
+ require 'newstile/parser/newstile/autolink'
315
+ require 'newstile/parser/newstile/codespan'
316
+ require 'newstile/parser/newstile/emphasis'
317
+ require 'newstile/parser/newstile/smart_quotes'
318
+ require 'newstile/parser/newstile/math'
319
+ require 'newstile/parser/newstile/abbreviation'
320
+
321
+ end
322
+
323
+ end
324
+
325
+ end
@@ -0,0 +1,66 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of newstile.
7
+ #
8
+ # newstile is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ #++
21
+ #
22
+
23
+ module Newstile
24
+ module Parser
25
+ class Newstile
26
+
27
+ ABBREV_DEFINITION_START = /^#{OPT_SPACE}\*\[(.+?)\]:(.*?)\n/
28
+
29
+ # Parse the link definition at the current location.
30
+ def parse_abbrev_definition
31
+ @src.pos += @src.matched_size
32
+ abbrev_id, abbrev_text = @src[1], @src[2].strip
33
+ warning("Duplicate abbreviation ID '#{abbrev_id}' - overwriting") if @doc.parse_infos[:abbrev_defs][abbrev_id]
34
+ @doc.parse_infos[:abbrev_defs][abbrev_id] = abbrev_text
35
+ @tree.children << Element.new(:eob, :abbrev_def)
36
+ true
37
+ end
38
+ define_parser(:abbrev_definition, ABBREV_DEFINITION_START)
39
+
40
+ # Replace the abbreviation text with elements.
41
+ def replace_abbreviations(el, regexps = nil)
42
+ return if @doc.parse_infos[:abbrev_defs].empty?
43
+ if !regexps
44
+ regexps = [Regexp.union(*@doc.parse_infos[:abbrev_defs].keys.map {|k| /#{Regexp.escape(k)}/})]
45
+ regexps << /(?=(?:\W|^)#{regexps.first}(?!\w))/ # regexp should only match on word boundaries
46
+ end
47
+ el.children.map! do |child|
48
+ if child.type == :text
49
+ result = []
50
+ strscan = StringScanner.new(child.value)
51
+ while temp = strscan.scan_until(regexps.last)
52
+ temp += strscan.scan(/\W|^/)
53
+ abbr = strscan.scan(regexps.first)
54
+ result += [Element.new(:text, temp), Element.new(:abbreviation, abbr)]
55
+ end
56
+ result + [Element.new(:text, extract_string(strscan.pos..-1, strscan))]
57
+ else
58
+ replace_abbreviations(child, regexps)
59
+ child
60
+ end
61
+ end.flatten!
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,111 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of newstile.
7
+ #
8
+ # newstile is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ #++
21
+ #
22
+
23
+ module Newstile
24
+ module Parser
25
+ class Newstile
26
+
27
+ # Parse the string +str+ and extract all attributes and add all found attributes to the hash
28
+ # +opts+.
29
+ def parse_attribute_list(str, opts)
30
+ str.scan(ALD_TYPE_ANY).each do |key, sep, val, id_attr, class_attr, ref|
31
+ if ref
32
+ (opts[:refs] ||= []) << ref
33
+ elsif class_attr
34
+ opts['class'] = ((opts['class'] || '') + " #{class_attr}").lstrip
35
+ elsif id_attr
36
+ opts['id'] = id_attr
37
+ else
38
+ opts[key] = val.gsub(/\\(\}|#{sep})/, "\\1")
39
+ end
40
+ end
41
+ end
42
+
43
+ # Update the +ial+ with the information from the inline attribute list +opts+.
44
+ def update_ial_with_ial(ial, opts)
45
+ (ial[:refs] ||= []) << opts[:refs]
46
+ opts.each do |k,v|
47
+ if k == 'class'
48
+ ial[k] = ((ial[k] || '') + " #{v}").lstrip
49
+ elsif k.kind_of?(String)
50
+ ial[k] = v
51
+ end
52
+ end
53
+ end
54
+
55
+
56
+ ALD_ID_CHARS = /[\w-]/
57
+ ALD_ANY_CHARS = /\\\}|[^\}]/
58
+ ALD_ID_NAME = /\w#{ALD_ID_CHARS}*/
59
+ ALD_TYPE_KEY_VALUE_PAIR = /(#{ALD_ID_NAME})=("|')((?:\\\}|\\\2|[^\}\2])*?)\2/
60
+ ALD_TYPE_CLASS_NAME = /\.(#{ALD_ID_NAME})/
61
+ ALD_TYPE_ID_NAME = /#(\w[\w:-]*)/
62
+ ALD_TYPE_REF = /(#{ALD_ID_NAME})/
63
+ ALD_TYPE_ANY = /(?:\A|\s)(?:#{ALD_TYPE_KEY_VALUE_PAIR}|#{ALD_TYPE_ID_NAME}|#{ALD_TYPE_CLASS_NAME}|#{ALD_TYPE_REF})(?=\s|\Z)/
64
+ ALD_START = /^#{OPT_SPACE}\{:(#{ALD_ID_NAME}):(#{ALD_ANY_CHARS}+)\}\s*?\n/
65
+
66
+ # Parse the attribute list definition at the current location.
67
+ def parse_ald
68
+ @src.pos += @src.matched_size
69
+ parse_attribute_list(@src[2], @doc.parse_infos[:ald][@src[1]] ||= Utils::OrderedHash.new)
70
+ @tree.children << Element.new(:eob, :ald)
71
+ true
72
+ end
73
+ define_parser(:ald, ALD_START)
74
+
75
+
76
+ IAL_BLOCK = /\{:(?!:|\/)(#{ALD_ANY_CHARS}+)\}\s*?\n/
77
+ IAL_BLOCK_START = /^#{OPT_SPACE}#{IAL_BLOCK}/
78
+
79
+ # Parse the inline attribute list at the current location.
80
+ def parse_block_ial
81
+ @src.pos += @src.matched_size
82
+ if @tree.children.last && @tree.children.last.type != :blank && @tree.children.last.type != :eob
83
+ parse_attribute_list(@src[1], @tree.children.last.options[:ial] ||= Utils::OrderedHash.new)
84
+ @tree.children << Element.new(:eob, :ial) unless @src.check(IAL_BLOCK_START)
85
+ else
86
+ parse_attribute_list(@src[1], @block_ial = Utils::OrderedHash.new)
87
+ end
88
+ true
89
+ end
90
+ define_parser(:block_ial, IAL_BLOCK_START)
91
+
92
+
93
+ IAL_SPAN_START = /\{:(#{ALD_ANY_CHARS}+)\}/
94
+
95
+ # Parse the inline attribute list at the current location.
96
+ def parse_span_ial
97
+ @src.pos += @src.matched_size
98
+ if @tree.children.last && @tree.children.last.type != :text
99
+ attr = Utils::OrderedHash.new
100
+ parse_attribute_list(@src[1], attr)
101
+ update_ial_with_ial(@tree.children.last.options[:ial] ||= Utils::OrderedHash.new, attr)
102
+ update_attr_with_ial(@tree.children.last.attr, attr)
103
+ else
104
+ warning("Ignoring span IAL because preceding element is just text")
105
+ end
106
+ end
107
+ define_parser(:span_ial, IAL_SPAN_START, '\{:')
108
+
109
+ end
110
+ end
111
+ end