asciimath 1.0.4 → 1.0.5
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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -1
- data/README.adoc +40 -4
- data/lib/asciimath.rb +1 -0
- data/lib/asciimath/cli.rb +8 -2
- data/lib/asciimath/html.rb +220 -0
- data/lib/asciimath/parser.rb +7 -0
- data/lib/asciimath/version.rb +1 -1
- data/spec/parser_spec.rb +105 -25
- data/style/math.css +67 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82151a09eeb08692d5879ebb592fff3522834e6f
|
4
|
+
data.tar.gz: 8d5d844b47b7ffbb6473535f7366aefed1783d6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bec21ba3ea7e11c768f85036c1091ab7e3b312e11b98ad4da55af55caf8f4a8d4638990daf1747a5bfb4387728977fb95d6a0770bde3eead18b449b8f9adf8c8
|
7
|
+
data.tar.gz: 1f0c2af41feb89b48dc9aba6f595e38d3f1ed787ab6274761f16ff8fa1330fcb252f9c1b6867ef680708d012ada805417eb524ad1b17f4358d37072f4485404f
|
data/.travis.yml
CHANGED
data/README.adoc
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
# AsciiMath
|
2
|
+
ifndef::env-site[:status:]
|
2
3
|
|
3
4
|
An http://asciimath.org[AsciiMath] parser and MathML generator written in pure Ruby.
|
4
5
|
|
6
|
+
ifdef::status[]
|
7
|
+
[discrete]
|
8
|
+
## Status
|
9
|
+
|
10
|
+
image:https://travis-ci.org/pepijnve/asciimath.svg?branch=master["Linux Build Status", link="https://travis-ci.org/asciidoctor/asciimath"]
|
11
|
+
image:https://img.shields.io/gem/v/asciimath.svg?label=gem%20version[Gem Version, link=https://rubygems.org/gems/asciimath]
|
12
|
+
endif::status[]
|
13
|
+
|
5
14
|
## Installation
|
6
15
|
|
7
16
|
Add this line to your application's Gemfile:
|
@@ -39,25 +48,52 @@ parsed_expression = AsciiMath.parse(asciimath)
|
|
39
48
|
|
40
49
|
The parsed expression is a set of nested Array and Hash objects.
|
41
50
|
|
42
|
-
This expression can then be converted to MathML.
|
51
|
+
This expression can then be converted to MathML or HTML (experimental.
|
43
52
|
|
44
53
|
[source,ruby]
|
45
54
|
----
|
46
55
|
math_ml = parsed_expression.to_mathml
|
56
|
+
html = parsed_expression.to_html
|
47
57
|
----
|
48
58
|
|
49
|
-
The MathML code is returned as a String.
|
59
|
+
The MathML or HTML code is returned as a String.
|
50
60
|
|
51
61
|
### Command line
|
52
62
|
|
53
|
-
The AsciiMath parser and
|
63
|
+
The AsciiMath parser and converters can be invoked via the command line as follows:
|
54
64
|
|
65
|
+
.MathML Generation
|
55
66
|
[source]
|
56
67
|
----
|
57
68
|
asciimath "an asciimath string"
|
69
|
+
|
70
|
+
or
|
71
|
+
|
72
|
+
asciimath mathml "an asciimath string"
|
73
|
+
----
|
74
|
+
|
75
|
+
.HTML Generation
|
76
|
+
[source]
|
58
77
|
----
|
78
|
+
asciimath html "an asciimath string"
|
79
|
+
----
|
80
|
+
|
81
|
+
This command will print out the generated code on stdout.
|
82
|
+
|
83
|
+
|
84
|
+
## Notes on the HTML Output
|
85
|
+
|
86
|
+
The HTML output is still regarded somewhat experimental - for basic usage it is fine, but it is not yet complete.
|
87
|
+
Known issues are as follows:
|
88
|
+
|
89
|
+
* `sqrt` function does not generate sane output
|
90
|
+
* Use of font commands (e.g. `bb`) will result in broken output.
|
91
|
+
* Accents do not extend to match what they cover.
|
92
|
+
* Rendering of "integrals" uses a generic path that does not look amazing.
|
93
|
+
* The size of braces does not account for complex content - so a matrix will render with the right sized braces if all of its elements are single-height text, but braces around e.g. fractions will render at the incorrect height.
|
59
94
|
|
60
|
-
|
95
|
+
Rendering the HTML output correctly requires the inclusion of `style/math.css` in the html document.
|
96
|
+
There is currently no specific required font for this output, it simply selects a `serif` font family - change the `@font-family` attribute in the `.math-inline` class to select something specific.
|
61
97
|
|
62
98
|
## Contributing
|
63
99
|
|
data/lib/asciimath.rb
CHANGED
data/lib/asciimath/cli.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
require_relative 'parser'
|
2
2
|
require_relative 'mathml'
|
3
|
+
require_relative 'html'
|
3
4
|
|
4
5
|
module AsciiMath
|
5
6
|
module CLI
|
6
7
|
def self.run(args)
|
7
8
|
asciimath = args.last
|
8
|
-
|
9
|
-
|
9
|
+
output = ''
|
10
|
+
if args.length == 1 || args.first == "mathml"
|
11
|
+
output = AsciiMath.parse(asciimath).to_mathml
|
12
|
+
elsif args.first == "html"
|
13
|
+
output = AsciiMath.parse(asciimath).to_html
|
14
|
+
end
|
15
|
+
puts output
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
@@ -0,0 +1,220 @@
|
|
1
|
+
module AsciiMath
|
2
|
+
class HTMLBuilder
|
3
|
+
def initialize(prefix)
|
4
|
+
@prefix = prefix
|
5
|
+
@html = ''
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
@html
|
10
|
+
end
|
11
|
+
|
12
|
+
def append_expression(expression, inline, attrs = {})
|
13
|
+
if inline
|
14
|
+
inline('', attrs) do
|
15
|
+
append(expression, :single_child => true)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
block('', attrs) do
|
19
|
+
append(expression, :single_child => true)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def append(expression, opts = {})
|
27
|
+
case expression
|
28
|
+
when Array
|
29
|
+
row do
|
30
|
+
expression.each { |e| append(e) }
|
31
|
+
end
|
32
|
+
when Hash
|
33
|
+
case expression[:type]
|
34
|
+
when :operator
|
35
|
+
operator(expression[:c])
|
36
|
+
when :identifier
|
37
|
+
identifier(expression[:c])
|
38
|
+
when :number
|
39
|
+
number(expression[:c])
|
40
|
+
when :text
|
41
|
+
text(expression[:c])
|
42
|
+
when :paren
|
43
|
+
paren = !opts[:strip_paren]
|
44
|
+
if paren
|
45
|
+
if opts[:single_child]
|
46
|
+
brace(expression[:lparen]) if expression[:lparen]
|
47
|
+
append(expression[:e], :single_child => true)
|
48
|
+
brace(expression[:rparen]) if expression[:rparen]
|
49
|
+
else
|
50
|
+
row do
|
51
|
+
brace(expression[:lparen]) if expression[:lparen]
|
52
|
+
append(expression[:e], :single_child => true)
|
53
|
+
brace(expression[:rparen]) if expression[:rparen]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
append(expression[:e])
|
58
|
+
end
|
59
|
+
when :font
|
60
|
+
#TODO - currently ignored
|
61
|
+
when :unary
|
62
|
+
operator = expression[:operator]
|
63
|
+
tag(operator) do
|
64
|
+
append(expression[:s], :single_child => true, :strip_paren => true)
|
65
|
+
end
|
66
|
+
when :binary
|
67
|
+
operator = expression[:operator]
|
68
|
+
if operator == :frac
|
69
|
+
append_fraction(expression[:s1],expression[:s2])
|
70
|
+
elsif operator == :sub
|
71
|
+
append_subsup(expression[:s1],expression[:s2],nil)
|
72
|
+
elsif operator == :sup
|
73
|
+
append_subsup(expression[:s1],nil,expression[:s2])
|
74
|
+
elsif operator == :under
|
75
|
+
append_underover(expression[:s1],expression[:s2],nil)
|
76
|
+
elsif operator == :over
|
77
|
+
append_underover(expression[:s1],nil,expression[:s2])
|
78
|
+
else
|
79
|
+
tag(operator) do
|
80
|
+
append(expression[:s1], :strip_paren => true)
|
81
|
+
append(expression[:s2], :strip_paren => true)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
when :ternary
|
85
|
+
operator = expression[:operator]
|
86
|
+
if operator == :subsup
|
87
|
+
append_subsup(expression[:s1],expression[:s2],expression[:s3])
|
88
|
+
elsif operator == :underover
|
89
|
+
# TODO: Handle over/under braces in some way? SVG maybe?
|
90
|
+
append_underover(expression[:s1],expression[:s2],expression[:s3])
|
91
|
+
end
|
92
|
+
when :matrix
|
93
|
+
row do
|
94
|
+
# Figures out a font size for the braces, based on the height of the matrix.
|
95
|
+
# NOTE: This does not currently consider the size of each element within the matrix.
|
96
|
+
brace_height = "font-size: " + expression[:rows].length.to_s + "00%;"
|
97
|
+
|
98
|
+
if expression[:lparen]
|
99
|
+
brace(expression[:lparen], {:style => brace_height})
|
100
|
+
else
|
101
|
+
blank("‍")
|
102
|
+
end
|
103
|
+
matrix_width = "grid-template-columns:repeat(" + expression[:rows][0].length.to_s + ",1fr);"
|
104
|
+
matrix_height = "grid-template-rows:repeat(" + expression[:rows].length.to_s + ",1fr);"
|
105
|
+
|
106
|
+
matrix({:style => (matrix_width + matrix_height)}) do
|
107
|
+
expression[:rows].each do |row|
|
108
|
+
row.each do |col|
|
109
|
+
row do
|
110
|
+
append(col)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
if expression[:rparen]
|
116
|
+
brace(expression[:rparen], {:style => brace_height})
|
117
|
+
else
|
118
|
+
blank("‍")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def append_subsup(base, sub, sup)
|
126
|
+
append(base)
|
127
|
+
subsup do
|
128
|
+
if sup
|
129
|
+
smaller do
|
130
|
+
append(sup, :strip_paren => true)
|
131
|
+
end
|
132
|
+
else
|
133
|
+
smaller("‍")
|
134
|
+
end
|
135
|
+
if sub
|
136
|
+
smaller do
|
137
|
+
append(sub, :strip_paren => true)
|
138
|
+
end
|
139
|
+
else
|
140
|
+
smaller("‍")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def append_underover(base, under, over)
|
146
|
+
blank("‍")
|
147
|
+
underover do
|
148
|
+
smaller do
|
149
|
+
if over
|
150
|
+
append(over, :strip_paren => true)
|
151
|
+
else
|
152
|
+
blank("‍")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
append(base)
|
156
|
+
smaller do
|
157
|
+
if under
|
158
|
+
append(under, :strip_paren => true)
|
159
|
+
else
|
160
|
+
blank("‍")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def append_fraction(numerator, denominator)
|
167
|
+
blank("‍")
|
168
|
+
fraction do
|
169
|
+
fraction_row do
|
170
|
+
fraction_cell do
|
171
|
+
smaller do
|
172
|
+
row do
|
173
|
+
append(numerator, :strip_paren => true)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
fraction_row do
|
179
|
+
fraction_cell do
|
180
|
+
smaller do
|
181
|
+
row do
|
182
|
+
append(denominator, :strip_paren => true)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def method_missing(meth, *args, &block)
|
191
|
+
tag(meth, *args, &block)
|
192
|
+
end
|
193
|
+
|
194
|
+
def tag(tag, *args)
|
195
|
+
attrs = args.last.is_a?(Hash) ? args.pop : {}
|
196
|
+
text = args.last.is_a?(String) ? args.pop : ''
|
197
|
+
|
198
|
+
@html << '<span class="math-' << @prefix << tag.to_s << '"'
|
199
|
+
|
200
|
+
attrs.each_pair do |key, value|
|
201
|
+
@html << ' ' << key.to_s << '="' << value.to_s << '"'
|
202
|
+
end
|
203
|
+
|
204
|
+
if block_given? || text
|
205
|
+
@html << '>'
|
206
|
+
@html << text
|
207
|
+
yield if block_given?
|
208
|
+
@html << '</span>'
|
209
|
+
else
|
210
|
+
@html << '/>'
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
class Expression
|
216
|
+
def to_html(prefix = "", inline = true, attrs = {})
|
217
|
+
HTMLBuilder.new(prefix).append_expression(@parsed_expression, inline, attrs).to_s
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
data/lib/asciimath/parser.rb
CHANGED
@@ -353,10 +353,17 @@ module AsciiMath
|
|
353
353
|
'text' => {:value => :text, :type => :unary},
|
354
354
|
'bb' => {:value => :bold, :type => :font},
|
355
355
|
'bbb' => {:value => :double_struck, :type => :font},
|
356
|
+
'ii' => {:value => :italic, :type => :font},
|
357
|
+
'bii' => {:value => :bold_italic, :type => :font},
|
356
358
|
'cc' => {:value => :script, :type => :font},
|
359
|
+
'bcc' => {:value => :bold_script, :type => :font},
|
357
360
|
'tt' => {:value => :monospace, :type => :font},
|
358
361
|
'fr' => {:value => :fraktur, :type => :font},
|
362
|
+
'bfr' => {:value => :bold_fraktur, :type => :font},
|
359
363
|
'sf' => {:value => :sans_serif, :type => :font},
|
364
|
+
'bsf' => {:value => :bold_sans_serif, :type => :font},
|
365
|
+
'sfi' => {:value => :sans_serif_italic, :type => :font},
|
366
|
+
'sfbi' => {:value => :sans_serif_bold_italic, :type => :font},
|
360
367
|
'frac' => {:value => :frac, :type => :binary},
|
361
368
|
'root' => {:value => :root, :type => :binary},
|
362
369
|
'stackrel' => {:value => :over, :type => :binary},
|
data/lib/asciimath/version.rb
CHANGED
data/spec/parser_spec.rb
CHANGED
@@ -1,63 +1,138 @@
|
|
1
|
+
#encoding: utf-8
|
1
2
|
require 'rspec'
|
2
3
|
require 'asciimath'
|
3
4
|
|
4
5
|
TEST_CASES = {
|
5
6
|
'x+b/(2a)<+-sqrt((b^2)/(4a^2)-c/a)' =>
|
6
|
-
|
7
|
+
{
|
8
|
+
:mathml => '<math><mi>x</mi><mo>+</mo><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mo><</mo><mo>±</mo><msqrt><mrow><mfrac><msup><mi>b</mi><mn>2</mn></msup><mrow><mn>4</mn><msup><mi>a</mi><mn>2</mn></msup></mrow></mfrac><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mrow></msqrt></math>',
|
9
|
+
:html => 'Unsupported',
|
10
|
+
},
|
7
11
|
'a^2 + b^2 = c^2' =>
|
8
|
-
|
12
|
+
{
|
13
|
+
:mathml => '<math><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup><mo>=</mo><msup><mi>c</mi><mn>2</mn></msup></math>',
|
14
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">=</span><span class="math-identifier">c</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span></span></span>',
|
15
|
+
},
|
9
16
|
'x = (-b+-sqrt(b^2-4ac))/(2a)' =>
|
10
|
-
|
17
|
+
{
|
18
|
+
:mathml => '<math><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mn>-4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math>',
|
19
|
+
:html => 'Unsupported'
|
20
|
+
},
|
11
21
|
'm = (y_2 - y_1)/(x_2 - x_1) = (Deltay)/(Deltax)' =>
|
12
|
-
|
22
|
+
{
|
23
|
+
:mathml => '<math><mi>m</mi><mo>=</mo><mfrac><mrow><msub><mi>y</mi><mn>2</mn></msub><mo>−</mo><msub><mi>y</mi><mn>1</mn></msub></mrow><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo>=</mo><mfrac><mrow><mo>Δ</mo><mi>y</mi></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
24
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">m</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">y</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span></span>'
|
25
|
+
},
|
13
26
|
'f\'(x) = lim_(Deltax->0)(f(x+Deltax)-f(x))/(Deltax)' =>
|
14
|
-
|
27
|
+
{
|
28
|
+
:mathml => '<math><mi>f</mi><mi>\'</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><munder><mo>lim</mo><mrow><mo>Δ</mo><mi>x</mi><mo>→</mo><mn>0</mn></mrow></munder><mfrac><mrow><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mo>Δ</mo><mi>x</mi><mo>)</mo></mrow><mo>−</mo><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
29
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">f</span><span class="math-identifier">\'</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-number">0</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-operator">Δ</span><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span></span>'
|
30
|
+
},
|
15
31
|
'd/dx [x^n] = nx^(n - 1)' =>
|
16
|
-
|
32
|
+
{
|
33
|
+
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mrow><mo>[</mo><msup><mi>x</mi><mi>n</mi></msup><mo>]</mo></mrow><mo>=</mo><mi>n</mi><msup><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></math>',
|
34
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-smaller">‍</span></span></span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">n</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">−</span><span class="math-number">1</span></span></span><span class="math-smaller">‍</span></span></span></span>'
|
35
|
+
},
|
17
36
|
'int_a^b f(x) dx = [F(x)]_a^b = F(b) - F(a)' =>
|
18
|
-
|
37
|
+
{
|
38
|
+
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi><mo>=</mo><msubsup><mrow><mo>[</mo><mi>F</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>]</mo></mrow><mi>a</mi><mi>b</mi></msubsup><mo>=</mo><mi>F</mi><mrow><mo>(</mo><mi>b</mi><mo>)</mo></mrow><mo>−</mo><mi>F</mi><mrow><mo>(</mo><mi>a</mi><mo>)</mo></mrow></math>',
|
39
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span><span class="math-brace">]</span></span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-operator">=</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">b</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">a</span></span><span class="math-brace">)</span></span></span></span>'
|
40
|
+
},
|
19
41
|
'int_a^b f(x) dx = f(c)(b - a)' =>
|
20
|
-
|
42
|
+
{
|
43
|
+
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi><mo>=</mo><mi>f</mi><mrow><mo>(</mo><mi>c</mi><mo>)</mo></mrow><mrow><mo>(</mo><mi>b</mi><mo>−</mo><mi>a</mi><mo>)</mo></mrow></math>',
|
44
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-brace">)</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span></span><span class="math-brace">)</span></span></span></span>'
|
45
|
+
},
|
21
46
|
'ax^2 + bx + c = 0' =>
|
22
|
-
|
47
|
+
{
|
48
|
+
:mathml => '<math><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>0</mn></math>',
|
49
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">a</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-identifier">c</span><span class="math-operator">=</span><span class="math-number">0</span></span></span>'
|
50
|
+
},
|
23
51
|
'"average value"=1/(b-a) int_a^b f(x) dx' =>
|
24
|
-
|
52
|
+
{
|
53
|
+
:mathml => '<math><mtext>average value</mtext><mo>=</mo><mfrac><mn>1</mn><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow></mfrac><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi></math>',
|
54
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">average value</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">1</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span></span></span></span></span></span></span><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span></span>'
|
55
|
+
},
|
25
56
|
'd/dx[int_a^x f(t) dt] = f(x)' =>
|
26
|
-
|
57
|
+
{
|
58
|
+
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mrow><mo>[</mo><msubsup><mo>∫</mo><mi>a</mi><mi>x</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mi>dt</mi><mo>]</mo></mrow><mo>=</mo><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></math>',
|
59
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">x</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">t</span></span><span class="math-brace">)</span></span><span class="math-identifier">dt</span></span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span></span>'
|
60
|
+
},
|
27
61
|
'hat(ab) bar(xy) ul(A) vec(v)' =>
|
28
|
-
|
62
|
+
{
|
63
|
+
:mathml => '<math><mover><mrow><mi>a</mi><mi>b</mi></mrow><mo>^</mo></mover><mover><mrow><mi>x</mi><mi>y</mi></mrow><mo>¯</mo></mover><munder><mi>A</mi><mo>_</mo></munder><mover><mi>v</mi><mo>→</mo></mover></math>',
|
64
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">^</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">a</span><span class="math-identifier">b</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">¯</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span><span class="math-identifier">y</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">A</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-operator">_</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">→</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">v</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span></span>'
|
65
|
+
},
|
29
66
|
'z_12^34' =>
|
30
|
-
|
67
|
+
{
|
68
|
+
:mathml => '<math><msubsup><mi>z</mi><mn>12</mn><mn>34</mn></msubsup></math>',
|
69
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">z</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">34</span></span><span class="math-smaller"><span class="math-number">12</span></span></span></span></span>'
|
70
|
+
},
|
31
71
|
'lim_(x->c)(f(x)-f(c))/(x-c)' =>
|
32
|
-
|
72
|
+
{
|
73
|
+
:mathml => '<math><munder><mo>lim</mo><mrow><mi>x</mi><mo>→</mo><mi>c</mi></mrow></munder><mfrac><mrow><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>−</mo><mi>f</mi><mrow><mo>(</mo><mi>c</mi><mo>)</mo></mrow></mrow><mrow><mi>x</mi><mo>−</mo><mi>c</mi></mrow></mfrac></math>',
|
74
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-identifier">c</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">−</span><span class="math-identifier">c</span></span></span></span></span></span></span></span></span>'
|
75
|
+
},
|
33
76
|
'int_0^(pi/2) g(x) dx' =>
|
34
|
-
|
77
|
+
{
|
78
|
+
:mathml => '<math><msubsup><mo>∫</mo><mn>0</mn><mfrac><mi>π</mi><mn>2</mn></mfrac></msubsup><mi>g</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi></math>',
|
79
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">π</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span></span><span class="math-smaller"><span class="math-number">0</span></span></span><span class="math-identifier">g</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span></span>'
|
80
|
+
},
|
35
81
|
'sum_(n=0)^oo a_n' =>
|
36
|
-
|
82
|
+
{
|
83
|
+
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>n</mi><mo>=</mo><mn>0</mn></mrow><mo>∞</mo></munderover><msub><mi>a</mi><mi>n</mi></msub></math>',
|
84
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">∞</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-number">0</span></span></span></span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-identifier">n</span></span></span></span></span>'
|
85
|
+
},
|
37
86
|
'((1,2,3),(4,5,6),(7,8,9))' =>
|
38
|
-
|
87
|
+
{
|
88
|
+
:mathml => '<math><mrow><mo>(</mo><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd><mtd><mn>3</mn></mtd></mtr><mtr><mtd><mn>4</mn></mtd><mtd><mn>5</mn></mtd><mtd><mn>6</mn></mtd></mtr><mtr><mtd><mn>7</mn></mtd><mtd><mn>8</mn></mtd><mtd><mn>9</mn></mtd></mtr></mtable><mo>)</mo></mrow></math>',
|
89
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-number">1</span></span><span class="math-row"><span class="math-number">2</span></span><span class="math-row"><span class="math-number">3</span></span><span class="math-row"><span class="math-number">4</span></span><span class="math-row"><span class="math-number">5</span></span><span class="math-row"><span class="math-number">6</span></span><span class="math-row"><span class="math-number">7</span></span><span class="math-row"><span class="math-number">8</span></span><span class="math-row"><span class="math-number">9</span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span></span>'
|
90
|
+
},
|
39
91
|
'|(a,b),(c,d)|=ad-bc' =>
|
40
|
-
|
92
|
+
{
|
93
|
+
:mathml => '<math><mrow><mo>|</mo><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable><mo>|</mo></mrow><mo>=</mo><mi>a</mi><mi>d</mi><mo>−</mo><mi>b</mi><mi>c</mi></math>',
|
94
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 200%;">|</span><span class="math-matrix" style="grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);"><span class="math-row"><span class="math-identifier">a</span></span><span class="math-row"><span class="math-identifier">b</span></span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-row"><span class="math-identifier">d</span></span></span><span class="math-brace" style="font-size: 200%;">|</span></span><span class="math-operator">=</span><span class="math-identifier">a</span><span class="math-identifier">d</span><span class="math-operator">−</span><span class="math-identifier">b</span><span class="math-identifier">c</span></span></span>'
|
95
|
+
},
|
41
96
|
'((a_(11), cdots , a_(1n)),(vdots, ddots, vdots),(a_(m1), cdots , a_(mn)))' =>
|
42
|
-
|
97
|
+
{
|
98
|
+
:mathml => '<math><mrow><mo>(</mo><mtable><mtr><mtd><msub><mi>a</mi><mn>11</mn></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mn>1</mn><mi>n</mi></mrow></msub></mtd></mtr><mtr><mtd><mo>⋮</mo></mtd><mtd><mo>⋱</mo></mtd><mtd><mo>⋮</mo></mtd></mtr><mtr><mtd><msub><mi>a</mi><mrow><mi>m</mi><mn>1</mn></mrow></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mi>m</mi><mi>n</mi></mrow></msub></mtd></mtr></mtable><mo>)</mo></mrow></math>',
|
99
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-number">11</span></span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-number">1</span><span class="math-identifier">n</span></span></span></span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-operator">⋱</span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-number">1</span></span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-identifier">n</span></span></span></span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span></span>'
|
100
|
+
},
|
43
101
|
'sum_(k=1)^n k = 1+2+ cdots +n=(n(n+1))/2' =>
|
44
|
-
|
102
|
+
{
|
103
|
+
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi>k</mi><mo>=</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>n</mi><mo>=</mo><mfrac><mrow><mi>n</mi><mrow><mo>(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></mrow><mn>2</mn></mfrac></math>',
|
104
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span></span></span></span><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span><span class="math-operator">+</span><span class="math-number">2</span><span class="math-operator">+</span><span class="math-operator">⋯</span><span class="math-operator">+</span><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">n</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">+</span><span class="math-number">1</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span></span>'
|
105
|
+
},
|
45
106
|
'"Скорость"=("Расстояние")/("Время")' =>
|
46
|
-
|
107
|
+
{
|
108
|
+
:mathml => '<math><mtext>Скорость</mtext><mo>=</mo><mfrac><mtext>Расстояние</mtext><mtext>Время</mtext></mfrac></math>',
|
109
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">Скорость</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-text">Расстояние</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-text">Время</span></span></span></span></span></span></span></span></span>'
|
110
|
+
},
|
47
111
|
'bb (a + b) + cc c = fr (d^n)' =>
|
48
|
-
|
112
|
+
{
|
113
|
+
:mathml => '<math><mstyle mathvariant="bold"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mstyle><mo>+</mo><mstyle mathvariant="script"><mi>c</mi></mstyle><mo>=</mo><mstyle mathvariant="fraktur"><msup><mi>d</mi><mi>n</mi></msup></mstyle></math>',
|
114
|
+
:html => 'Unsupported'
|
115
|
+
}
|
49
116
|
}
|
50
117
|
|
51
118
|
version = RUBY_VERSION.split('.').map { |s| s.to_i }
|
52
119
|
|
53
120
|
if version[0] > 1 || version[1] > 8
|
54
|
-
TEST_CASES['Скорость=(Расстояние)/(Время)'] =
|
121
|
+
TEST_CASES['Скорость=(Расстояние)/(Время)'] =
|
122
|
+
{
|
123
|
+
:mathml => '<math><mi>С</mi><mi>к</mi><mi>о</mi><mi>р</mi><mi>о</mi><mi>с</mi><mi>т</mi><mi>ь</mi><mo>=</mo><mfrac><mrow><mi>Р</mi><mi>а</mi><mi>с</mi><mi>с</mi><mi>т</mi><mi>о</mi><mi>я</mi><mi>н</mi><mi>и</mi><mi>е</mi></mrow><mrow><mi>В</mi><mi>р</mi><mi>е</mi><mi>м</mi><mi>я</mi></mrow></mfrac></math>',
|
124
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">С</span><span class="math-identifier">к</span><span class="math-identifier">о</span><span class="math-identifier">р</span><span class="math-identifier">о</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">ь</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">Р</span><span class="math-identifier">а</span><span class="math-identifier">с</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">о</span><span class="math-identifier">я</span><span class="math-identifier">н</span><span class="math-identifier">и</span><span class="math-identifier">е</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">В</span><span class="math-identifier">р</span><span class="math-identifier">е</span><span class="math-identifier">м</span><span class="math-identifier">я</span></span></span></span></span></span></span></span></span>'
|
125
|
+
}
|
55
126
|
end
|
56
127
|
|
57
128
|
module AsciiMathHelper
|
58
129
|
def expect_mathml(asciimath, mathml)
|
59
130
|
expect(AsciiMath.parse(asciimath).to_mathml).to eq(mathml)
|
60
131
|
end
|
132
|
+
|
133
|
+
def expect_html(asciimath, html)
|
134
|
+
expect(AsciiMath.parse(asciimath).to_html).to eq(html)
|
135
|
+
end
|
61
136
|
end
|
62
137
|
|
63
138
|
RSpec.configure do |c|
|
@@ -65,9 +140,14 @@ RSpec.configure do |c|
|
|
65
140
|
end
|
66
141
|
|
67
142
|
describe "AsciiMath::MathMLBuilder" do
|
68
|
-
TEST_CASES.each_pair do |asciimath,
|
143
|
+
TEST_CASES.each_pair do |asciimath, output|
|
69
144
|
it "should produce identical output to asciimathml.js for '#{asciimath}'" do
|
70
|
-
expect_mathml(asciimath, mathml)
|
145
|
+
expect_mathml(asciimath, output[:mathml])
|
146
|
+
end
|
147
|
+
if output[:html] != "Unsupported"
|
148
|
+
it "should produce html that looks like the output from asciimathml.js for '#{asciimath}'" do
|
149
|
+
expect_html(asciimath, output[:html])
|
150
|
+
end
|
71
151
|
end
|
72
152
|
end
|
73
153
|
|
data/style/math.css
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
.math-fraction {
|
2
|
+
display: table;
|
3
|
+
border-collapse: collapse;
|
4
|
+
border-style: hidden;
|
5
|
+
}
|
6
|
+
.math-fraction_row {
|
7
|
+
display: table-row;
|
8
|
+
}
|
9
|
+
.math-fraction_cell {
|
10
|
+
display: table-cell;
|
11
|
+
border: 0.5px solid black;
|
12
|
+
text-align: center;
|
13
|
+
}
|
14
|
+
.math-block {
|
15
|
+
font-family: serif;
|
16
|
+
display: flex;
|
17
|
+
justify-content: center;
|
18
|
+
}
|
19
|
+
.math-inline {
|
20
|
+
font-family: serif;
|
21
|
+
display: inline-flex;
|
22
|
+
align-content: center;
|
23
|
+
}
|
24
|
+
.math-underover {
|
25
|
+
display: flex;
|
26
|
+
flex-direction: column;
|
27
|
+
align-items: center;
|
28
|
+
justify-content: center;
|
29
|
+
line-height:60%;
|
30
|
+
}
|
31
|
+
.math-subsup {
|
32
|
+
display: flex;
|
33
|
+
flex-direction: column;
|
34
|
+
align-items: center;
|
35
|
+
justify-content: center;
|
36
|
+
}
|
37
|
+
.math-row {
|
38
|
+
display: flex;
|
39
|
+
flex-direction: row;
|
40
|
+
align-items: center;
|
41
|
+
justify-content: center;
|
42
|
+
}
|
43
|
+
.math-matrix {
|
44
|
+
display: grid;
|
45
|
+
align-items: center;
|
46
|
+
justify-items: center;
|
47
|
+
}
|
48
|
+
|
49
|
+
.math-identifier,
|
50
|
+
.math-operator,
|
51
|
+
.math-text,
|
52
|
+
.math-number {
|
53
|
+
margin-right: 0.1em;
|
54
|
+
margin-left: 0.1em;
|
55
|
+
}
|
56
|
+
.math-smaller {
|
57
|
+
font-size: 75%;
|
58
|
+
}
|
59
|
+
.math-identifier {
|
60
|
+
font-style: italic;
|
61
|
+
}
|
62
|
+
.math-brace {
|
63
|
+
transform: scale(0.5,1.0);
|
64
|
+
}
|
65
|
+
.math-blank {
|
66
|
+
align-self: center;
|
67
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciimath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pepijn Van Eeckhoudt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,10 +71,12 @@ files:
|
|
71
71
|
- bin/asciimath
|
72
72
|
- lib/asciimath.rb
|
73
73
|
- lib/asciimath/cli.rb
|
74
|
+
- lib/asciimath/html.rb
|
74
75
|
- lib/asciimath/mathml.rb
|
75
76
|
- lib/asciimath/parser.rb
|
76
77
|
- lib/asciimath/version.rb
|
77
78
|
- spec/parser_spec.rb
|
79
|
+
- style/math.css
|
78
80
|
homepage: ''
|
79
81
|
licenses:
|
80
82
|
- MIT
|
@@ -95,10 +97,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
97
|
version: '0'
|
96
98
|
requirements: []
|
97
99
|
rubyforge_project:
|
98
|
-
rubygems_version: 2.
|
100
|
+
rubygems_version: 2.5.1
|
99
101
|
signing_key:
|
100
102
|
specification_version: 4
|
101
103
|
summary: AsciiMath parser and converter
|
102
104
|
test_files:
|
103
105
|
- spec/parser_spec.rb
|
104
|
-
has_rdoc:
|