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,20 +1,12 @@
1
- module MaRuKu; module Out; module HTML
2
-
3
- def convert_to_mathml_none(kind, tex)
4
- # You can: either return a REXML::Element
5
- # return Element.new 'div'
6
- # or return an empty array on error
7
- # return []
8
- # or have a string parsed by REXML:
9
- tex = tex.gsub('&','&')
10
- mathml = "<code>#{tex}</code>"
11
- return Document.new(mathml).root
12
- end
13
-
14
- def convert_to_png_none(kind, tex)
15
- return nil
16
- end
17
-
18
-
19
- end end end
1
+ module MaRuKu::Out::HTML
2
+ def convert_to_mathml_none(kind, tex)
3
+ code = xelem('code')
4
+ tex_node = xtext(tex)
5
+ code << tex_node
6
+ end
7
+
8
+ def convert_to_png_none(kind, tex)
9
+ nil
10
+ end
11
+ end
20
12
 
@@ -1,5 +1,4 @@
1
- module MaRuKu; module Out; module HTML
2
-
1
+ module MaRuKu::Out::HTML
3
2
  def convert_to_mathml_ritex(kind, tex)
4
3
  begin
5
4
  if not $ritex_parser
@@ -20,5 +19,4 @@ module MaRuKu; module Out; module HTML
20
19
  end
21
20
  nil
22
21
  end
23
-
24
- end end end
22
+ end
@@ -1,119 +1,113 @@
1
1
  module MaRuKu
2
-
3
- class MDDocument
4
- # Hash equation id (String) to equation element (MDElement)
5
- safe_attr_accessor :eqid2eq, Hash
6
-
7
- def is_math_enabled?
8
- get_setting :math_enabled
9
- end
10
- end
2
+ class MDDocument
3
+ # A hash of equation ids to equation elements
4
+ #
5
+ # @return [String => MDElement]
6
+ attr_accessor :eqid2eq
7
+
8
+ def is_math_enabled?
9
+ get_setting :math_enabled
10
+ end
11
+ end
11
12
  end
12
13
 
14
+ # TODO: Properly scope all these regexps
15
+ # Everything goes; takes care of escaping the "\$" inside the expression
16
+ RegInlineMath = /\${1}((?:[^\$]|\\\$)+)\$/
17
+
18
+ MaRuKu::In::Markdown.register_span_extension(
19
+ :chars => '$',
20
+ :regexp => RegInlineMath,
21
+ :handler => lambda do |doc, src, con|
22
+ next false unless doc.is_math_enabled?
23
+ next false unless m = src.read_regexp(RegInlineMath)
24
+ math = m.captures.compact.first
25
+ con.push doc.md_inline_math(math)
26
+ true
27
+ end)
28
+
29
+
30
+ MathOpen1 = Regexp.escape('\\begin{equation}')
31
+ MathClose1 = Regexp.escape('\\end{equation}')
32
+ MathOpen2 = Regexp.escape('\\[')
33
+ MathClose2 = Regexp.escape('\\]')
34
+ MathOpen3 = Regexp.escape('$$')
35
+ MathClose3 = Regexp.escape('$$')
36
+
37
+ EqLabel = /(?:\((\w+)\))/
38
+ EquationOpen = /#{MathOpen1}|#{MathOpen2}|#{MathOpen3}/
39
+ EquationClose = /#{MathClose1}|#{MathClose2}|#{MathClose3}/
40
+
41
+ # $1 is opening, $2 is tex
42
+ EquationStart = /^[ ]{0,3}(#{EquationOpen})(.*)$/
43
+ # $1 is tex, $2 is closing, $3 is tex
44
+ EquationEnd = /^(.*)(#{EquationClose})\s*#{EqLabel}?\s*$/
45
+ # $1 is opening, $2 is tex, $3 is closing, $4 is label
46
+ OneLineEquation = /^[ ]{0,3}(#{EquationOpen})(.*)(#{EquationClose})\s*#{EqLabel}?\s*$/
47
+
48
+ MaRuKu::In::Markdown.register_block_extension(
49
+ :regexp => EquationStart,
50
+ :handler => lambda do |doc, src, con|
51
+ next false unless doc.is_math_enabled?
52
+ first = src.shift_line
53
+ if first =~ OneLineEquation
54
+ opening, tex, closing, label = $1, $2, $3, $4
55
+ numerate = doc.get_setting(:math_numbered).include?(opening)
56
+ con.push doc.md_equation(tex, label, numerate)
57
+ next true
58
+ end
59
+
60
+ opening, tex = first.scan(EquationStart).first
61
+ # ensure newline at end of first line of equation isn't swallowed
62
+ tex << "\n"
63
+ numerate = doc.get_setting(:math_numbered).include?(opening)
64
+ label = nil
65
+ loop do
66
+ unless src.cur_line
67
+ doc.maruku_error(
68
+ "Stream finished while reading equation\n\n" + tex.gsub(/^/, '$> '),
69
+ src, con)
70
+ break
71
+ end
72
+
73
+ line = src.shift_line
74
+ if line =~ EquationEnd
75
+ tex_line, closing = $1, $2
76
+ label = $3 if $3
77
+ tex << tex_line << "\n"
78
+ break
79
+ end
80
+
81
+ tex << line << "\n"
82
+ end
83
+ con.push doc.md_equation(tex, label, numerate)
84
+ true
85
+ end)
86
+
13
87
 
14
- # Everything goes; takes care of escaping the "\$" inside the expression
15
- RegInlineMath = /\${1}((?:[^\$]|\\\$)+)\$/
16
-
17
- MaRuKu::In::Markdown::register_span_extension(
18
- :chars => ?$,
19
- :regexp => RegInlineMath,
20
- :handler => lambda { |doc, src, con|
21
- return false if not doc.is_math_enabled?
22
-
23
- if m = src.read_regexp(RegInlineMath)
24
- math = m.captures.compact.first
25
- con.push doc.md_inline_math(math)
26
- true
27
- else
28
- #puts "not math: #{src.cur_chars 10}"
29
- false
30
- end
31
- }
32
- )
33
-
34
-
35
- MathOpen1 = Regexp.escape('\\begin{equation}')
36
- MathClose1 = Regexp.escape('\\end{equation}')
37
- MathOpen2 = Regexp.escape('\\[')
38
- MathClose2 = Regexp.escape('\\]')
39
- MathOpen3 = Regexp.escape('$$')
40
- MathClose3 = Regexp.escape('$$')
41
-
42
- EqLabel = /(?:\((\w+)\))/
43
- EquationOpen = /#{MathOpen1}|#{MathOpen2}|#{MathOpen3}/
44
- EquationClose = /#{MathClose1}|#{MathClose2}|#{MathClose3}/
45
-
46
- # $1 is opening, $2 is tex
47
- EquationStart = /^[ ]{0,3}(#{EquationOpen})(.*)$/
48
- # $1 is tex, $2 is closing, $3 is tex
49
- EquationEnd = /^(.*)(#{EquationClose})\s*#{EqLabel}?\s*$/
50
- # $1 is opening, $2 is tex, $3 is closing, $4 is label
51
- OneLineEquation = /^[ ]{0,3}(#{EquationOpen})(.*)(#{EquationClose})\s*#{EqLabel}?\s*$/
88
+ # This adds support for \eqref
89
+ RegEqrefLatex = /\\eqref\{(\w+?)\}/
90
+ RegEqPar = /\(eq:(\w+?)\)/
91
+ RegEqref = Regexp.union(RegEqrefLatex, RegEqPar)
52
92
 
53
- MaRuKu::In::Markdown::register_block_extension(
54
- :regexp => EquationStart,
55
- :handler => lambda { |doc, src, con|
56
- return false if not doc.is_math_enabled?
57
- first = src.shift_line
58
- if first =~ OneLineEquation
59
- opening, tex, closing, label = $1, $2, $3, $4
60
- numerate = doc.get_setting(:math_numbered).include?(opening)
61
- con.push doc.md_equation(tex, label, numerate)
62
- else
63
- first =~ EquationStart
64
- opening, tex = $1, $2
65
-
66
- numerate = doc.get_setting(:math_numbered).include?(opening)
67
- label = nil
68
- while true
69
- if not src.cur_line
70
- doc.maruku_error("Stream finished while reading equation\n\n"+
71
- doc.add_tabs(tex,1,'$> '), src, con)
72
- break
73
- end
74
- line = src.shift_line
75
- if line =~ EquationEnd
76
- tex_line, closing = $1, $2
77
- label = $3 if $3
78
- tex += tex_line + "\n"
79
- break
80
- else
81
- tex += line + "\n"
82
- end
83
- end
84
- con.push doc.md_equation(tex, label, numerate)
85
- end
86
- true
87
- })
88
-
89
-
90
- # This adds support for \eqref
91
- RegEqrefLatex = /\\eqref\{(\w+)\}/
92
- RegEqPar = /\(eq:(\w+)\)/
93
- RegEqref = Regexp::union(RegEqrefLatex, RegEqPar)
94
-
95
- MaRuKu::In::Markdown::register_span_extension(
96
- :chars => [?\\, ?(],
97
- :regexp => RegEqref,
98
- :handler => lambda { |doc, src, con|
99
- return false if not doc.is_math_enabled?
100
- eqid = src.read_regexp(RegEqref).captures.compact.first
101
- r = doc.md_el(:eqref, [], meta={:eqid=>eqid})
102
- con.push r
103
- true
104
- }
105
- )
93
+ MaRuKu::In::Markdown.register_span_extension(
94
+ :chars => ["\\", '('],
95
+ :regexp => RegEqref,
96
+ :handler => lambda do |doc, src, con|
97
+ return false unless doc.is_math_enabled?
98
+ eqid = src.read_regexp(RegEqref).captures.compact.first
99
+ con.push doc.md_el(:eqref, [], :eqid => eqid)
100
+ true
101
+ end)
106
102
 
107
- # This adds support for \ref
108
- RegRef = /\\ref\{(\w*)\}/
109
- MaRuKu::In::Markdown::register_span_extension(
110
- :chars => [?\\, ?(],
111
- :regexp => RegRef,
112
- :handler => lambda { |doc, src, con|
113
- return false if not doc.is_math_enabled?
114
- refid = src.read_regexp(RegRef).captures.compact.first
115
- r = doc.md_el(:divref, [], meta={:refid=>refid})
116
- con.push r
117
- true
118
- }
119
- )
103
+ # This adds support for \ref
104
+ RegRef = /\\ref\{(\w*?)\}/
105
+ MaRuKu::In::Markdown.register_span_extension(
106
+ :chars => ["\\", '('],
107
+ :regexp => RegRef,
108
+ :handler => lambda do |doc, src, con|
109
+ return false unless doc.is_math_enabled?
110
+ refid = src.read_regexp(RegRef).captures.compact.first
111
+ con.push doc.md_el(:divref, [], :refid => refid)
112
+ true
113
+ end)
@@ -1,187 +1,184 @@
1
-
2
- =begin maruku_doc
3
- Extension: math
4
- Attribute: html_math_engine
5
- Scope: document, element
6
- Output: html
7
- Summary: Select the rendering engine for MathML.
8
- Default: <?mrk Globals[:html_math_engine].to_s ?>
9
-
10
- Select the rendering engine for math.
11
-
12
- If you want to use your custom engine `foo`, then set:
13
-
14
- HTML math engine: foo
15
- {:lang=markdown}
16
-
17
- and then implement two functions:
18
-
19
- def convert_to_mathml_foo(kind, tex)
20
- ...
21
- end
22
- =end
23
-
24
- =begin maruku_doc
25
- Extension: math
26
- Attribute: html_png_engine
27
- Scope: document, element
28
- Output: html
29
- Summary: Select the rendering engine for math.
30
- Default: <?mrk Globals[:html_math_engine].to_s ?>
31
-
32
- Same thing as `html_math_engine`, only for PNG output.
33
-
34
- def convert_to_png_foo(kind, tex)
35
- # same thing
36
- ...
37
- end
38
- {:lang=ruby}
39
-
40
- =end
41
-
42
- module MaRuKu; module Out; module HTML
43
-
44
-
45
-
46
- # Creates an xml Mathml document of self.math
47
- def render_mathml(kind, tex)
48
- engine = get_setting(:html_math_engine)
49
- method = "convert_to_mathml_#{engine}".to_sym
50
- if self.respond_to? method
51
- mathml = self.send(method, kind, tex)
52
- return mathml || convert_to_mathml_none(kind, tex)
53
- else
54
- puts "A method called #{method} should be defined."
55
- return convert_to_mathml_none(kind, tex)
56
- end
57
- end
58
-
59
- # Creates an xml Mathml document of self.math
60
- def render_png(kind, tex)
61
- engine = get_setting(:html_png_engine)
62
- method = "convert_to_png_#{engine}".to_sym
63
- if self.respond_to? method
64
- return self.send(method, kind, tex)
65
- else
66
- puts "A method called #{method} should be defined."
67
- return nil
68
- end
69
- end
70
-
71
- def pixels_per_ex
72
- if not $pixels_per_ex
73
- x = render_png(:inline, "x")
74
- $pixels_per_ex = x.height # + x.depth
75
- end
76
- $pixels_per_ex
77
- end
78
-
79
- def adjust_png(png, use_depth)
80
- src = png.src
81
-
82
- height_in_px = png.height
83
- depth_in_px = png.depth
84
- height_in_ex = height_in_px / pixels_per_ex
85
- depth_in_ex = depth_in_px / pixels_per_ex
86
- total_height_in_ex = height_in_ex + depth_in_ex
87
- style = ""
88
- style += "vertical-align: -#{depth_in_ex}ex;" if use_depth
89
- style += "height: #{total_height_in_ex}ex;"
90
- img = Element.new 'img'
91
- img.attributes['src'] = src
92
- img.attributes['style'] = style
93
- img.attributes['alt'] = "$#{self.math.strip}$"
94
- img
95
- end
96
-
97
- def to_html_inline_math
98
- mathml = get_setting(:html_math_output_mathml) && render_mathml(:inline, self.math)
99
- png = get_setting(:html_math_output_png) && render_png(:inline, self.math)
100
-
101
- span = create_html_element 'span'
102
- add_class_to(span, 'maruku-inline')
103
-
104
- if mathml
105
- add_class_to(mathml, 'maruku-mathml')
106
- return mathml
107
- end
108
-
109
- if png
110
- img = adjust_png(png, use_depth=true)
111
- add_class_to(img, 'maruku-png')
112
- span << img
113
- end
114
- span
115
-
116
- end
117
-
118
- def to_html_equation
119
- mathml = get_setting(:html_math_output_mathml) && render_mathml(:equation, self.math)
120
- png = get_setting(:html_math_output_png) && render_png(:equation, self.math)
121
-
122
- div = create_html_element 'div'
123
- add_class_to(div, 'maruku-equation')
124
- if mathml
125
- add_class_to(mathml, 'maruku-mathml')
126
- div << mathml
127
- end
128
-
129
- if png
130
- img = adjust_png(png, use_depth=false)
131
- add_class_to(img, 'maruku-png')
132
- div << img
133
- end
134
-
135
- source_span = Element.new 'span'
136
- add_class_to(source_span, 'maruku-eq-tex')
137
- code = convert_to_mathml_none(:equation, self.math.strip)
138
- code.attributes['style'] = 'display: none'
139
- source_span << code
140
- div << source_span
141
-
142
- if self.label # then numerate
143
- span = Element.new 'span'
144
- span.attributes['class'] = 'maruku-eq-number'
145
- num = self.num
146
- span << Text.new("(#{num})")
147
- div << span
148
- div.attributes['id'] = "eq:#{self.label}"
149
- end
150
- div
151
- end
152
-
153
- def to_html_eqref
154
- if eq = self.doc.eqid2eq[self.eqid]
155
- num = eq.num
156
- a = Element.new 'a'
157
- a.attributes['class'] = 'maruku-eqref'
158
- a.attributes['href'] = "#eq:#{self.eqid}"
159
- a << Text.new("(#{num})")
160
- a
161
- else
162
- maruku_error "Cannot find equation #{self.eqid.inspect}"
163
- Text.new "(eq:#{self.eqid})"
164
- end
165
- end
166
-
167
- def to_html_divref
168
- ref= nil
169
- self.doc.refid2ref.each_value { |h|
170
- ref = h[self.refid] if h.has_key?(self.refid)
171
- }
172
- if ref
173
- num = ref.num
174
- a = Element.new 'a'
175
- a.attributes['class'] = 'maruku-ref'
176
- a.attributes['href'] = "#" + self.refid
177
- a << Text.new(num.to_s)
178
- a
179
- else
180
- maruku_error "Cannot find div #{self.refid.inspect}"
181
- Text.new "\\ref{#{self.refid}}"
182
- end
183
- end
184
-
185
- end end end
186
-
187
-
1
+ #=begin maruku_doc
2
+ # Extension: math
3
+ # Attribute: html_math_engine
4
+ # Scope: document, element
5
+ # Output: html
6
+ # Summary: Select the rendering engine for MathML.
7
+ # Default: <?mrk Globals[:html_math_engine].to_s ?>
8
+ #
9
+ # Select the rendering engine for math.
10
+ #
11
+ # If you want to use your custom engine `foo`, then set:
12
+ #
13
+ # HTML math engine: foo
14
+ # {:lang=markdown}
15
+ #
16
+ # and then implement two functions:
17
+ #
18
+ # def convert_to_mathml_foo(kind, tex)
19
+ # ...
20
+ # end
21
+ #=end
22
+
23
+ #=begin maruku_doc
24
+ # Extension: math
25
+ # Attribute: html_png_engine
26
+ # Scope: document, element
27
+ # Output: html
28
+ # Summary: Select the rendering engine for math.
29
+ # Default: <?mrk Globals[:html_math_engine].to_s ?>
30
+ #
31
+ # Same thing as `html_math_engine`, only for PNG output.
32
+ #
33
+ # def convert_to_png_foo(kind, tex)
34
+ # # same thing
35
+ # ...
36
+ # end
37
+ # {:lang=ruby}
38
+ #
39
+ #=end
40
+
41
+ module MaRuKu
42
+ module Out
43
+ module HTML
44
+ # Creates an xml Mathml document of this node's TeX code.
45
+ #
46
+ # @return [MaRuKu::Out::HTML::HTMLElement]
47
+ def render_mathml(kind, tex)
48
+ engine = get_setting(:html_math_engine)
49
+ method = "convert_to_mathml_#{engine}"
50
+ if self.respond_to? method
51
+ mathml = self.send(method, kind, tex)
52
+ return mathml || convert_to_mathml_none(kind, tex)
53
+ end
54
+
55
+ # TODO: Warn here
56
+ puts "A method called #{method} should be defined."
57
+ convert_to_mathml_none(kind, tex)
58
+ end
59
+
60
+ # Renders a PNG image of this node's TeX code.
61
+ # Returns
62
+ #
63
+ # @return [MaRuKu::Out::HTML::PNG, nil]
64
+ # A struct describing the location and size of the image,
65
+ # or nil if no library is loaded that can render PNGs.
66
+ def render_png(kind, tex)
67
+ engine = get_setting(:html_png_engine)
68
+ method = "convert_to_png_#{engine}".to_sym
69
+ return self.send(method, kind, tex) if self.respond_to? method
70
+
71
+ puts "A method called #{method} should be defined."
72
+ nil
73
+ end
74
+
75
+ def pixels_per_ex
76
+ $pixels_per_ex ||= render_png(:inline, "x").height
77
+ end
78
+
79
+ def adjust_png(png, use_depth)
80
+ src = png.src
81
+
82
+ height_in_px = png.height
83
+ depth_in_px = png.depth
84
+ height_in_ex = height_in_px / pixels_per_ex
85
+ depth_in_ex = depth_in_px / pixels_per_ex
86
+ total_height_in_ex = height_in_ex + depth_in_ex
87
+ style = ""
88
+ style << "vertical-align: -#{depth_in_ex}ex;" if use_depth
89
+ style << "height: #{total_height_in_ex}ex;"
90
+
91
+ img = xelem('img')
92
+ img['src'] = src
93
+ img['style'] = style
94
+ img['alt'] = "$#{self.math.strip}$"
95
+ img['class'] = 'maruku-png'
96
+ img
97
+ end
98
+
99
+ def to_html_inline_math
100
+ mathml = get_setting(:html_math_output_mathml) && render_mathml(:inline, self.math)
101
+ if mathml
102
+ mathml.add_class('maruku-mathml')
103
+ return mathml.to_html
104
+ end
105
+
106
+ png = get_setting(:html_math_output_png) && render_png(:inline, self.math)
107
+
108
+ HTMLElement.new 'span', 'class' => 'maruku-inline' do
109
+ # TODO: It seems weird that we output an empty span if there's no PNG
110
+ if png
111
+ adjust_png(png, true)
112
+ end
113
+ end
114
+ end
115
+
116
+ def to_html_equation
117
+ mathml = get_setting(:html_math_output_mathml) && render_mathml(:equation, self.math)
118
+ png = get_setting(:html_math_output_png) && render_png(:equation, self.math)
119
+
120
+ div = xelem('div')
121
+ div['class'] = 'maruku-equation'
122
+ if mathml
123
+ if self.label # then numerate
124
+ span = xelem('span')
125
+ span['class'] = 'maruku-eq-number'
126
+ span << xtext("(#{self.num})")
127
+ div << span
128
+ div['id'] = "eq:#{self.label}"
129
+ end
130
+ mathml.add_class('maruku-mathml')
131
+ div << mathml.to_html
132
+ end
133
+
134
+ if png
135
+ img = adjust_png(png, false)
136
+ div << img
137
+ if self.label # then numerate
138
+ span = xelem('span')
139
+ span['class'] = 'maruku-eq-number'
140
+ span << xtext("(#{self.num})")
141
+ div << span
142
+ div['id'] = "eq:#{self.label}"
143
+ end
144
+ end
145
+
146
+ source_span = xelem('span')
147
+ add_class_to(source_span, 'maruku-eq-tex')
148
+ code = convert_to_mathml_none(:equation, self.math.strip)
149
+ code['style'] = 'display: none'
150
+ source_span << code
151
+ div << source_span
152
+
153
+ div
154
+ end
155
+
156
+ def to_html_eqref
157
+ unless eq = self.doc.eqid2eq[self.eqid]
158
+ maruku_error "Cannot find equation #{self.eqid.inspect}"
159
+ return xtext("(eq:#{self.eqid})")
160
+ end
161
+
162
+ a = xelem('a')
163
+ a['class'] = 'maruku-eqref'
164
+ a['href'] = "#eq:#{self.eqid}"
165
+ a << xtext("(#{eq.num})")
166
+ a
167
+ end
168
+
169
+ def to_html_divref
170
+ unless hash = self.doc.refid2ref.values.find {|h| h.has_key?(self.refid)}
171
+ maruku_error "Cannot find div #{self.refid.inspect}"
172
+ return xtext("\\ref{#{self.refid}}")
173
+ end
174
+ ref= hash[self.refid]
175
+
176
+ a = xelem('a')
177
+ a['class'] = 'maruku-ref'
178
+ a['href'] = "#" + self.refid
179
+ a << xtext(ref.num.to_s)
180
+ a
181
+ end
182
+ end
183
+ end
184
+ end