patcito-maruku 0.6.0

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 (162) hide show
  1. data/AUTHORS +23 -0
  2. data/LICENSE +340 -0
  3. data/README.md +73 -0
  4. data/bin/maruku +196 -0
  5. data/bin/marutex +4 -0
  6. data/data/entities.xml +261 -0
  7. data/docs/changelog.md +334 -0
  8. data/docs/div_syntax.md +36 -0
  9. data/docs/entity_test.md +23 -0
  10. data/docs/markdown_syntax.md +899 -0
  11. data/docs/maruku.md +346 -0
  12. data/docs/math.md +194 -0
  13. data/docs/other_stuff.md +51 -0
  14. data/docs/proposal.md +309 -0
  15. data/docs/website/src/bluecloth.md +25 -0
  16. data/docs/website/src/download.md +31 -0
  17. data/docs/website/src/maruku.md +261 -0
  18. data/docs/website/src/proposal.md +271 -0
  19. data/lib/maruku.rb +132 -0
  20. data/lib/maruku/attributes.rb +138 -0
  21. data/lib/maruku/defaults.rb +69 -0
  22. data/lib/maruku/errors.rb +89 -0
  23. data/lib/maruku/ext/div.rb +121 -0
  24. data/lib/maruku/ext/fenced_code.rb +78 -0
  25. data/lib/maruku/ext/math.rb +37 -0
  26. data/lib/maruku/ext/math/elements.rb +21 -0
  27. data/lib/maruku/ext/math/latex_fix.rb +12 -0
  28. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +93 -0
  29. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +39 -0
  30. data/lib/maruku/ext/math/mathml_engines/none.rb +21 -0
  31. data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
  32. data/lib/maruku/ext/math/parsing.rb +125 -0
  33. data/lib/maruku/ext/math/to_html.rb +237 -0
  34. data/lib/maruku/ext/math/to_latex.rb +36 -0
  35. data/lib/maruku/ext/yaml.rb +43 -0
  36. data/lib/maruku/helpers.rb +214 -0
  37. data/lib/maruku/input/charsource.rb +326 -0
  38. data/lib/maruku/input/extensions.rb +69 -0
  39. data/lib/maruku/input/html_helper.rb +189 -0
  40. data/lib/maruku/input/linesource.rb +111 -0
  41. data/lib/maruku/input/parse_block.rb +608 -0
  42. data/lib/maruku/input/parse_doc.rb +240 -0
  43. data/lib/maruku/input/parse_span_better.rb +746 -0
  44. data/lib/maruku/input/rubypants.rb +225 -0
  45. data/lib/maruku/input/type_detection.rb +147 -0
  46. data/lib/maruku/input_textile2/t2_parser.rb +163 -0
  47. data/lib/maruku/maruku.rb +31 -0
  48. data/lib/maruku/output/s5/fancy.rb +756 -0
  49. data/lib/maruku/output/s5/to_s5.rb +138 -0
  50. data/lib/maruku/output/to_html.rb +994 -0
  51. data/lib/maruku/output/to_latex.rb +580 -0
  52. data/lib/maruku/output/to_latex_entities.rb +101 -0
  53. data/lib/maruku/output/to_latex_strings.rb +64 -0
  54. data/lib/maruku/output/to_markdown.rb +164 -0
  55. data/lib/maruku/output/to_s.rb +54 -0
  56. data/lib/maruku/string_utils.rb +185 -0
  57. data/lib/maruku/structures.rb +143 -0
  58. data/lib/maruku/structures_inspect.rb +51 -0
  59. data/lib/maruku/structures_iterators.rb +48 -0
  60. data/lib/maruku/textile2.rb +1 -0
  61. data/lib/maruku/toc.rb +214 -0
  62. data/lib/maruku/usage/example1.rb +33 -0
  63. data/lib/maruku/version +0 -0
  64. data/lib/maruku/version.rb +54 -0
  65. data/spec/block_docs/abbreviations.md +52 -0
  66. data/spec/block_docs/alt.md +17 -0
  67. data/spec/block_docs/attributes/att2.md +20 -0
  68. data/spec/block_docs/attributes/att3.md +28 -0
  69. data/spec/block_docs/attributes/attributes.md +57 -0
  70. data/spec/block_docs/attributes/circular.md +26 -0
  71. data/spec/block_docs/attributes/default.md +22 -0
  72. data/spec/block_docs/blank.md +24 -0
  73. data/spec/block_docs/blanks_in_code.md +75 -0
  74. data/spec/block_docs/bug_def.md +16 -0
  75. data/spec/block_docs/bug_table.md +46 -0
  76. data/spec/block_docs/code.md +34 -0
  77. data/spec/block_docs/code2.md +28 -0
  78. data/spec/block_docs/code3.md +71 -0
  79. data/spec/block_docs/data_loss.md +25 -0
  80. data/spec/block_docs/divs/div1.md +167 -0
  81. data/spec/block_docs/divs/div2.md +21 -0
  82. data/spec/block_docs/divs/div3_nest.md +45 -0
  83. data/spec/block_docs/easy.md +15 -0
  84. data/spec/block_docs/email.md +20 -0
  85. data/spec/block_docs/encoding/iso-8859-1.md +23 -0
  86. data/spec/block_docs/encoding/utf-8.md +18 -0
  87. data/spec/block_docs/entities.md +94 -0
  88. data/spec/block_docs/escaping.md +67 -0
  89. data/spec/block_docs/extra_dl.md +52 -0
  90. data/spec/block_docs/extra_header_id.md +63 -0
  91. data/spec/block_docs/extra_table1.md +37 -0
  92. data/spec/block_docs/footnotes.md +97 -0
  93. data/spec/block_docs/headers.md +37 -0
  94. data/spec/block_docs/hex_entities.md +37 -0
  95. data/spec/block_docs/hrule.md +39 -0
  96. data/spec/block_docs/html2.md +22 -0
  97. data/spec/block_docs/html3.md +31 -0
  98. data/spec/block_docs/html4.md +25 -0
  99. data/spec/block_docs/html5.md +23 -0
  100. data/spec/block_docs/ie.md +49 -0
  101. data/spec/block_docs/images.md +90 -0
  102. data/spec/block_docs/images2.md +31 -0
  103. data/spec/block_docs/inline_html.md +152 -0
  104. data/spec/block_docs/inline_html2.md +21 -0
  105. data/spec/block_docs/links.md +152 -0
  106. data/spec/block_docs/links2.md +22 -0
  107. data/spec/block_docs/list1.md +46 -0
  108. data/spec/block_docs/list12.md +28 -0
  109. data/spec/block_docs/list2.md +56 -0
  110. data/spec/block_docs/list3.md +64 -0
  111. data/spec/block_docs/list4.md +89 -0
  112. data/spec/block_docs/lists.md +192 -0
  113. data/spec/block_docs/lists10.md +34 -0
  114. data/spec/block_docs/lists11.md +23 -0
  115. data/spec/block_docs/lists6.md +41 -0
  116. data/spec/block_docs/lists9.md +64 -0
  117. data/spec/block_docs/lists_after_paragraph.md +208 -0
  118. data/spec/block_docs/lists_ol.md +262 -0
  119. data/spec/block_docs/loss.md +16 -0
  120. data/spec/block_docs/math/equations.md +45 -0
  121. data/spec/block_docs/math/inline.md +46 -0
  122. data/spec/block_docs/math/math2.md +45 -0
  123. data/spec/block_docs/math/notmath.md +25 -0
  124. data/spec/block_docs/math/table.md +25 -0
  125. data/spec/block_docs/math/table2.md +42 -0
  126. data/spec/block_docs/misc_sw.md +525 -0
  127. data/spec/block_docs/notyet/escape.md +21 -0
  128. data/spec/block_docs/notyet/header_after_par.md +58 -0
  129. data/spec/block_docs/notyet/ticks.md +18 -0
  130. data/spec/block_docs/notyet/triggering.md +157 -0
  131. data/spec/block_docs/olist.md +45 -0
  132. data/spec/block_docs/one.md +15 -0
  133. data/spec/block_docs/paragraph.md +16 -0
  134. data/spec/block_docs/paragraph_rules/dont_merge_ref.md +42 -0
  135. data/spec/block_docs/paragraph_rules/tab_is_blank.md +24 -0
  136. data/spec/block_docs/paragraphs.md +46 -0
  137. data/spec/block_docs/pending/amps.md +15 -0
  138. data/spec/block_docs/pending/empty_cells.md +37 -0
  139. data/spec/block_docs/pending/link.md +72 -0
  140. data/spec/block_docs/pending/ref.md +21 -0
  141. data/spec/block_docs/recover/recover_links.md +15 -0
  142. data/spec/block_docs/red_tests/abbrev.md +679 -0
  143. data/spec/block_docs/red_tests/lists7.md +32 -0
  144. data/spec/block_docs/red_tests/lists7b.md +65 -0
  145. data/spec/block_docs/red_tests/lists8.md +42 -0
  146. data/spec/block_docs/red_tests/ref.md +23 -0
  147. data/spec/block_docs/red_tests/xml.md +35 -0
  148. data/spec/block_docs/references/long_example.md +71 -0
  149. data/spec/block_docs/references/spaces_and_numbers.md +15 -0
  150. data/spec/block_docs/smartypants.md +114 -0
  151. data/spec/block_docs/syntax_hl.md +52 -0
  152. data/spec/block_docs/table_attributes.md +34 -0
  153. data/spec/block_docs/test.md +19 -0
  154. data/spec/block_docs/underscore_in_words.md +15 -0
  155. data/spec/block_docs/wrapping.md +67 -0
  156. data/spec/block_docs/xml2.md +19 -0
  157. data/spec/block_docs/xml3.md +26 -0
  158. data/spec/block_docs/xml_instruction.md +52 -0
  159. data/spec/block_spec.rb +49 -0
  160. data/spec/span_spec.rb +254 -0
  161. data/spec/spec_helper.rb +6 -0
  162. metadata +247 -0
@@ -0,0 +1,39 @@
1
+ module MaRuKu
2
+ module Out
3
+ module HTML
4
+ def convert_to_mathml_itex2mml(kind, tex)
5
+ return if $already_warned_itex2mml
6
+ begin
7
+ require 'itextomml'
8
+ rescue LoadError => e
9
+ maruku_error "Could not load package 'itex2mml'.\nPlease install it." unless $already_warned_itex2mml
10
+ $already_warned_itex2mml = true
11
+ return nil
12
+ end
13
+ begin
14
+ require 'instiki_stringsupport'
15
+ rescue LoadError
16
+ require 'itex_stringsupport'
17
+ end
18
+
19
+ parser = Itex2MML::Parser.new
20
+ mathml =
21
+ case kind
22
+ when :equation; parser.block_filter(tex)
23
+ when :inline; parser.inline_filter(tex)
24
+ else
25
+ maruku_error "Unknown itex2mml kind: #{kind}"
26
+ return
27
+ end
28
+
29
+ return Document.new(mathml.to_utf8, :respect_whitespace => :all).root
30
+ rescue REXML::ParseException => e
31
+ maruku_error "Invalid MathML TeX: \n#{tex.gsub(/^/, 'tex>')}\n\n #{e.inspect}"
32
+ nil
33
+ rescue
34
+ maruku_error "Could not produce MathML TeX: \n#{tex}\n\n #{e.inspect}"
35
+ nil
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
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
+ mathml = "<code>#{tex.gsub( /&/, "&amp;" ).
10
+ gsub( /</, "&lt;" ).gsub( />/, "&gt;" ).
11
+ gsub(/'/, "&#39;" ).gsub(/"/, "&quot;" )}</code>"
12
+ return Document.new(mathml).root
13
+ end
14
+
15
+ def convert_to_png_none(kind, tex)
16
+ return nil
17
+ end
18
+
19
+
20
+ end end end
21
+
@@ -0,0 +1,24 @@
1
+ module MaRuKu; module Out; module HTML
2
+
3
+ def convert_to_mathml_ritex(kind, tex)
4
+ begin
5
+ if not $ritex_parser
6
+ require 'ritex'
7
+ $ritex_parser = Ritex::Parser.new
8
+ end
9
+
10
+ mathml = $ritex_parser.parse(tex.strip)
11
+ doc = Document.new(mathml, {:respect_whitespace =>:all}).root
12
+ return doc
13
+ rescue LoadError => e
14
+ maruku_error "Could not load package 'ritex'.\n"+
15
+ "Please install it using:\n"+
16
+ " $ gem install ritex\n\n"+e.inspect
17
+ rescue Racc::ParseError => e
18
+ maruku_error "Could not parse TeX: \n#{tex}"+
19
+ "\n\n #{e.inspect}"
20
+ end
21
+ nil
22
+ end
23
+
24
+ end end end
@@ -0,0 +1,125 @@
1
+ module MaRuKu
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
12
+ end
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
+ MultiLineEquation = /^[ ]{0,3}(#{EquationOpen})(.*?)(#{EquationClose})\s*?#{EqLabel}?\s*?$/m
48
+
49
+ if MaRuKu::Globals[:html_math_output_span_equations]
50
+ MaRuKu::In::Markdown.register_span_extension(
51
+ :chars => ?\\,
52
+ :regexp => EquationStart,
53
+ :handler => lambda do |doc, src, con|
54
+ next false unless doc.is_math_enabled?
55
+ next false unless m = src.read_regexp(MultiLineEquation)
56
+ opening, tex, closing, label = $1, $2, $3, $4
57
+ numerate = doc.get_setting(:math_numbered).include?(opening)
58
+ con.push doc.md_equation(tex, label, numerate)
59
+ true
60
+ end)
61
+ else
62
+ MaRuKu::In::Markdown.register_block_extension(
63
+ :regexp => EquationStart,
64
+ :handler => lambda do |doc, src, con|
65
+ next false unless doc.is_math_enabled?
66
+ first = src.shift_line
67
+ if first =~ OneLineEquation
68
+ opening, tex, closing, label = $1, $2, $3, $4
69
+ numerate = doc.get_setting(:math_numbered).include?(opening)
70
+ con.push doc.md_equation(tex, label, numerate)
71
+ next true
72
+ end
73
+
74
+ opening, tex = first.scan(EquationStart).first
75
+ numerate = doc.get_setting(:math_numbered).include?(opening)
76
+ label = nil
77
+ loop do
78
+ unless src.cur_line
79
+ doc.maruku_error(
80
+ "Stream finished while reading equation\n\n" + tex.gsub(/^/, '$> '),
81
+ src, con)
82
+ break
83
+ end
84
+
85
+ line = src.shift_line
86
+ if line =~ EquationEnd
87
+ tex_line, closing = $1, $2
88
+ label = $3 if $3
89
+ tex << tex_line << "\n"
90
+ break
91
+ end
92
+
93
+ tex << line << "\n"
94
+ end
95
+ con.push doc.md_equation(tex, label, numerate)
96
+ true
97
+ end)
98
+ end
99
+
100
+ # This adds support for \eqref
101
+ RegEqrefLatex = /\\eqref\{(\w+)\}/
102
+ RegEqPar = /\(eq:(\w+)\)/
103
+ RegEqref = Regexp.union(RegEqrefLatex, RegEqPar)
104
+
105
+ MaRuKu::In::Markdown.register_span_extension(
106
+ :chars => [?\\, ?(],
107
+ :regexp => RegEqref,
108
+ :handler => lambda do |doc, src, con|
109
+ return false unless doc.is_math_enabled?
110
+ eqid = src.read_regexp(RegEqref).captures.compact.first
111
+ con.push doc.md_el(:eqref, [], :eqid => eqid)
112
+ true
113
+ end)
114
+
115
+ # This adds support for \ref
116
+ RegRef = /\\ref\{(\w*)\}/
117
+ MaRuKu::In::Markdown.register_span_extension(
118
+ :chars => [?\\, ?(],
119
+ :regexp => RegRef,
120
+ :handler => lambda do |doc, src, con|
121
+ return false unless doc.is_math_enabled?
122
+ refid = src.read_regexp(RegRef).captures.compact.first
123
+ con.push doc.md_el(:divref, [], :refid => refid)
124
+ true
125
+ end)
@@ -0,0 +1,237 @@
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 [REXML::Document]
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
+ return 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
+ return nil
73
+ end
74
+
75
+ # Renders a MathJax block of out this node's TeX code.
76
+ #
77
+ # @return [REXML::Document]
78
+ def render_mathjax(kind,tex)
79
+ if kind == :equation
80
+ # using the script that works with Instapaper
81
+ # see http://www.leancrew.com/all-this/2010/11/mathjax-markdown-and-instapaper/
82
+ # <span class="MathJax_Preview"><code>[math]</code></span>
83
+ # <script type="math/tex; mode=display">\int f(x) = F(x)</script>
84
+
85
+ equation = create_html_element 'span'
86
+
87
+ span = create_html_element 'span'
88
+ add_class_to(span,'MathJax_Preview')
89
+ code = convert_to_mathml_none(:equation, tex.strip)
90
+ span << code
91
+
92
+ script = create_html_element 'script'
93
+ script.attributes['type'] = 'math/tex; mode=display'
94
+ script << Text.new("#{tex.strip}")
95
+
96
+ equation << span
97
+ equation << script
98
+
99
+ return equation
100
+ else
101
+ script = create_html_element 'script'
102
+ script.attributes['type'] = 'math/tex'
103
+ script << Text.new("#{tex.strip}")
104
+ return script
105
+ end
106
+ end
107
+
108
+ def pixels_per_ex
109
+ $pixels_per_ex ||= render_png(:inline, "x").height
110
+ end
111
+
112
+ def adjust_png(png, use_depth)
113
+ src = png.src
114
+
115
+ height_in_px = png.height
116
+ depth_in_px = png.depth
117
+ height_in_ex = height_in_px / pixels_per_ex
118
+ depth_in_ex = depth_in_px / pixels_per_ex
119
+ total_height_in_ex = height_in_ex + depth_in_ex
120
+ style = ""
121
+ style << "vertical-align: -#{depth_in_ex}ex;" if use_depth
122
+ style << "height: #{total_height_in_ex}ex;"
123
+
124
+ img = Element.new 'img'
125
+ img.attributes['src'] = src
126
+ img.attributes['style'] = style
127
+ img.attributes['alt'] = "$#{self.math.strip}$"
128
+ img
129
+ end
130
+
131
+ def to_html_inline_math
132
+ mathml = get_setting(:html_math_output_mathml) && render_mathml(:inline, self.math)
133
+ png = get_setting(:html_math_output_png) && render_png(:inline, self.math)
134
+ mathjax = get_setting(:html_math_output_mathjax) && render_mathjax(:inline, self.math)
135
+
136
+ span = create_html_element 'span'
137
+ add_class_to(span, 'maruku-inline')
138
+
139
+ if mathml
140
+ add_class_to(mathml, 'maruku-mathml')
141
+ return mathml
142
+ end
143
+
144
+ if png
145
+ img = adjust_png(png, true)
146
+ add_class_to(img, 'maruku-png')
147
+ span << img
148
+ end
149
+
150
+ if mathjax
151
+ span << mathjax
152
+ end
153
+
154
+ span
155
+ end
156
+
157
+ def to_html_equation
158
+ mathml = get_setting(:html_math_output_mathml) && render_mathml(:equation, self.math)
159
+ png = get_setting(:html_math_output_png) && render_png(:equation, self.math)
160
+ mathjax = get_setting(:html_math_output_mathjax) && render_mathjax(:equation, self.math)
161
+
162
+ if mathjax
163
+ span = create_html_element 'span'
164
+ add_class_to(span, 'maruku-equation')
165
+
166
+ span << mathjax
167
+
168
+ # mathjax handles equation numbering
169
+ return span
170
+ end
171
+
172
+ div = create_html_element 'div'
173
+ add_class_to(div, 'maruku-equation')
174
+ if mathml
175
+ if self.label # then numerate
176
+ span = Element.new 'span'
177
+ span.attributes['class'] = 'maruku-eq-number'
178
+ span << Text.new("(#{self.num})")
179
+ div << span
180
+ div.attributes['id'] = "eq:#{self.label}"
181
+ end
182
+ add_class_to(mathml, 'maruku-mathml')
183
+ div << mathml
184
+ end
185
+
186
+ if png
187
+ img = adjust_png(png, false)
188
+ add_class_to(img, 'maruku-png')
189
+ div << img
190
+ if self.label # then numerate
191
+ span = Element.new 'span'
192
+ span.attributes['class'] = 'maruku-eq-number'
193
+ span << Text.new("(#{self.num})")
194
+ div << span
195
+ div.attributes['id'] = "eq:#{self.label}"
196
+ end
197
+ end
198
+
199
+ source_span = Element.new 'span'
200
+ add_class_to(source_span, 'maruku-eq-tex')
201
+ code = convert_to_mathml_none(:equation, self.math.strip)
202
+ code.attributes['style'] = 'display: none'
203
+ source_span << code
204
+ div << source_span
205
+
206
+ div
207
+ end
208
+
209
+ def to_html_eqref
210
+ unless eq = self.doc.eqid2eq[self.eqid]
211
+ maruku_error "Cannot find equation #{self.eqid.inspect}"
212
+ return Text.new("(eq:#{self.eqid})")
213
+ end
214
+
215
+ a = Element.new 'a'
216
+ a.attributes['class'] = 'maruku-eqref'
217
+ a.attributes['href'] = "#eq:#{self.eqid}"
218
+ a << Text.new("(#{eq.num})")
219
+ a
220
+ end
221
+
222
+ def to_html_divref
223
+ unless hash = self.doc.refid2ref.values.find {|h| h.has_key?(self.refid)}
224
+ maruku_error "Cannot find div #{self.refid.inspect}"
225
+ return Text.new("\\ref{#{self.refid}}")
226
+ end
227
+ ref= hash[self.refid]
228
+
229
+ a = Element.new 'a'
230
+ a.attributes['class'] = 'maruku-ref'
231
+ a.attributes['href'] = "#" + self.refid
232
+ a << Text.new(ref.num.to_s)
233
+ a
234
+ end
235
+ end
236
+ end
237
+ end