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
@@ -0,0 +1,97 @@
1
+ # fenced_code.rb -- Maruku extension for fenced code blocks
2
+ #
3
+ # Copyright (C) 2009 Jason R. Blevins
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # * Redistributions of source code must retain the above copyright notice,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # * Neither the names of the copyright holders nor the names of any
17
+ # contributors may be used to endorse or promote products derived from this
18
+ # software without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+
32
+
33
+ # Fenced code blocks begin with three or more tildes and are terminated
34
+ # by a closing line with at least as many tildes as the opening line.
35
+ # Optionally, an attribute list may appear at the end of the opening
36
+ # line. For example:
37
+ #
38
+ # ~~~~~~~~~~~~~ {: lang=ruby }
39
+ # puts 'Hello world'
40
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41
+ #
42
+ # Or:
43
+ #
44
+ # ```ruby
45
+ # puts 'Hello world'
46
+ # ```
47
+ #
48
+
49
+ #=begin maruku_doc
50
+ # Attribute: :fenced_code_blocks
51
+ # Scope: global, document
52
+ # Summary: Enables fenced code blocks
53
+ #=end
54
+
55
+ module Maruku::In::Markdown
56
+ module FencedCode
57
+ OpenFence = /^([`~]{3,})(\w+)?\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*$/
58
+ end
59
+ end
60
+
61
+ MaRuKu::In::Markdown::register_block_extension(
62
+ :regexp => Maruku::In::Markdown::FencedCode::OpenFence,
63
+ :handler => lambda do |doc, src, context|
64
+ return false unless doc.get_setting :fenced_code_blocks
65
+
66
+ first = src.shift_line
67
+ first =~ Maruku::In::Markdown::FencedCode::OpenFence
68
+ close_fence = /^#{$1}[`~]*$/
69
+ lang = $2
70
+ ial = $3
71
+
72
+ lines = []
73
+
74
+ # read until CloseFence
75
+ while src.cur_line
76
+ if src.cur_line =~ close_fence
77
+ src.shift_line
78
+ break
79
+ else
80
+ lines << src.shift_line
81
+ end
82
+ end
83
+
84
+ ial = nil unless ial && ial.size > 0
85
+ al = nil
86
+
87
+ if ial =~ /^\{(.*?)\}\s*$/
88
+ inside = $1
89
+ cs = MaRuKu::In::Markdown::SpanLevelParser::CharSource
90
+ al = ial && doc.read_attribute_list(cs.new(inside))
91
+ end
92
+
93
+ source = "\n" + lines.join("\n") + "\n"
94
+ context.push doc.md_codeblock(source, lang, al)
95
+ true
96
+ end
97
+ )
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  require 'maruku/ext/math/elements'
4
2
  require 'maruku/ext/math/parsing'
5
3
  require 'maruku/ext/math/to_latex'
@@ -10,32 +8,30 @@ require 'maruku/ext/math/mathml_engines/ritex'
10
8
  require 'maruku/ext/math/mathml_engines/itex2mml'
11
9
  require 'maruku/ext/math/mathml_engines/blahtex'
12
10
 
13
-
14
- =begin maruku_doc
15
- Attribute: math_enabled
16
- Scope: global, document
17
- Summary: Enables parsing of LaTeX math
18
-
19
- To explicitly disable the math parsing:
20
-
21
- Maruku.new(string, {:math_enabled => false})
22
- {:ruby}
23
-
24
- =end
11
+ #=begin maruku_doc
12
+ # Attribute: math_enabled
13
+ # Scope: global, document
14
+ # Summary: Enables parsing of LaTeX math
15
+ #
16
+ # To explicitly disable the math parsing:
17
+ #
18
+ # Maruku.new(string, {:math_enabled => false})
19
+ # {:ruby}
20
+ #
21
+ #=end
25
22
 
26
23
  MaRuKu::Globals[:math_enabled] = true
27
24
 
28
25
 
29
- =begin maruku_doc
30
- Attribute: math_numbered
31
- Scope: global, document
32
- Summary: Math openings which should be numerated
33
-
34
- Array containing any of `'\\['`, `'\\begin{equation}'`, `'$$'`.
35
-
36
- MaRuKu::Globals[:math_numbered] = ['\\[']
37
-
38
- =end
39
-
26
+ #=begin maruku_doc
27
+ # Attribute: math_numbered
28
+ # Scope: global, document
29
+ # Summary: Math openings which should be numerated
30
+ #
31
+ # Array containing any of `'\\['`, `'\\begin{equation}'`, `'$$'`.
32
+ #
33
+ # MaRuKu::Globals[:math_numbered] = ['\\[']
34
+ #
35
+ #=end
40
36
 
41
- MaRuKu::Globals[:math_numbered] = []
37
+ MaRuKu::Globals[:math_numbered] = []
@@ -1,27 +1,21 @@
1
- module MaRuKu; class MDElement
2
-
3
- def md_inline_math(math)
4
- self.md_el(:inline_math, [], meta={:math=>math})
5
- end
1
+ module MaRuKu
2
+ class MDElement
3
+ def md_inline_math(math)
4
+ self.md_el(:inline_math, [], :math => math)
5
+ end
6
6
 
7
- def md_equation(math, label, numerate)
8
- reglabel= /\\label\{(\w+)\}/
9
- if math =~ reglabel
10
- label = $1
11
- math.gsub!(reglabel,'')
12
- end
13
- # puts "Found label = #{label} math #{math.inspect} "
14
- num = nil
15
- if (label || numerate) && @doc #take number
16
- @doc.eqid2eq ||= {}
17
- num = @doc.eqid2eq.size + 1
18
- label = "eq#{num}" if not label # FIXME do id for document
19
- end
20
- e = self.md_el(:equation, [], meta={:math=>math, :label=>label,:num=>num})
21
- if label && @doc #take number
22
- @doc.eqid2eq[label] = e
23
- end
24
- e
25
- end
26
-
27
- end end
7
+ def md_equation(math, label, numerate)
8
+ reglabel = /\\label\{(\w+)\}/
9
+ math = math.gsub(reglabel, '') if label = math[reglabel, 1]
10
+ num = nil
11
+ if (label || numerate) && @doc # take number
12
+ @doc.eqid2eq ||= {}
13
+ num = @doc.eqid2eq.size + 1
14
+ label = "eq#{num}" unless label # TODO do id for document
15
+ end
16
+ e = self.md_el(:equation, [], :math => math, :label => label, :num => num)
17
+ @doc.eqid2eq[label] = e if label && @doc # take number
18
+ e
19
+ end
20
+ end
21
+ end
@@ -1,107 +1,95 @@
1
-
2
- require 'tempfile'
3
1
  require 'fileutils'
4
2
  require 'digest/md5'
5
- require 'pstore'
6
-
7
- module MaRuKu; module Out; module HTML
8
-
9
- PNG = Struct.new(:src,:depth,:height)
10
-
11
- def convert_to_png_blahtex(kind, tex)
12
- begin
13
- FileUtils::mkdir_p get_setting(:html_png_dir)
14
-
15
- # first, we check whether this image has already been processed
16
- md5sum = Digest::MD5.hexdigest(tex+" params: ")
17
- result_file = File.join(get_setting(:html_png_dir), md5sum+".txt")
18
-
19
- if not File.exists?(result_file)
20
- tmp_in = Tempfile.new('maruku_blahtex')
21
- f = tmp_in.open
22
- f.write tex
23
- f.close
24
-
25
- resolution = get_setting(:html_png_resolution)
26
-
27
- options = "--png --use-preview-package --shell-dvipng 'dvipng -D #{resolution}' "
28
- options += "--displaymath " if kind == :equation
29
- options += ("--temp-directory '%s' " % get_setting(:html_png_dir))
30
- options += ("--png-directory '%s'" % get_setting(:html_png_dir))
31
-
32
- cmd = "blahtex #{options} < #{tmp_in.path} > #{result_file}"
33
- #$stderr.puts "$ #{cmd}"
34
- system cmd
35
- tmp_in.delete
36
- end
37
-
3
+ require 'rexml/document'
4
+
5
+ module MaRuKu::Out::HTML
6
+ PNG = Struct.new(:src, :depth, :height)
7
+
8
+ def convert_to_png_blahtex(kind, tex)
9
+ FileUtils.mkdir_p get_setting(:html_png_dir)
10
+
11
+ # first, we check whether this image has already been processed
12
+ md5sum = Digest::MD5.hexdigest(tex + " params: ")
13
+ result_file = File.join(get_setting(:html_png_dir), md5sum + ".txt")
14
+
15
+ if File.exists?(result_file)
38
16
  result = File.read(result_file)
39
- if result.nil? || result.empty?
40
- raise "Blahtex error: empty output"
41
- end
42
-
43
- doc = Document.new(result, {:respect_whitespace =>:all})
44
- png = doc.root.elements[1]
45
- if png.name != 'png'
46
- raise "Blahtex error: \n#{doc}"
47
- end
48
- depth = png.elements['depth'] || (raise "No depth element in:\n #{doc}")
49
- height = png.elements['height'] || (raise "No height element in:\n #{doc}")
50
- md5 = png.elements['md5'] || (raise "No md5 element in:\n #{doc}")
51
-
52
- depth = depth.text.to_f
53
- height = height.text.to_f # XXX check != 0
54
- md5 = md5.text
55
-
56
- dir_url = get_setting(:html_png_url)
57
- return PNG.new("#{dir_url}#{md5}.png", depth, height)
58
- rescue Exception => e
59
- maruku_error "Error: #{e}"
60
- end
61
- nil
62
- end
63
-
64
-
65
- def convert_to_mathml_blahtex(kind, tex)
66
- @@BlahtexCache = PStore.new(get_setting(:latex_cache_file))
67
-
68
- begin
69
- @@BlahtexCache.transaction do
70
- if @@BlahtexCache[tex].nil?
71
- tmp_in = Tempfile.new('maruku_blahtex')
72
- f = tmp_in.open
73
- f.write tex
74
- f.close
75
- tmp_out = Tempfile.new('maruku_blahtex')
76
-
77
- options = "--mathml"
78
- cmd = "blahtex #{options} < #{tmp_in.path} > #{tmp_out.path}"
79
- #$stderr.puts "$ #{cmd}"
80
- system cmd
81
- tmp_in.delete
82
-
83
- result = nil
84
- File.open(tmp_out.path) do |f| result=f.read end
85
- puts result
86
-
87
- @@BlahtexCache[tex] = result
88
- end
89
-
90
- blahtex = @@BlahtexCache[tex]
91
- doc = Document.new(blahtex, {:respect_whitespace =>:all})
92
- mathml = doc.root.elements['mathml']
93
- if not mathml
94
- maruku_error "Blahtex error: \n#{doc}"
95
- return nil
96
- else
97
- return mathml
98
- end
99
- end
100
-
101
- rescue Exception => e
102
- maruku_error "Error: #{e}"
103
- end
104
- nil
105
- end
106
-
107
- end end end
17
+ else
18
+ args = [
19
+ '--png',
20
+ '--use-preview-package',
21
+ '--shell-dvipng',
22
+ "dvipng -D #{Shellwords.shellescape(get_setting(:html_png_resolution).to_s)}",
23
+ "--temp-directory #{Shellwords.shellescape(get_setting(:html_png_dir))}",
24
+ "--png-directory #{Shellwords.shellescape(get_setting(:html_png_dir))}"
25
+ ]
26
+ args << '--displaymath' if kind == :equation
27
+
28
+ result = run_blahtex(tex, args)
29
+ end
30
+
31
+ if result.nil? || result.empty?
32
+ maruku_error "Blahtex error: empty output"
33
+ return
34
+ end
35
+
36
+ doc = REXML::Document.new(result)
37
+ png = doc.root.elements.to_a.first
38
+ if png.name != 'png'
39
+ maruku_error "Blahtex error: \n#{doc}"
40
+ return
41
+ end
42
+
43
+ raise "No depth element in:\n #{doc}" unless depth = png.xpath('//depth')[0]
44
+ raise "No height element in:\n #{doc}" unless height = png.xpath('//height')[0]
45
+ raise "No md5 element in:\n #{doc}" unless md5 = png.xpath('//md5')[0]
46
+
47
+ depth = depth.text.to_f
48
+ height = height.text.to_f
49
+ raise "Height or depth was 0! in \n #{doc}" if height == 0 || depth == 0
50
+
51
+ md5 = md5.text
52
+
53
+ PNG.new("#{get_setting(:html_png_url)}#{md5}.png", depth, height)
54
+ rescue => e
55
+ maruku_error "Error: #{e}"
56
+ nil
57
+ end
58
+
59
+ def convert_to_mathml_blahtex(kind, tex)
60
+ result = run_blahtex(tex, %w[--mathml])
61
+
62
+ doc = REXML::Document.new(result)
63
+ mathml = doc.get_elements('//markup').to_a.first
64
+ unless mathml
65
+ maruku_error "Blahtex error: \n#{doc}"
66
+ return nil
67
+ end
68
+
69
+ mathml.name = 'math'
70
+ mathml.attributes['xmlns'] = "http://www.w3.org/1998/Math/MathML"
71
+ mathml.attributes['display'] = (kind == :inline) ? :inline : :block
72
+
73
+ MaRuKu::HTMLFragment.new(mathml.to_s)
74
+ rescue => e
75
+ maruku_error "Error: #{e}"
76
+ nil
77
+ end
78
+
79
+ private
80
+
81
+ # Run blahtex, return output
82
+ def run_blahtex(tex, args)
83
+ IO.popen(['blahtex', *args], 'w+') do |blahtex|
84
+ blahtex.write tex
85
+ blahtex.close_write
86
+
87
+ output = blahtex.read
88
+ blahtex.close_read
89
+
90
+ raise "Error running blahtex" unless $?.success?
91
+
92
+ output
93
+ end
94
+ end
95
+ end
@@ -1,29 +1,36 @@
1
+ module MaRuKu::Out::HTML
2
+ def convert_to_mathml_itex2mml(kind, tex)
3
+ return if $already_warned_itex2mml
4
+ begin
5
+ require 'itextomml'
6
+ rescue LoadError => e
7
+ maruku_error "Could not load package 'itex2mml'.\nPlease install it." unless $already_warned_itex2mml
8
+ $already_warned_itex2mml = true
9
+ return nil
10
+ end
1
11
 
2
- module MaRuKu; module Out; module HTML
12
+ begin
13
+ require 'instiki_stringsupport'
14
+ rescue LoadError
15
+ require 'itex_stringsupport'
16
+ end
3
17
 
4
- def convert_to_mathml_itex2mml(kind, tex)
5
- begin
6
- if not $itex2mml_parser
7
- require 'itextomml'
8
- $itex2mml_parser = Itex2MML::Parser.new
9
- end
10
-
11
- itex_method = {:equation=>:block_filter,:inline=>:inline_filter}
12
-
13
- mathml = $itex2mml_parser.send(itex_method[kind], tex)
14
- doc = Document.new(mathml, {:respect_whitespace =>:all}).root
15
- return doc
16
- rescue LoadError => e
17
- maruku_error "Could not load package 'itex2mml'.\n"+ "Please install it." unless $already_warned_itex2mml
18
- $already_warned_itex2mml = true
19
- rescue REXML::ParseException => e
20
- maruku_error "Invalid MathML TeX: \n#{add_tabs(tex,1,'tex>')}"+
21
- "\n\n #{e.inspect}"
22
- rescue
23
- maruku_error "Could not produce MathML TeX: \n#{tex}"+
24
- "\n\n #{e.inspect}"
25
- end
26
- nil
27
- end
18
+ parser = Itex2MML::Parser.new
19
+ mathml =
20
+ case kind
21
+ when :equation
22
+ parser.block_filter(tex)
23
+ when :inline
24
+ parser.inline_filter(tex)
25
+ else
26
+ maruku_error "Unknown itex2mml kind: #{kind}"
27
+ return
28
+ end
29
+
30
+ MaRuKu::HTMLFragment.new(mathml.to_utf8)
31
+ rescue => e
32
+ maruku_error "Invalid MathML TeX: \n#{tex.gsub(/^/, 'tex>')}\n\n #{e.inspect}"
33
+ nil
34
+ end
35
+ end
28
36
 
29
- end end end