maruku 0.6.1 → 0.7.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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