maruku 0.6.0 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (290) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE.txt +20 -0
  3. data/bin/maruku +153 -152
  4. data/bin/marutex +2 -29
  5. data/data/entities.xml +261 -0
  6. data/docs/markdown_syntax.md +9 -21
  7. data/docs/math.md +14 -18
  8. data/lib/maruku.rb +65 -78
  9. data/lib/maruku/attributes.rb +109 -214
  10. data/lib/maruku/defaults.rb +45 -67
  11. data/lib/maruku/document.rb +44 -0
  12. data/lib/maruku/element.rb +138 -0
  13. data/lib/maruku/errors.rb +80 -0
  14. data/lib/maruku/ext/div.rb +105 -113
  15. data/lib/maruku/ext/fenced_code.rb +97 -0
  16. data/lib/maruku/ext/math.rb +22 -26
  17. data/lib/maruku/ext/math/elements.rb +20 -26
  18. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +92 -104
  19. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +33 -26
  20. data/lib/maruku/ext/math/mathml_engines/none.rb +11 -19
  21. data/lib/maruku/ext/math/mathml_engines/ritex.rb +2 -4
  22. data/lib/maruku/ext/math/parsing.rb +121 -115
  23. data/lib/maruku/ext/math/to_html.rb +202 -187
  24. data/lib/maruku/ext/math/to_latex.rb +34 -21
  25. data/lib/maruku/helpers.rb +158 -257
  26. data/lib/maruku/html.rb +251 -0
  27. data/lib/maruku/input/charsource.rb +272 -319
  28. data/lib/maruku/input/extensions.rb +62 -63
  29. data/lib/maruku/input/html_helper.rb +233 -189
  30. data/lib/maruku/input/linesource.rb +90 -110
  31. data/lib/maruku/input/mdline.rb +131 -0
  32. data/lib/maruku/input/parse_block.rb +736 -613
  33. data/lib/maruku/input/parse_doc.rb +145 -217
  34. data/lib/maruku/input/parse_span.rb +740 -0
  35. data/lib/maruku/inspect_element.rb +60 -0
  36. data/lib/maruku/maruku.rb +14 -30
  37. data/lib/maruku/output/entity_table.rb +37 -0
  38. data/lib/maruku/output/s5/fancy.rb +462 -462
  39. data/lib/maruku/output/s5/to_s5.rb +115 -135
  40. data/lib/maruku/output/to_html.rb +907 -983
  41. data/lib/maruku/output/to_latex.rb +571 -563
  42. data/lib/maruku/output/to_markdown.rb +207 -162
  43. data/lib/maruku/output/to_s.rb +10 -52
  44. data/lib/maruku/string_utils.rb +129 -179
  45. data/lib/maruku/toc.rb +185 -196
  46. data/lib/maruku/version.rb +33 -38
  47. data/spec/block_docs/abbrev.md +776 -0
  48. data/{tests/unittest → spec/block_docs}/abbreviations.md +11 -20
  49. data/spec/block_docs/abbreviations2.md +27 -0
  50. data/{tests/unittest → spec/block_docs}/alt.md +2 -14
  51. data/{tests/unittest/pending → spec/block_docs}/amps.md +1 -13
  52. data/spec/block_docs/attribute_sanitize.md +22 -0
  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/spec/block_docs/atx_headers.md +22 -0
  59. data/spec/block_docs/auto_cdata.md +48 -0
  60. data/spec/block_docs/bad_cites.md +30 -0
  61. data/spec/block_docs/bad_divrefs.md +30 -0
  62. data/{tests/unittest → spec/block_docs}/blank.md +0 -12
  63. data/{tests/unittest → spec/block_docs}/blanks_in_code.md +16 -15
  64. data/spec/block_docs/block_quotes.md +66 -0
  65. data/{tests/unittest/loss.md → spec/block_docs/bug_def.md} +6 -18
  66. data/{tests/unittest → spec/block_docs}/bug_table.md +7 -19
  67. data/spec/block_docs/cites.md +37 -0
  68. data/{tests/unittest → spec/block_docs}/code.md +7 -14
  69. data/{tests/unittest → spec/block_docs}/code2.md +4 -14
  70. data/{tests/unittest → spec/block_docs}/code3.md +12 -16
  71. data/spec/block_docs/code4.md +79 -0
  72. data/{tests/unittest → spec/block_docs}/data_loss.md +2 -14
  73. data/spec/block_docs/div_without_newline.md +16 -0
  74. data/{tests/unittest → spec/block_docs}/divs/div1.md +0 -12
  75. data/{tests/unittest → spec/block_docs}/divs/div2.md +0 -12
  76. data/{tests/unittest → spec/block_docs}/divs/div3_nest.md +3 -15
  77. data/{tests/unittest → spec/block_docs}/easy.md +1 -13
  78. data/spec/block_docs/email.md +29 -0
  79. data/spec/block_docs/empty_cells.md +31 -0
  80. data/{tests/unittest → spec/block_docs}/encoding/iso-8859-1.md +1 -14
  81. data/{tests/unittest → spec/block_docs}/encoding/utf-8.md +0 -12
  82. data/{tests/unittest → spec/block_docs}/entities.md +33 -41
  83. data/{tests/unittest/notyet → spec/block_docs}/escape.md +2 -14
  84. data/{tests/unittest → spec/block_docs}/escaping.md +11 -22
  85. data/{tests/unittest → spec/block_docs}/extra_dl.md +2 -13
  86. data/{tests/unittest → spec/block_docs}/extra_header_id.md +14 -20
  87. data/{tests/unittest → spec/block_docs}/extra_table1.md +9 -21
  88. data/spec/block_docs/fenced_code_blocks.md +58 -0
  89. data/spec/block_docs/fenced_code_blocks_highlighted.md +17 -0
  90. data/{tests/unittest → spec/block_docs}/footnotes.md +12 -24
  91. data/spec/block_docs/footnotes2.md +82 -0
  92. data/spec/block_docs/hard.md +25 -0
  93. data/spec/block_docs/header_after_par.md +62 -0
  94. data/{tests/unittest → spec/block_docs}/headers.md +10 -18
  95. data/{tests/unittest → spec/block_docs}/hex_entities.md +7 -18
  96. data/{tests/unittest → spec/block_docs}/hrule.md +5 -12
  97. data/{tests/unittest → spec/block_docs}/html3.md +1 -13
  98. data/{tests/unittest → spec/block_docs}/html4.md +2 -14
  99. data/{tests/unittest → spec/block_docs}/html5.md +2 -14
  100. data/spec/block_docs/html_block_in_para.md +22 -0
  101. data/spec/block_docs/html_inline.md +25 -0
  102. data/spec/block_docs/html_trailing.md +31 -0
  103. data/spec/block_docs/ie.md +62 -0
  104. data/spec/block_docs/iframe.md +29 -0
  105. data/spec/block_docs/ignore_bad_header.md +9 -0
  106. data/{tests/unittest → spec/block_docs}/images.md +22 -28
  107. data/{tests/unittest → spec/block_docs}/images2.md +7 -17
  108. data/{tests/unittest → spec/block_docs}/inline_html.md +37 -67
  109. data/{tests/unittest → spec/block_docs}/inline_html2.md +1 -13
  110. data/spec/block_docs/inline_html_beginning.md +10 -0
  111. data/spec/block_docs/issue106.md +78 -0
  112. data/spec/block_docs/issue115.md +20 -0
  113. data/spec/block_docs/issue117.md +13 -0
  114. data/spec/block_docs/issue120.md +48 -0
  115. data/spec/block_docs/issue123.md +11 -0
  116. data/spec/block_docs/issue124.md +16 -0
  117. data/spec/block_docs/issue126.md +9 -0
  118. data/spec/block_docs/issue130.md +11 -0
  119. data/spec/block_docs/issue20.md +9 -0
  120. data/spec/block_docs/issue26.md +22 -0
  121. data/spec/block_docs/issue29.md +9 -0
  122. data/spec/block_docs/issue30.md +30 -0
  123. data/spec/block_docs/issue31.md +25 -0
  124. data/spec/block_docs/issue40.md +52 -0
  125. data/spec/block_docs/issue64.md +55 -0
  126. data/spec/block_docs/issue67.md +19 -0
  127. data/spec/block_docs/issue70.md +11 -0
  128. data/spec/block_docs/issue72.md +17 -0
  129. data/spec/block_docs/issue74.md +38 -0
  130. data/spec/block_docs/issue79.md +15 -0
  131. data/spec/block_docs/issue83.md +13 -0
  132. data/spec/block_docs/issue85.md +25 -0
  133. data/spec/block_docs/issue88.md +19 -0
  134. data/spec/block_docs/issue89.md +12 -0
  135. data/spec/block_docs/issue90.md +38 -0
  136. data/{tests/unittest/pending → spec/block_docs}/link.md +21 -18
  137. data/{tests/unittest → spec/block_docs}/links.md +33 -32
  138. data/spec/block_docs/links2.md +21 -0
  139. data/{tests/unittest → spec/block_docs}/list1.md +0 -12
  140. data/{tests/unittest → spec/block_docs}/list12.md +2 -14
  141. data/{tests/unittest → spec/block_docs}/list2.md +2 -14
  142. data/spec/block_docs/list_multipara.md +42 -0
  143. data/{tests/unittest → spec/block_docs}/lists.md +28 -29
  144. data/{tests/unittest → spec/block_docs}/lists10.md +2 -14
  145. data/spec/block_docs/lists11.md +23 -0
  146. data/spec/block_docs/lists12.md +43 -0
  147. data/spec/block_docs/lists13.md +55 -0
  148. data/spec/block_docs/lists14.md +61 -0
  149. data/spec/block_docs/lists15.md +36 -0
  150. data/spec/block_docs/lists6.md +88 -0
  151. data/spec/block_docs/lists7b.md +58 -0
  152. data/spec/block_docs/lists9.md +53 -0
  153. data/{tests/unittest → spec/block_docs}/lists_after_paragraph.md +19 -25
  154. data/spec/block_docs/lists_blank.md +35 -0
  155. data/{tests/unittest/list3.md → spec/block_docs/lists_blockquote_code.md} +2 -14
  156. data/{tests/unittest/list4.md → spec/block_docs/lists_need_blank_line.md} +44 -29
  157. data/spec/block_docs/lists_nested.md +44 -0
  158. data/spec/block_docs/lists_nested_blankline.md +34 -0
  159. data/spec/block_docs/lists_nested_deep.md +43 -0
  160. data/spec/block_docs/lists_ol.md +129 -0
  161. data/spec/block_docs/lists_ol2.md +147 -0
  162. data/spec/block_docs/lists_paraindent.md +42 -0
  163. data/spec/block_docs/lists_tab.md +54 -0
  164. data/spec/block_docs/loss.md +17 -0
  165. data/spec/block_docs/math-blahtex/equations.md +29 -0
  166. data/spec/block_docs/math-blahtex/inline.md +48 -0
  167. data/spec/block_docs/math-blahtex/math2.md +52 -0
  168. data/spec/block_docs/math-blahtex/table.md +25 -0
  169. data/spec/block_docs/math/embedded_invalid_svg.md +108 -0
  170. data/spec/block_docs/math/embedded_svg.md +136 -0
  171. data/spec/block_docs/math/equations.md +49 -0
  172. data/spec/block_docs/math/inline.md +46 -0
  173. data/spec/block_docs/math/math2.md +53 -0
  174. data/{tests/unittest → spec/block_docs}/math/notmath.md +0 -12
  175. data/spec/block_docs/math/raw_mathml.md +87 -0
  176. data/spec/block_docs/math/spaces_after_inline_math.md +17 -0
  177. data/spec/block_docs/math/table.md +25 -0
  178. data/{tests/unittest → spec/block_docs}/math/table2.md +11 -23
  179. data/{tests/unittest → spec/block_docs}/misc_sw.md +184 -121
  180. data/{tests/unittest → spec/block_docs}/olist.md +6 -18
  181. data/{tests/unittest → spec/block_docs}/one.md +0 -12
  182. data/{tests/unittest → spec/block_docs}/paragraph.md +0 -12
  183. data/{tests/unittest → spec/block_docs}/paragraph_rules/dont_merge_ref.md +4 -12
  184. data/{tests/unittest → spec/block_docs}/paragraph_rules/tab_is_blank.md +0 -12
  185. data/{tests/unittest → spec/block_docs}/paragraphs.md +1 -13
  186. data/{tests/unittest → spec/block_docs}/recover/recover_links.md +4 -16
  187. data/{tests/unittest/pending/ref.md → spec/block_docs/ref_with_period.md} +7 -16
  188. data/spec/block_docs/ref_with_title.md +22 -0
  189. data/{tests/unittest → spec/block_docs}/references/long_example.md +16 -23
  190. data/{tests/unittest → spec/block_docs}/references/spaces_and_numbers.md +0 -12
  191. data/{tests/unittest → spec/block_docs}/smartypants.md +24 -31
  192. data/{tests/unittest → spec/block_docs}/syntax_hl.md +13 -17
  193. data/{tests/unittest → spec/block_docs}/table_attributes.md +6 -20
  194. data/spec/block_docs/table_colspan.md +41 -0
  195. data/spec/block_docs/tables.md +47 -0
  196. data/spec/block_docs/tables2.md +74 -0
  197. data/{tests/unittest → spec/block_docs}/test.md +1 -13
  198. data/{tests/unittest/notyet → spec/block_docs}/ticks.md +1 -13
  199. data/spec/block_docs/toc.md +87 -0
  200. data/{tests/unittest/notyet → spec/block_docs}/triggering.md +14 -25
  201. data/{tests/unittest → spec/block_docs}/underscore_in_words.md +0 -12
  202. data/{tests/unittest → spec/block_docs}/wrapping.md +4 -16
  203. data/spec/block_docs/xml.md +33 -0
  204. data/spec/block_docs/xml3.md +24 -0
  205. data/spec/block_docs/xml_comments.md +32 -0
  206. data/{tests/unittest → spec/block_docs}/xml_instruction.md +9 -20
  207. data/spec/block_spec.rb +110 -0
  208. data/spec/cli_spec.rb +8 -0
  209. data/spec/span_spec.rb +263 -0
  210. data/spec/spec_helper.rb +3 -0
  211. data/spec/to_html_utf8_spec.rb +13 -0
  212. metadata +218 -202
  213. data/Rakefile +0 -73
  214. data/bin/marudown +0 -29
  215. data/bin/marutest +0 -345
  216. data/docs/changelog.md +0 -334
  217. data/lib/maruku/errors_management.rb +0 -92
  218. data/lib/maruku/ext/math/latex_fix.rb +0 -12
  219. data/lib/maruku/input/parse_span_better.rb +0 -746
  220. data/lib/maruku/input/rubypants.rb +0 -225
  221. data/lib/maruku/input/type_detection.rb +0 -147
  222. data/lib/maruku/output/to_latex_entities.rb +0 -367
  223. data/lib/maruku/output/to_latex_strings.rb +0 -64
  224. data/lib/maruku/structures.rb +0 -167
  225. data/lib/maruku/structures_inspect.rb +0 -87
  226. data/lib/maruku/structures_iterators.rb +0 -61
  227. data/lib/maruku/tests/benchmark.rb +0 -82
  228. data/lib/maruku/tests/new_parser.rb +0 -373
  229. data/lib/maruku/tests/tests.rb +0 -136
  230. data/lib/maruku/usage/example1.rb +0 -33
  231. data/maruku_gem.rb +0 -33
  232. data/tests/bugs/code_in_links.md +0 -101
  233. data/tests/bugs/complex_escaping.md +0 -38
  234. data/tests/math/syntax.md +0 -46
  235. data/tests/math_usage/document.md +0 -13
  236. data/tests/others/abbreviations.md +0 -11
  237. data/tests/others/blank.md +0 -4
  238. data/tests/others/code.md +0 -5
  239. data/tests/others/code2.md +0 -8
  240. data/tests/others/code3.md +0 -16
  241. data/tests/others/email.md +0 -4
  242. data/tests/others/entities.md +0 -19
  243. data/tests/others/escaping.md +0 -16
  244. data/tests/others/extra_dl.md +0 -101
  245. data/tests/others/extra_header_id.md +0 -13
  246. data/tests/others/extra_table1.md +0 -40
  247. data/tests/others/footnotes.md +0 -17
  248. data/tests/others/headers.md +0 -10
  249. data/tests/others/hrule.md +0 -10
  250. data/tests/others/images.md +0 -20
  251. data/tests/others/inline_html.md +0 -42
  252. data/tests/others/links.md +0 -38
  253. data/tests/others/list1.md +0 -4
  254. data/tests/others/list2.md +0 -5
  255. data/tests/others/list3.md +0 -8
  256. data/tests/others/lists.md +0 -32
  257. data/tests/others/lists_after_paragraph.md +0 -44
  258. data/tests/others/lists_ol.md +0 -39
  259. data/tests/others/misc_sw.md +0 -105
  260. data/tests/others/one.md +0 -1
  261. data/tests/others/paragraphs.md +0 -13
  262. data/tests/others/sss06.md +0 -352
  263. data/tests/others/test.md +0 -4
  264. data/tests/s5/s5profiling.md +0 -48
  265. data/tests/unittest/bug_def.md +0 -28
  266. data/tests/unittest/email.md +0 -32
  267. data/tests/unittest/hang.md +0 -29
  268. data/tests/unittest/html2.md +0 -34
  269. data/tests/unittest/ie.md +0 -61
  270. data/tests/unittest/links2.md +0 -34
  271. data/tests/unittest/lists11.md +0 -28
  272. data/tests/unittest/lists6.md +0 -53
  273. data/tests/unittest/lists9.md +0 -76
  274. data/tests/unittest/lists_ol.md +0 -274
  275. data/tests/unittest/math/equations.md +0 -86
  276. data/tests/unittest/math/inline.md +0 -58
  277. data/tests/unittest/math/math2.md +0 -57
  278. data/tests/unittest/math/table.md +0 -37
  279. data/tests/unittest/notyet/header_after_par.md +0 -70
  280. data/tests/unittest/pending/empty_cells.md +0 -49
  281. data/tests/unittest/red_tests/abbrev.md +0 -1388
  282. data/tests/unittest/red_tests/lists7.md +0 -68
  283. data/tests/unittest/red_tests/lists7b.md +0 -128
  284. data/tests/unittest/red_tests/lists8.md +0 -76
  285. data/tests/unittest/red_tests/xml.md +0 -70
  286. data/tests/unittest/xml2.md +0 -31
  287. data/tests/unittest/xml3.md +0 -38
  288. data/tests/utf8-files/simple.md +0 -1
  289. data/unit_test_block.sh +0 -5
  290. 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,125 @@
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
+
87
+
88
+ # This adds support for \eqref
89
+ RegEqrefLatex = /\\eqref\{(\w+?)\}/
90
+ RegEqPar = /\(eq:(\w+?)\)/
91
+ RegEqref = Regexp.union(RegEqrefLatex, RegEqPar)
92
+
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)
102
+
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)
13
114
 
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*$/
52
-
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
- )
106
-
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
- )
115
+ # This adds support for \cite
116
+ RegCite = /\\cite\{([^}]*?)\}/
117
+ MaRuKu::In::Markdown.register_span_extension(
118
+ :chars => ["\\"],
119
+ :regexp => RegCite,
120
+ :handler => lambda do |doc, src, con|
121
+ return false unless doc.is_math_enabled?
122
+ cites = src.read_regexp(RegCite).captures.compact.first.split(/\s*,\s*/)
123
+ con.push doc.md_el(:citation, [], :cites => cites)
124
+ true
125
+ end)
@@ -1,187 +1,202 @@
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
+ raise "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
+ raise "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
+ div
147
+ end
148
+
149
+ def to_html_eqref
150
+ unless eq = self.doc.eqid2eq[self.eqid]
151
+ maruku_error "Cannot find equation #{self.eqid.inspect}"
152
+ return xtext("(eq:#{self.eqid})")
153
+ end
154
+
155
+ a = xelem('a')
156
+ a['class'] = 'maruku-eqref'
157
+ a['href'] = "#eq:#{self.eqid}"
158
+ a << xtext("(#{eq.num})")
159
+ a
160
+ end
161
+
162
+ def to_html_divref
163
+ unless hash = self.doc.refid2ref.values.find {|h| h.has_key?(self.refid)}
164
+ maruku_error "Cannot find div #{self.refid.inspect}"
165
+ return xtext("\\ref{#{self.refid}}")
166
+ end
167
+ ref= hash[self.refid]
168
+
169
+ a = xelem('a')
170
+ a['class'] = 'maruku-ref'
171
+ a['href'] = "#" + self.refid
172
+ a << xtext(ref.num.to_s)
173
+ a
174
+ end
175
+
176
+ def to_html_citation
177
+ span = xelem('span')
178
+ span['class'] = 'maruku-citation'
179
+ span << xtext('[')
180
+ self.cites.each do |c|
181
+ if c =~ /(\w+):(\d\d\d\d\w{2,3})/ # INSPIRE
182
+ a = xelem('a')
183
+ a << xtext(c)
184
+ a['href'] = "http://inspirehep.net/search?p=#{$1}%3A#{$2}"
185
+ span << a << xtext(',')
186
+ elsif c =~ /MR(\d+)/ # MathReviews
187
+ a = xelem('a')
188
+ a << xtext(c)
189
+ a['href'] = "http://www.ams.org/mathscinet-getitem?mr=#{$1}"
190
+ span << a << xtext(',')
191
+ else
192
+ span << xtext(c + ',')
193
+ end
194
+ end
195
+ span.children.last.chop! unless span.children.last == '['
196
+ span << xtext(']')
197
+ span
198
+ end
199
+
200
+ end
201
+ end
202
+ end