maruku 0.6.1 → 0.7.0.beta1

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 (263) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/MIT-LICENSE.txt +20 -0
  5. data/bin/maruku +153 -152
  6. data/bin/marutex +2 -29
  7. data/data/entities.xml +261 -0
  8. data/docs/math.md +14 -18
  9. data/lib/maruku.rb +65 -77
  10. data/lib/maruku/attributes.rb +109 -214
  11. data/lib/maruku/defaults.rb +45 -67
  12. data/lib/maruku/document.rb +43 -0
  13. data/lib/maruku/element.rb +112 -0
  14. data/lib/maruku/errors.rb +71 -0
  15. data/lib/maruku/ext/div.rb +105 -113
  16. data/lib/maruku/ext/fenced_code.rb +97 -0
  17. data/lib/maruku/ext/math.rb +22 -26
  18. data/lib/maruku/ext/math/elements.rb +20 -26
  19. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +92 -104
  20. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +33 -26
  21. data/lib/maruku/ext/math/mathml_engines/none.rb +11 -19
  22. data/lib/maruku/ext/math/mathml_engines/ritex.rb +2 -4
  23. data/lib/maruku/ext/math/parsing.rb +107 -113
  24. data/lib/maruku/ext/math/to_html.rb +184 -187
  25. data/lib/maruku/ext/math/to_latex.rb +30 -21
  26. data/lib/maruku/helpers.rb +158 -257
  27. data/lib/maruku/html.rb +254 -0
  28. data/lib/maruku/input/charsource.rb +272 -319
  29. data/lib/maruku/input/extensions.rb +62 -63
  30. data/lib/maruku/input/html_helper.rb +220 -189
  31. data/lib/maruku/input/linesource.rb +90 -110
  32. data/lib/maruku/input/mdline.rb +129 -0
  33. data/lib/maruku/input/parse_block.rb +618 -612
  34. data/lib/maruku/input/parse_doc.rb +145 -215
  35. data/lib/maruku/input/parse_span.rb +658 -0
  36. data/lib/maruku/input/rubypants.rb +200 -128
  37. data/lib/maruku/inspect_element.rb +60 -0
  38. data/lib/maruku/maruku.rb +10 -31
  39. data/lib/maruku/output/entity_table.rb +33 -0
  40. data/lib/maruku/output/s5/fancy.rb +462 -462
  41. data/lib/maruku/output/s5/to_s5.rb +115 -135
  42. data/lib/maruku/output/to_html.rb +898 -983
  43. data/lib/maruku/output/to_latex.rb +561 -560
  44. data/lib/maruku/output/to_markdown.rb +207 -162
  45. data/lib/maruku/output/to_s.rb +11 -52
  46. data/lib/maruku/string_utils.rb +129 -179
  47. data/lib/maruku/toc.rb +185 -196
  48. data/lib/maruku/version.rb +33 -38
  49. data/spec/block_docs/abbrev.md +776 -0
  50. data/{tests/unittest → spec/block_docs}/abbreviations.md +11 -20
  51. data/{tests/unittest → spec/block_docs}/alt.md +2 -14
  52. data/{tests/unittest/pending → spec/block_docs}/amps.md +1 -13
  53. data/{tests/unittest → spec/block_docs}/attributes/att2.md +0 -12
  54. data/{tests/unittest → spec/block_docs}/attributes/att3.md +2 -14
  55. data/{tests/unittest → spec/block_docs}/attributes/attributes.md +12 -16
  56. data/{tests/unittest → spec/block_docs}/attributes/circular.md +0 -12
  57. data/{tests/unittest → spec/block_docs}/attributes/default.md +1 -13
  58. data/{tests/unittest → spec/block_docs}/blank.md +0 -12
  59. data/{tests/unittest → spec/block_docs}/blanks_in_code.md +16 -15
  60. data/{tests/unittest/loss.md → spec/block_docs/bug_def.md} +6 -18
  61. data/{tests/unittest → spec/block_docs}/bug_table.md +3 -15
  62. data/{tests/unittest → spec/block_docs}/code.md +7 -14
  63. data/{tests/unittest → spec/block_docs}/code2.md +4 -14
  64. data/{tests/unittest → spec/block_docs}/code3.md +12 -16
  65. data/{tests/unittest → spec/block_docs}/data_loss.md +2 -14
  66. data/{tests/unittest → spec/block_docs}/divs/div1.md +0 -12
  67. data/{tests/unittest → spec/block_docs}/divs/div2.md +0 -12
  68. data/{tests/unittest → spec/block_docs}/divs/div3_nest.md +3 -15
  69. data/{tests/unittest → spec/block_docs}/easy.md +1 -13
  70. data/spec/block_docs/email.md +29 -0
  71. data/{tests/unittest/pending → spec/block_docs}/empty_cells.md +3 -15
  72. data/{tests/unittest → spec/block_docs}/encoding/iso-8859-1.md +1 -14
  73. data/{tests/unittest → spec/block_docs}/encoding/utf-8.md +0 -12
  74. data/{tests/unittest → spec/block_docs}/entities.md +27 -29
  75. data/{tests/unittest/notyet → spec/block_docs}/escape.md +2 -14
  76. data/{tests/unittest → spec/block_docs}/escaping.md +11 -22
  77. data/{tests/unittest → spec/block_docs}/extra_dl.md +2 -13
  78. data/{tests/unittest → spec/block_docs}/extra_header_id.md +14 -20
  79. data/{tests/unittest → spec/block_docs}/extra_table1.md +3 -15
  80. data/spec/block_docs/fenced_code_blocks.md +66 -0
  81. data/spec/block_docs/fenced_code_blocks_highlighted.md +18 -0
  82. data/{tests/unittest → spec/block_docs}/footnotes.md +12 -24
  83. data/spec/block_docs/footnotes2.md +78 -0
  84. data/spec/block_docs/hard.md +25 -0
  85. data/spec/block_docs/header_after_par.md +62 -0
  86. data/{tests/unittest → spec/block_docs}/headers.md +10 -18
  87. data/{tests/unittest → spec/block_docs}/hex_entities.md +7 -18
  88. data/{tests/unittest → spec/block_docs}/hrule.md +5 -12
  89. data/{tests/unittest → spec/block_docs}/html3.md +1 -13
  90. data/{tests/unittest → spec/block_docs}/html4.md +2 -14
  91. data/{tests/unittest → spec/block_docs}/html5.md +2 -14
  92. data/spec/block_docs/html_block_in_para.md +22 -0
  93. data/spec/block_docs/html_inline.md +25 -0
  94. data/spec/block_docs/html_trailing.md +31 -0
  95. data/spec/block_docs/ie.md +62 -0
  96. data/spec/block_docs/iframe.md +29 -0
  97. data/{tests/unittest → spec/block_docs}/images.md +22 -28
  98. data/{tests/unittest → spec/block_docs}/images2.md +7 -17
  99. data/{tests/unittest → spec/block_docs}/inline_html.md +37 -67
  100. data/{tests/unittest → spec/block_docs}/inline_html2.md +1 -13
  101. data/spec/block_docs/inline_html_beginning.md +10 -0
  102. data/spec/block_docs/issue20.md +9 -0
  103. data/spec/block_docs/issue26.md +22 -0
  104. data/spec/block_docs/issue29.md +9 -0
  105. data/spec/block_docs/issue30.md +30 -0
  106. data/spec/block_docs/issue31.md +25 -0
  107. data/spec/block_docs/issue40.md +40 -0
  108. data/spec/block_docs/issue64.md +55 -0
  109. data/spec/block_docs/issue67.md +19 -0
  110. data/spec/block_docs/issue70.md +11 -0
  111. data/spec/block_docs/issue72.md +17 -0
  112. data/spec/block_docs/issue74.md +38 -0
  113. data/spec/block_docs/issue79.md +15 -0
  114. data/spec/block_docs/issue83.md +13 -0
  115. data/spec/block_docs/issue85.md +25 -0
  116. data/spec/block_docs/issue88.md +19 -0
  117. data/spec/block_docs/issue89.md +12 -0
  118. data/spec/block_docs/issue90.md +38 -0
  119. data/{tests/unittest/pending → spec/block_docs}/link.md +21 -18
  120. data/{tests/unittest → spec/block_docs}/links.md +33 -32
  121. data/spec/block_docs/links2.md +21 -0
  122. data/{tests/unittest → spec/block_docs}/list1.md +0 -12
  123. data/{tests/unittest → spec/block_docs}/list12.md +2 -14
  124. data/{tests/unittest → spec/block_docs}/list2.md +2 -14
  125. data/spec/block_docs/list_multipara.md +42 -0
  126. data/{tests/unittest → spec/block_docs}/lists.md +28 -29
  127. data/{tests/unittest → spec/block_docs}/lists10.md +2 -14
  128. data/spec/block_docs/lists11.md +23 -0
  129. data/spec/block_docs/lists12.md +43 -0
  130. data/spec/block_docs/lists13.md +55 -0
  131. data/spec/block_docs/lists14.md +61 -0
  132. data/spec/block_docs/lists15.md +36 -0
  133. data/spec/block_docs/lists6.md +88 -0
  134. data/spec/block_docs/lists7b.md +58 -0
  135. data/spec/block_docs/lists9.md +53 -0
  136. data/{tests/unittest → spec/block_docs}/lists_after_paragraph.md +19 -25
  137. data/spec/block_docs/lists_blank.md +35 -0
  138. data/{tests/unittest/list3.md → spec/block_docs/lists_blockquote_code.md} +2 -14
  139. data/{tests/unittest/list4.md → spec/block_docs/lists_need_blank_line.md} +50 -21
  140. data/spec/block_docs/lists_nested.md +44 -0
  141. data/spec/block_docs/lists_nested_blankline.md +28 -0
  142. data/spec/block_docs/lists_nested_deep.md +43 -0
  143. data/{tests/unittest → spec/block_docs}/lists_ol.md +37 -54
  144. data/spec/block_docs/lists_paraindent.md +47 -0
  145. data/spec/block_docs/lists_tab.md +54 -0
  146. data/spec/block_docs/loss.md +17 -0
  147. data/spec/block_docs/math-blahtex/equations.md +30 -0
  148. data/spec/block_docs/math-blahtex/inline.md +48 -0
  149. data/spec/block_docs/math-blahtex/math2.md +45 -0
  150. data/spec/block_docs/math-blahtex/table.md +25 -0
  151. data/spec/block_docs/math/embedded_invalid_svg.md +79 -0
  152. data/spec/block_docs/math/embedded_svg.md +97 -0
  153. data/spec/block_docs/math/equations.md +44 -0
  154. data/{tests/unittest → spec/block_docs}/math/inline.md +7 -19
  155. data/spec/block_docs/math/math2.md +45 -0
  156. data/{tests/unittest → spec/block_docs}/math/notmath.md +0 -12
  157. data/spec/block_docs/math/raw_mathml.md +87 -0
  158. data/spec/block_docs/math/table.md +25 -0
  159. data/{tests/unittest → spec/block_docs}/math/table2.md +5 -17
  160. data/{tests/unittest → spec/block_docs}/misc_sw.md +181 -118
  161. data/{tests/unittest → spec/block_docs}/olist.md +6 -18
  162. data/{tests/unittest → spec/block_docs}/one.md +0 -12
  163. data/{tests/unittest → spec/block_docs}/paragraph.md +0 -12
  164. data/{tests/unittest → spec/block_docs}/paragraph_rules/dont_merge_ref.md +4 -12
  165. data/{tests/unittest → spec/block_docs}/paragraph_rules/tab_is_blank.md +0 -12
  166. data/{tests/unittest → spec/block_docs}/paragraphs.md +1 -13
  167. data/{tests/unittest → spec/block_docs}/recover/recover_links.md +4 -16
  168. data/{tests/unittest/pending/ref.md → spec/block_docs/ref_with_period.md} +7 -16
  169. data/spec/block_docs/ref_with_title.md +22 -0
  170. data/{tests/unittest → spec/block_docs}/references/long_example.md +16 -23
  171. data/{tests/unittest → spec/block_docs}/references/spaces_and_numbers.md +0 -12
  172. data/{tests/unittest → spec/block_docs}/smartypants.md +24 -31
  173. data/{tests/unittest → spec/block_docs}/syntax_hl.md +13 -17
  174. data/{tests/unittest → spec/block_docs}/table_attributes.md +2 -14
  175. data/spec/block_docs/tables.md +58 -0
  176. data/{tests/unittest → spec/block_docs}/test.md +1 -13
  177. data/{tests/unittest/notyet → spec/block_docs}/ticks.md +1 -13
  178. data/spec/block_docs/toc.md +87 -0
  179. data/{tests/unittest/notyet → spec/block_docs}/triggering.md +14 -25
  180. data/{tests/unittest → spec/block_docs}/underscore_in_words.md +0 -12
  181. data/{tests/unittest → spec/block_docs}/wrapping.md +4 -16
  182. data/spec/block_docs/xml.md +33 -0
  183. data/{tests/unittest → spec/block_docs}/xml2.md +0 -12
  184. data/spec/block_docs/xml3.md +24 -0
  185. data/{tests/unittest → spec/block_docs}/xml_instruction.md +9 -20
  186. data/spec/block_spec.rb +110 -0
  187. data/spec/cli_spec.rb +8 -0
  188. data/spec/span_spec.rb +256 -0
  189. data/spec/spec_helper.rb +2 -0
  190. data/spec/to_html_utf8_spec.rb +13 -0
  191. metadata +205 -243
  192. metadata.gz.sig +3 -0
  193. data/Rakefile +0 -48
  194. data/bin/marudown +0 -29
  195. data/bin/marutest +0 -345
  196. data/docs/changelog.md +0 -334
  197. data/lib/maruku/errors_management.rb +0 -92
  198. data/lib/maruku/ext/math/latex_fix.rb +0 -12
  199. data/lib/maruku/input/parse_span_better.rb +0 -746
  200. data/lib/maruku/input/type_detection.rb +0 -147
  201. data/lib/maruku/output/to_latex_entities.rb +0 -367
  202. data/lib/maruku/output/to_latex_strings.rb +0 -64
  203. data/lib/maruku/structures.rb +0 -167
  204. data/lib/maruku/structures_inspect.rb +0 -87
  205. data/lib/maruku/structures_iterators.rb +0 -61
  206. data/lib/maruku/tests/benchmark.rb +0 -82
  207. data/lib/maruku/tests/new_parser.rb +0 -373
  208. data/lib/maruku/tests/tests.rb +0 -136
  209. data/lib/maruku/usage/example1.rb +0 -33
  210. data/tests/bugs/code_in_links.md +0 -101
  211. data/tests/bugs/complex_escaping.md +0 -38
  212. data/tests/math/syntax.md +0 -46
  213. data/tests/math_usage/document.md +0 -13
  214. data/tests/others/abbreviations.md +0 -11
  215. data/tests/others/blank.md +0 -4
  216. data/tests/others/code.md +0 -5
  217. data/tests/others/code2.md +0 -8
  218. data/tests/others/code3.md +0 -16
  219. data/tests/others/email.md +0 -4
  220. data/tests/others/entities.md +0 -19
  221. data/tests/others/escaping.md +0 -16
  222. data/tests/others/extra_dl.md +0 -101
  223. data/tests/others/extra_header_id.md +0 -13
  224. data/tests/others/extra_table1.md +0 -40
  225. data/tests/others/footnotes.md +0 -17
  226. data/tests/others/headers.md +0 -10
  227. data/tests/others/hrule.md +0 -10
  228. data/tests/others/images.md +0 -20
  229. data/tests/others/inline_html.md +0 -42
  230. data/tests/others/links.md +0 -38
  231. data/tests/others/list1.md +0 -4
  232. data/tests/others/list2.md +0 -5
  233. data/tests/others/list3.md +0 -8
  234. data/tests/others/lists.md +0 -32
  235. data/tests/others/lists_after_paragraph.md +0 -44
  236. data/tests/others/lists_ol.md +0 -39
  237. data/tests/others/misc_sw.md +0 -105
  238. data/tests/others/one.md +0 -1
  239. data/tests/others/paragraphs.md +0 -13
  240. data/tests/others/sss06.md +0 -352
  241. data/tests/others/test.md +0 -4
  242. data/tests/s5/s5profiling.md +0 -48
  243. data/tests/unittest/bug_def.md +0 -28
  244. data/tests/unittest/email.md +0 -32
  245. data/tests/unittest/html2.md +0 -34
  246. data/tests/unittest/ie.md +0 -61
  247. data/tests/unittest/links2.md +0 -34
  248. data/tests/unittest/lists11.md +0 -28
  249. data/tests/unittest/lists6.md +0 -53
  250. data/tests/unittest/lists9.md +0 -76
  251. data/tests/unittest/math/equations.md +0 -86
  252. data/tests/unittest/math/math2.md +0 -57
  253. data/tests/unittest/math/table.md +0 -37
  254. data/tests/unittest/notyet/header_after_par.md +0 -70
  255. data/tests/unittest/red_tests/abbrev.md +0 -1388
  256. data/tests/unittest/red_tests/lists7.md +0 -68
  257. data/tests/unittest/red_tests/lists7b.md +0 -128
  258. data/tests/unittest/red_tests/lists8.md +0 -76
  259. data/tests/unittest/red_tests/xml.md +0 -70
  260. data/tests/unittest/xml3.md +0 -38
  261. data/tests/utf8-files/simple.md +0 -1
  262. data/unit_test_block.sh +0 -5
  263. data/unit_test_span.sh +0 -3
@@ -1,71 +1,49 @@
1
- #--
2
- # Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
3
- #
4
- # This file is part of Maruku.
5
- #
6
- # Maruku is free software; you can redistribute it and/or modify
7
- # it under the terms of the GNU General Public License as published by
8
- # the Free Software Foundation; either version 2 of the License, or
9
- # (at your option) any later version.
10
- #
11
- # Maruku is distributed in the hope that it will be useful,
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- # GNU General Public License for more details.
15
- #
16
- # You should have received a copy of the GNU General Public License
17
- # along with Maruku; if not, write to the Free Software
18
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
- #++
1
+ module MaRuKu
20
2
 
3
+ Globals = {
4
+ :unsafe_features => false,
5
+ :on_error => :warning,
21
6
 
22
- module MaRuKu
23
-
24
- Globals = {
25
- :unsafe_features => false,
26
- :on_error => :warning,
27
-
28
-
29
- :use_numbered_headers => false,
30
-
31
- :maruku_signature => false,
32
- :code_background_color => '#fef',
33
- :code_show_spaces => false,
34
-
35
- :filter_html => false,
36
-
37
- :html_math_output_mathml => true, # also set :html_math_engine
38
- :html_math_engine => 'none', #ritex, itex2mml
39
-
40
- :html_math_output_png => false,
41
- :html_png_engine => 'none',
42
- :html_png_dir => 'pngs',
43
- :html_png_url => 'pngs/',
44
- :html_png_resolution => 200,
45
-
46
- :html_use_syntax => false,
47
-
48
- :latex_use_listings => false,
49
- :latex_cjk => false,
50
- :latex_cache_file => "blahtex_cache.pstore", # cache file for blahtex filter
51
-
52
- :debug_keep_ials => false,
53
- :doc_prefix => ''
54
- }
7
+ :use_numbered_headers => false,
55
8
 
56
- class MDElement
57
- def get_setting(sym)
58
- if self.attributes.has_key?(sym) then
59
- return self.attributes[sym]
60
- elsif self.doc && self.doc.attributes.has_key?(sym) then
61
- return self.doc.attributes[sym]
62
- elsif MaRuKu::Globals.has_key?(sym)
63
- return MaRuKu::Globals[sym]
64
- else
65
- $stderr.puts "Bug: no default for #{sym.inspect}"
66
- nil
67
- end
68
- end
69
- end
9
+ :maruku_signature => false,
10
+ :code_background_color => '#fef',
11
+ :code_show_spaces => false,
12
+
13
+ :filter_html => false,
14
+
15
+ :html_parser => 'rexml', # or 'nokogiri'
16
+
17
+ :html_math_output_mathml => true, # also set :html_math_engine
18
+ :html_math_engine => 'none', # none, ritex, itex2mml, blahtex
19
+
20
+ :html_math_output_png => false,
21
+ :html_png_engine => 'none',
22
+ :html_png_dir => 'pngs',
23
+ :html_png_url => 'pngs/',
24
+ :html_png_resolution => 200,
70
25
 
71
- end
26
+ :fenced_code_blocks => false,
27
+ :html_use_syntax => false,
28
+
29
+ :latex_use_listings => false,
30
+ :latex_cjk => false,
31
+
32
+ :debug_keep_ials => false,
33
+ :doc_prefix => '',
34
+
35
+ :ignore_wikilinks => true
36
+ }
37
+
38
+ class MDElement
39
+ def get_setting(sym)
40
+ return attributes[sym] if attributes.has_key?(sym)
41
+ return doc.attributes[sym] if doc && doc.attributes.has_key?(sym)
42
+ return MaRuKu::Globals[sym] if MaRuKu::Globals.has_key?(sym)
43
+
44
+ $stderr.puts "Bug: no default for #{sym.inspect}"
45
+ nil
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,43 @@
1
+ module MaRuKu
2
+ # This represents the whole document and holds global data.
3
+ class MDDocument # < MDElement
4
+ # @return [{String => {:url => String, :title => String}}]
5
+ attr_accessor :refs
6
+
7
+ # @return [{String => MDElement}]
8
+ attr_accessor :footnotes
9
+
10
+ # @return [{String => String}]
11
+ attr_accessor :abbreviations
12
+
13
+ # Attribute definition lists.
14
+ #
15
+ # @return [{String => AttributeList}]
16
+ attr_accessor :ald
17
+
18
+ # The order in which footnotes are used. Contains the id.
19
+ #
20
+ # @return [Array<String>]
21
+ attr_accessor :footnotes_order
22
+
23
+ # @return [{String => {String => MDElement}}]
24
+ attr_accessor :refid2ref
25
+
26
+ # A counter for generating unique IDs [Integer]
27
+ attr_accessor :id_counter
28
+
29
+ def initialize(s=nil)
30
+ super(:document)
31
+
32
+ self.doc = self
33
+ self.refs = {}
34
+ self.footnotes = {}
35
+ self.footnotes_order = []
36
+ self.abbreviations = {}
37
+ self.ald = {}
38
+ self.id_counter = 0
39
+
40
+ parse_doc(s) if s
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,112 @@
1
+ module MaRuKu
2
+ # Rather than having a separate class for every possible element,
3
+ # Maruku has a single {MDElement} class
4
+ # that represents eveything in the document (paragraphs, headers, etc).
5
+ # The type of each element is available via \{#node\_type}.
6
+ class MDElement
7
+ # The type of this node (e.g. `:quote`, `:image`, `:abbr`).
8
+ # See {Helpers} for a list of possible values.
9
+ #
10
+ # @return [Symbol]
11
+ attr_accessor :node_type
12
+
13
+ # The child nodes of this element.
14
+ #
15
+ # @return [Array<String or MDElement>]
16
+ attr_accessor :children
17
+
18
+ # An attribute list. May not be nil.
19
+ #
20
+ # @return [AttributeList]
21
+ attr_accessor :al
22
+
23
+ # The processed attributes.
24
+ #
25
+ # For the {Maruku document root},
26
+ # this contains properties listed
27
+ # at the beginning of the document.
28
+ # The properties will be downcased and any spaces
29
+ # will be converted to underscores.
30
+ # For example, if you write in the source document:
31
+ #
32
+ # !!!text
33
+ # Title: test document
34
+ # My property: value
35
+ #
36
+ # content content
37
+ #
38
+ # Then \{#attributes} will return:
39
+ #
40
+ # {:title => "test document", :my_property => "value"}
41
+ #
42
+ # @return [{Symbol => String}]
43
+ attr_accessor :attributes
44
+
45
+ # The root element of the document
46
+ # to which this element belongs.
47
+ #
48
+ # @return [Maruku]
49
+ attr_accessor :doc
50
+
51
+ def initialize(node_type = :unset, children = [], meta = {}, al = nil)
52
+ self.children = children
53
+ self.node_type = node_type
54
+ self.attributes = {}
55
+
56
+ # Define a new accessor on the singleton class for this instance
57
+ # for each metadata key
58
+ meta.each do |symbol, value|
59
+ class << self
60
+ self
61
+ end.send(:attr_accessor, symbol)
62
+
63
+ self.send("#{symbol}=", value)
64
+ end
65
+
66
+ self.al = al || AttributeList.new
67
+ self.meta_priv = meta
68
+ end
69
+
70
+ # @private
71
+ attr_accessor :meta_priv
72
+
73
+ def ==(o)
74
+ o.is_a?(MDElement) &&
75
+ self.node_type == o.node_type &&
76
+ self.meta_priv == o.meta_priv &&
77
+ self.children == o.children
78
+ end
79
+
80
+ # Iterates through each {MDElement} child node of this element.
81
+ # This includes deeply-nested child nodes.
82
+ # If `e_node_type` is specified, only yields nodes of that type.
83
+ def each_element(e_node_type=nil, &block)
84
+ @children.each do |c|
85
+ next unless c.is_a? MDElement
86
+ yield c if e_node_type.nil? || c.node_type == e_node_type
87
+ c.each_element(e_node_type, &block)
88
+ end
89
+ end
90
+
91
+ # Iterates through each String child node of this element,
92
+ # replacing it with the result of the block.
93
+ # This includes deeply-nested child nodes.
94
+ #
95
+ # This destructively modifies this node and its children.
96
+ #
97
+ # @todo Make this non-destructive
98
+ def replace_each_string(&block)
99
+ @children.map! do |c|
100
+ next yield c unless c.is_a?(MDElement)
101
+ c.replace_each_string(&block)
102
+ c
103
+ end.flatten!
104
+ end
105
+ end
106
+
107
+ # A specialization of Element that can keep track of
108
+ # its parsed HTML as an attribute (rather than metadata)
109
+ class MDHTMLElement < MDElement
110
+ attr_accessor :parsed_html # HTMLFragment
111
+ end
112
+ end
@@ -0,0 +1,71 @@
1
+ module MaRuKu
2
+ class Exception < RuntimeError; end
3
+
4
+ module Errors
5
+ FRAME_WIDTH = 75
6
+
7
+ # Properly handles a formatting error.
8
+ # All such errors go through this method.
9
+ #
10
+ # The behavior depends on {MaRuKu::Globals `MaRuKu::Globals[:on_error]`}.
11
+ # If this is `:warning`, this prints the error to stderr
12
+ # (or `@error_stream` if it's defined) and tries to continue.
13
+ # If `:on_error` is `:ignore`, this doesn't print anything
14
+ # and tries to continue. If it's `:raise`, this raises a {MaRuKu::Exception}.
15
+ #
16
+ # By default, `:on_error` is set to `:warning`.
17
+ #
18
+ # @overload def maruku_error(s, src = nil, con = nil)
19
+ # @param s [String] The text of the error
20
+ # @param src [#describe, nil] The source of the error
21
+ # @param con [#describe, nil] The context of the error
22
+ # @param recover [String, nil] Recovery text
23
+ # @raise [MaRuKu::Exception] If `:on_error` is set to `:raise`
24
+ def maruku_error(s, src=nil, con=nil, recover=nil)
25
+ policy = get_setting(:on_error)
26
+
27
+ case policy
28
+ when :ignore
29
+ when :raise
30
+ raise_error create_frame(describe_error(s, src, con, recover))
31
+ when :warning
32
+ tell_user create_frame(describe_error(s, src, con, recover))
33
+ else
34
+ raise "Unknown on_error policy: #{policy.inspect}"
35
+ end
36
+ end
37
+
38
+ def maruku_recover(s, src=nil, con=nil, recover=nil)
39
+ tell_user create_frame(describe_error(s, src, con, recover))
40
+ end
41
+
42
+ def raise_error(s)
43
+ raise MaRuKu::Exception, s, caller
44
+ end
45
+
46
+ def tell_user(s)
47
+ (self.attributes[:error_stream] || $stderr) << s << "\n"
48
+ end
49
+
50
+ private
51
+
52
+ def create_frame(s)
53
+ "\n" + <<FRAME
54
+ #{"_" * FRAME_WIDTH}
55
+ | Maruku tells you:
56
+ +#{"-" * FRAME_WIDTH}
57
+ #{s.gsub(/^/, '| ').rstrip}
58
+ +#{"-" * FRAME_WIDTH}
59
+ #{caller[1...5].join("\n").gsub(/^/, '!')}
60
+ \\#{"_" * FRAME_WIDTH}
61
+ FRAME
62
+ end
63
+
64
+ def describe_error(s, src=nil, con=nil, recover=nil)
65
+ s += "\n#{src.describe}\n" if src
66
+ s += "\n#{con.describe}\n" if con
67
+ s += "\nRecovering: #{recover}\n" if recover
68
+ s
69
+ end
70
+ end
71
+ end
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  #+-----------------------------------{.warning}------
4
2
  #| this is the last warning!
5
3
  #|
@@ -10,124 +8,118 @@
10
8
  #| +--------------------------------------------------
11
9
  #+---------------------------------------------------
12
10
 
13
- OpenDiv = /^[ ]{0,3}\+\-\-+\s*(\{([^{}]*|".*"|'.*')*\})?\s*\-*\s*$/
14
- CloseDiv = /^[ ]{0,3}\=\-\-+\s*(\{([^{}]*|".*"|'.*')*\})?\s*\-*\s*$/
15
- # note these are not enough for parsing the above example:
16
- #OpenDiv = /^[ ]{0,3}\+\-\-+\s*(.*)$/
17
- #CloseDiv = /^[ ]{0,3}\=\-\-+\s*(.*)$/
11
+ # TODO: Scope these properly
12
+ OpenDiv = /^[ ]{0,3}\+\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
13
+ CloseDiv = /^[ ]{0,3}\=\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
18
14
  StartPipe = /^[ ]{0,3}\|(.*)$/ # $1 is rest of line
19
15
  DecorativeClosing = OpenDiv
20
16
 
21
- MaRuKu::In::Markdown::register_block_extension(
22
- :regexp => OpenDiv,
23
- :handler => lambda { |doc, src, context|
24
- # return false if not doc.is_math_enabled?
25
- first = src.shift_line
26
- first =~ OpenDiv
27
- ial_at_beginning = $1
28
- ial_at_end = nil
29
-
30
- lines = []
31
- # if second line starts with "|"
32
- if src.cur_line =~ StartPipe
33
- # then we read until no more "|"
34
- while src.cur_line && (src.cur_line =~ StartPipe)
35
- content = $1
36
- lines.push content
37
- src.shift_line
38
- end
39
- if src.cur_line =~ DecorativeClosing
40
- ial_at_end = $1
41
- src.shift_line
42
- end
43
- else
44
- # else we read until CloseDiv
45
- divs_open = 1
46
- while src.cur_line && (divs_open>0)
47
- if src.cur_line =~ CloseDiv
48
- divs_open -= 1
49
- if divs_open == 0
50
- ial_at_end = $1
51
- src.shift_line
52
- break
53
- else
54
- lines.push src.shift_line
55
- end
56
- else
57
- if src.cur_line =~ OpenDiv
58
- divs_open += 1
59
- end
60
- lines.push src.shift_line
61
- end
62
- end
63
-
64
- if divs_open > 0
65
- e = "At end of input, I still have #{divs_open} DIVs open."
66
- doc.maruku_error(e, src, context)
67
- return true
68
- end
69
- end
70
-
71
- ial_at_beginning = nil unless
72
- (ial_at_beginning&&ial_at_beginning.size > 0)
73
- ial_at_end = nil unless (ial_at_end && ial_at_end.size > 0)
17
+ MaRuKu::In::Markdown.register_block_extension(
18
+ :regexp => OpenDiv,
19
+ :handler => lambda do |doc, src, context|
20
+ first = src.shift_line
21
+ ial_at_beginning = first[OpenDiv, 1]
22
+ ial_at_end = nil
23
+
24
+ lines = []
25
+ # if second line starts with "|"
26
+ if src.cur_line =~ StartPipe
27
+ # then we read until no more "|"
28
+ while src.cur_line && src.cur_line =~ StartPipe
29
+ lines.push $1
30
+ src.shift_line
31
+ end
32
+ if src.cur_line =~ DecorativeClosing
33
+ ial_at_end = $1
34
+ src.shift_line
35
+ end
36
+ else
37
+ # else we read until CloseDiv
38
+ divs_open = 1
39
+ while src.cur_line && divs_open > 0
40
+ if src.cur_line =~ CloseDiv
41
+ divs_open -= 1
42
+ if divs_open == 0
43
+ ial_at_end = $1
44
+ src.shift_line
45
+ break
46
+ else
47
+ lines.push src.shift_line
48
+ end
49
+ else
50
+ if src.cur_line =~ OpenDiv
51
+ divs_open += 1
52
+ end
53
+ lines.push src.shift_line
54
+ end
55
+ end
56
+
57
+ if divs_open > 0
58
+ doc.maruku_error("At end of input, I still have #{divs_open} DIVs open.",
59
+ src, context)
60
+ next true
61
+ end
62
+ end
63
+
64
+ ial_at_beginning = nil unless ial_at_beginning && ial_at_beginning.size > 0
65
+ ial_at_end = nil unless ial_at_end && ial_at_end.size > 0
66
+
67
+ if ial_at_beginning && ial_at_end
68
+ doc.maruku_error("Found two conflicting IALs: #{ial_at_beginning.inspect} and #{ial_at_end.inspect}",
69
+ src, context)
70
+ end
74
71
 
75
- if ial_at_beginning && ial_at_end
76
- e = "Found two conflicting IALs: #{ial_at_beginning.inspect} and #{ial_at_end.inspect}"
77
- doc.maruku_error(e, src, context)
78
- end
79
-
80
- al_string = ial_at_beginning || ial_at_end
81
- al = nil
82
-
83
- if al_string =~ /^\{(.*)\}\s*$/
84
- inside = $1
85
- cs = MaRuKu::In::Markdown::SpanLevelParser::CharSource
86
- al = al_string &&
87
- doc.read_attribute_list(cs.new(inside), its_context=nil, break_on=[nil])
88
- end
89
-
90
- src = MaRuKu::In::Markdown::BlockLevelParser::LineSource.new(lines)
91
- children = doc.parse_blocks(src)
72
+ al_string = ial_at_beginning || ial_at_end
73
+ al = nil
92
74
 
93
- context.push doc.md_div(children, al)
94
- true
95
- })
96
-
75
+ if al_string =~ /^\{(.*)\}\s*$/
76
+ al = al_string && doc.read_attribute_list(
77
+ MaRuKu::In::Markdown::SpanLevelParser::CharSource.new($1),
78
+ nil, [nil])
79
+ end
97
80
 
98
- module MaRuKu; class MDElement
81
+ context.push(
82
+ doc.md_div(
83
+ doc.parse_blocks(
84
+ MaRuKu::In::Markdown::BlockLevelParser::LineSource.new(lines)),
85
+ al))
86
+ true
87
+ end)
99
88
 
100
- def md_div(children, al=nil)
101
- type = label = num = nil
102
- doc.refid2ref ||= {}
103
- if al
104
- al.each do |k, v|
105
- case k
106
- when :class
107
- type = $1 if v =~ /^num_(\w*)/
108
- when :id
109
- label = v
110
- end
111
- end
112
- end
113
- if type
114
- doc.refid2ref[type] ||= {}
115
- num = doc.refid2ref[type].length + 1 || 1
116
- end
117
- e = self.md_el(:div, children, meta={:label => label, :type => type, :num => num}, al)
118
- if type && label
119
- doc.refid2ref[type].update({label => e})
120
- end
121
- e
122
- end
123
-
124
- end end
89
+ module MaRuKu
90
+ class MDElement
91
+ def md_div(children, al = nil)
92
+ type = label = num = nil
93
+ doc.refid2ref ||= {}
94
+ if al
95
+ al.each do |k, v|
96
+ case k
97
+ when :class; type = $1 if v =~ /^num_(\w*)/
98
+ when :id; label = v
99
+ end
100
+ end
101
+ end
125
102
 
103
+ if type
104
+ doc.refid2ref[type] ||= {}
105
+ num = doc.refid2ref[type].length + 1
106
+ if !label
107
+ doc.id_counter += 1
108
+ label = "div_" + doc.id_counter.to_s
109
+ end
110
+ end
126
111
 
127
- module MaRuKu; module Out; module HTML
112
+ e = self.md_el(:div, children, {:label => label, :type => type, :num => num}, al)
113
+ doc.refid2ref[type].update(label => e) if type && label
114
+ e
115
+ end
116
+ end
128
117
 
129
- def to_html_div
130
- add_ws wrap_as_element('div')
131
- end
132
-
133
- end end end
118
+ module Out
119
+ module HTML
120
+ def to_html_div
121
+ add_ws wrap_as_element('div')
122
+ end
123
+ end
124
+ end
125
+ end