asciimath 1.0.9 → 2.0.3
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 +5 -5
- data/.github/workflows/ci.yml +20 -0
- data/AST.adoc +457 -0
- data/CHANGELOG.adoc +47 -1
- data/Gemfile +5 -0
- data/README.adoc +68 -4
- data/asciimath.gemspec +3 -6
- data/dump_symbol_table.rb +46 -0
- data/lib/asciimath.rb +5 -4
- data/lib/asciimath/ast.rb +456 -0
- data/lib/asciimath/cli.rb +4 -1
- data/lib/asciimath/color_table.rb +21 -0
- data/lib/asciimath/html.rb +128 -112
- data/lib/asciimath/latex.rb +399 -0
- data/lib/asciimath/markup.rb +509 -0
- data/lib/asciimath/mathml.rb +206 -87
- data/lib/asciimath/parser.rb +510 -350
- data/lib/asciimath/symbol_table.rb +25 -0
- data/lib/asciimath/version.rb +1 -1
- data/spec/ast.rb +144 -0
- data/spec/customisation_spec.rb +28 -0
- data/spec/parser_spec.rb +623 -165
- data/spec/schema/mathml2/common/common-attribs.xsd +41 -0
- data/spec/schema/mathml2/common/math.xsd +126 -0
- data/spec/schema/mathml2/common/xlink-href.xsd +20 -0
- data/spec/schema/mathml2/content/arith.xsd +90 -0
- data/spec/schema/mathml2/content/calculus.xsd +146 -0
- data/spec/schema/mathml2/content/common-attrib.xsd +30 -0
- data/spec/schema/mathml2/content/constants.xsd +83 -0
- data/spec/schema/mathml2/content/constructs.xsd +260 -0
- data/spec/schema/mathml2/content/elementary-functions.xsd +117 -0
- data/spec/schema/mathml2/content/functions.xsd +73 -0
- data/spec/schema/mathml2/content/linear-algebra.xsd +173 -0
- data/spec/schema/mathml2/content/logic.xsd +53 -0
- data/spec/schema/mathml2/content/relations.xsd +55 -0
- data/spec/schema/mathml2/content/semantics.xsd +85 -0
- data/spec/schema/mathml2/content/sets.xsd +236 -0
- data/spec/schema/mathml2/content/statistics.xsd +136 -0
- data/spec/schema/mathml2/content/tokens.xsd +120 -0
- data/spec/schema/mathml2/content/vector-calculus.xsd +88 -0
- data/spec/schema/mathml2/mathml2.xsd +59 -0
- data/spec/schema/mathml2/presentation/action.xsd +44 -0
- data/spec/schema/mathml2/presentation/characters.xsd +37 -0
- data/spec/schema/mathml2/presentation/common-attribs.xsd +113 -0
- data/spec/schema/mathml2/presentation/common-types.xsd +103 -0
- data/spec/schema/mathml2/presentation/error.xsd +40 -0
- data/spec/schema/mathml2/presentation/layout.xsd +195 -0
- data/spec/schema/mathml2/presentation/scripts.xsd +186 -0
- data/spec/schema/mathml2/presentation/space.xsd +52 -0
- data/spec/schema/mathml2/presentation/style.xsd +69 -0
- data/spec/schema/mathml2/presentation/table.xsd +216 -0
- data/spec/schema/mathml2/presentation/tokens.xsd +124 -0
- data/spec/schema/mathml3/mathml3-common.xsd +99 -0
- data/spec/schema/mathml3/mathml3-content.xsd +684 -0
- data/spec/schema/mathml3/mathml3-presentation.xsd +2151 -0
- data/spec/schema/mathml3/mathml3-strict-content.xsd +186 -0
- data/spec/schema/mathml3/mathml3.xsd +9 -0
- metadata +88 -48
- data/.travis.yml +0 -18
@@ -0,0 +1,25 @@
|
|
1
|
+
module AsciiMath
|
2
|
+
class SymbolTableBuilder
|
3
|
+
def initialize()
|
4
|
+
@table = {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def add(*args)
|
8
|
+
raise 'Insufficient arguments' if args.length < 3
|
9
|
+
|
10
|
+
entry = {}
|
11
|
+
if args.last.is_a?(Hash)
|
12
|
+
entry.merge!(args.pop)
|
13
|
+
end
|
14
|
+
entry[:type] = args.pop
|
15
|
+
entry[:value] = args.pop
|
16
|
+
|
17
|
+
entry.freeze
|
18
|
+
args.each { |name| @table[name.freeze] = entry }
|
19
|
+
end
|
20
|
+
|
21
|
+
def build
|
22
|
+
@table.dup.freeze
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/asciimath/version.rb
CHANGED
data/spec/ast.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
require_relative '../lib/asciimath/ast'
|
2
|
+
|
3
|
+
module AsciiMath
|
4
|
+
module ASTHelper
|
5
|
+
ACTUAL_AST = Class.new do
|
6
|
+
include ::AsciiMath::AST
|
7
|
+
end.new
|
8
|
+
|
9
|
+
def grseq(*expressions)
|
10
|
+
group(seq(*expressions))
|
11
|
+
end
|
12
|
+
|
13
|
+
def seq(*expressions)
|
14
|
+
mapped = expressions.map { |e| to_ast(e) }
|
15
|
+
ACTUAL_AST.expression(*mapped)
|
16
|
+
end
|
17
|
+
|
18
|
+
def paren(*args)
|
19
|
+
case args.length
|
20
|
+
when 1
|
21
|
+
lparen = symbol('(')
|
22
|
+
e = to_ast(args[0])
|
23
|
+
rparen = symbol(')')
|
24
|
+
when 3
|
25
|
+
lparen = args[0]
|
26
|
+
e = to_ast(args[1])
|
27
|
+
rparen = args[2]
|
28
|
+
else
|
29
|
+
raise "Incorrect argument count #{args.length}"
|
30
|
+
end
|
31
|
+
ACTUAL_AST.paren(lparen, e, rparen)
|
32
|
+
end
|
33
|
+
|
34
|
+
def group(*args)
|
35
|
+
case args.length
|
36
|
+
when 1
|
37
|
+
lparen = symbol('(')
|
38
|
+
e = to_ast(args[0])
|
39
|
+
rparen = symbol(')')
|
40
|
+
when 3
|
41
|
+
lparen = args[0]
|
42
|
+
e = to_ast(args[1])
|
43
|
+
rparen = args[2]
|
44
|
+
else
|
45
|
+
raise "Incorrect argument count #{args.length}"
|
46
|
+
end
|
47
|
+
ACTUAL_AST.group(lparen, e, rparen)
|
48
|
+
end
|
49
|
+
|
50
|
+
def subsup(e, sub, sup)
|
51
|
+
ACTUAL_AST.subsup(to_ast(e), to_ast(sub), to_ast(sup))
|
52
|
+
end
|
53
|
+
|
54
|
+
def sub(e, sub)
|
55
|
+
ACTUAL_AST.sub(to_ast(e), to_ast(sub))
|
56
|
+
end
|
57
|
+
|
58
|
+
def sup(e, sup)
|
59
|
+
ACTUAL_AST.sup(to_ast(e), to_ast(sup))
|
60
|
+
end
|
61
|
+
|
62
|
+
def unary(operator, e)
|
63
|
+
ACTUAL_AST.unary(to_ast(operator), to_ast(e))
|
64
|
+
end
|
65
|
+
|
66
|
+
def binary(operator, e1, e2)
|
67
|
+
ACTUAL_AST.binary(to_ast(operator), to_ast(e1), to_ast(e2))
|
68
|
+
end
|
69
|
+
|
70
|
+
def infix(e1, operator, e2)
|
71
|
+
ACTUAL_AST.infix(to_ast(e1), to_ast(operator), to_ast(e2))
|
72
|
+
end
|
73
|
+
|
74
|
+
def text(value)
|
75
|
+
ACTUAL_AST.text(value)
|
76
|
+
end
|
77
|
+
|
78
|
+
def identifier(value)
|
79
|
+
ACTUAL_AST.identifier(value)
|
80
|
+
end
|
81
|
+
|
82
|
+
def number(value)
|
83
|
+
ACTUAL_AST.number(value)
|
84
|
+
end
|
85
|
+
|
86
|
+
def color(r, g, b, value)
|
87
|
+
ACTUAL_AST.color(r, g, b, value)
|
88
|
+
end
|
89
|
+
|
90
|
+
def symbol(text)
|
91
|
+
symbol = ::AsciiMath::Parser::DEFAULT_PARSER_SYMBOL_TABLE[text]
|
92
|
+
if symbol
|
93
|
+
ACTUAL_AST.symbol(symbol[:value], text)
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def matrix(*args)
|
100
|
+
case args.length
|
101
|
+
when 1
|
102
|
+
lparen = symbol('(')
|
103
|
+
rows = args[0]
|
104
|
+
rparen = symbol(')')
|
105
|
+
when 3
|
106
|
+
lparen = args[0]
|
107
|
+
rows = args[1]
|
108
|
+
rparen = args[2]
|
109
|
+
else
|
110
|
+
raise "Incorrect argument count #{args.length}"
|
111
|
+
end
|
112
|
+
|
113
|
+
rows = rows.map do |row|
|
114
|
+
row.map do |col|
|
115
|
+
to_ast(col)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
ACTUAL_AST.matrix(lparen, rows, rparen)
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_ast(e)
|
123
|
+
case e
|
124
|
+
when String
|
125
|
+
s = symbol(e)
|
126
|
+
if s
|
127
|
+
s
|
128
|
+
elsif e =~ /[0-9]+(.[0-9]+)?/
|
129
|
+
number(e)
|
130
|
+
elsif e.length > 1
|
131
|
+
text(e)
|
132
|
+
else
|
133
|
+
identifier(e)
|
134
|
+
end
|
135
|
+
when Symbol
|
136
|
+
raise "Not supported"
|
137
|
+
when Array
|
138
|
+
seq(*e)
|
139
|
+
else
|
140
|
+
e
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require 'rspec'
|
3
|
+
require 'asciimath'
|
4
|
+
require_relative 'ast'
|
5
|
+
|
6
|
+
RSpec.configure do |c|
|
7
|
+
c.include ::AsciiMath::ASTHelper
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'AsciiMath::Parser', :variant => :ast do
|
11
|
+
it "should support custom symbols" do
|
12
|
+
my_tokens_table = AsciiMath::SymbolTableBuilder.new
|
13
|
+
AsciiMath::Parser.add_default_parser_symbols(my_tokens_table)
|
14
|
+
my_tokens_table.add('mysymbol', :mysymbol, :symbol)
|
15
|
+
|
16
|
+
parsed = AsciiMath::parse("a + mysymbol + b", my_tokens_table.build)
|
17
|
+
expect(parsed.ast).to eq(seq(identifier('a'), symbol('+'), ::AsciiMath::AST::Symbol.new(:mysymbol, 'mysymbol'), symbol('+'), identifier('b')))
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should support replacing standard symbols" do
|
21
|
+
my_tokens_table = AsciiMath::SymbolTableBuilder.new
|
22
|
+
AsciiMath::Parser.add_default_parser_symbols(my_tokens_table)
|
23
|
+
my_tokens_table.add('+', :foo, :symbol)
|
24
|
+
|
25
|
+
parsed = AsciiMath::parse("a + b", my_tokens_table.build)
|
26
|
+
expect(parsed.ast).to eq(seq(identifier('a'), ::AsciiMath::AST::Symbol.new(:foo, '+'), identifier('b')))
|
27
|
+
end
|
28
|
+
end
|
data/spec/parser_spec.rb
CHANGED
@@ -1,179 +1,637 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
require 'rspec'
|
3
3
|
require 'asciimath'
|
4
|
+
require_relative 'ast'
|
5
|
+
require 'nokogiri'
|
4
6
|
|
5
|
-
TEST_CASES = {
|
6
|
-
'x+b/(2a)<+-sqrt((b^2)/(4a^2)-c/a)' =>
|
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 => nil,
|
10
|
-
},
|
11
|
-
'a^2 + b^2 = c^2' =>
|
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
|
-
},
|
16
|
-
'x = (-b+-sqrt(b^2-4ac))/(2a)' =>
|
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 => nil
|
20
|
-
},
|
21
|
-
'm = (y_2 - y_1)/(x_2 - x_1) = (Deltay)/(Deltax)' =>
|
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
|
-
},
|
26
|
-
'f\'(x) = lim_(Deltax->0)(f(x+Deltax)-f(x))/(Deltax)' =>
|
27
|
-
{
|
28
|
-
:mathml => '<math><mi>f</mi><mi>\'</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mo>=</mo><munder><mo>lim</mo><mrow><mo>Δ</mo><mi>x</mi><mo>→</mo><mn>0</mn></mrow></munder><mfrac><mrow><mi>f</mi><mfenced open="(" close=")"><mrow><mi>x</mi><mo>+</mo><mo>Δ</mo><mi>x</mi></mrow></mfenced><mo>−</mo><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></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
|
-
},
|
31
|
-
'd/dx [x^n] = nx^(n - 1)' =>
|
32
|
-
{
|
33
|
-
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mfenced open="[" close="]"><msup><mi>x</mi><mi>n</mi></msup></mfenced><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
|
-
},
|
36
|
-
'int_a^b f(x) dx = [F(x)]_a^b = F(b) - F(a)' =>
|
37
|
-
{
|
38
|
-
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi><mo>=</mo><msubsup><mfenced open="[" close="]"><mrow><mi>F</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></mrow></mfenced><mi>a</mi><mi>b</mi></msubsup><mo>=</mo><mi>F</mi><mfenced open="(" close=")"><mi>b</mi></mfenced><mo>−</mo><mi>F</mi><mfenced open="(" close=")"><mi>a</mi></mfenced></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
|
-
},
|
41
|
-
'int_a^b f(x) dx = f(c)(b - a)' =>
|
42
|
-
{
|
43
|
-
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi><mo>=</mo><mi>f</mi><mfenced open="(" close=")"><mi>c</mi></mfenced><mfenced open="(" close=")"><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow></mfenced></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
|
-
},
|
46
|
-
'ax^2 + bx + c = 0' =>
|
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
|
-
},
|
51
|
-
'"average value"=1/(b-a) int_a^b f(x) dx' =>
|
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><mfenced open="(" close=")"><mi>x</mi></mfenced><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
|
-
},
|
56
|
-
'd/dx[int_a^x f(t) dt] = f(x)' =>
|
57
|
-
{
|
58
|
-
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mfenced open="[" close="]"><mrow><msubsup><mo>∫</mo><mi>a</mi><mi>x</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>t</mi></mfenced><mi>dt</mi></mrow></mfenced><mo>=</mo><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></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
|
-
},
|
61
|
-
'hat(ab) bar(xy) ul(A) vec(v)' =>
|
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
|
-
},
|
66
|
-
'z_12^34' =>
|
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
|
-
},
|
71
|
-
'lim_(x->c)(f(x)-f(c))/(x-c)' =>
|
72
|
-
{
|
73
|
-
:mathml => '<math><munder><mo>lim</mo><mrow><mi>x</mi><mo>→</mo><mi>c</mi></mrow></munder><mfrac><mrow><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mo>−</mo><mi>f</mi><mfenced open="(" close=")"><mi>c</mi></mfenced></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
|
-
},
|
76
|
-
'int_0^(pi/2) g(x) dx' =>
|
77
|
-
{
|
78
|
-
:mathml => '<math><msubsup><mo>∫</mo><mn>0</mn><mfrac><mi>π</mi><mn>2</mn></mfrac></msubsup><mi>g</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><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
|
-
},
|
81
|
-
'sum_(n=0)^oo a_n' =>
|
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
|
-
},
|
86
|
-
'((1,2,3),(4,5,6),(7,8,9))' =>
|
87
|
-
{
|
88
|
-
:mathml => '<math><mfenced open="(" close=")"><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></mfenced></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
|
-
},
|
91
|
-
'|(a,b),(c,d)|=ad-bc' =>
|
92
|
-
{
|
93
|
-
:mathml => '<math><mfenced open="|" close="|"><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></mfenced><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
|
-
},
|
96
|
-
'((a_(11), cdots , a_(1n)),(vdots, ddots, vdots),(a_(m1), cdots , a_(mn)))' =>
|
97
|
-
{
|
98
|
-
:mathml => '<math><mfenced open="(" close=")"><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></mfenced></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
|
-
},
|
101
|
-
'sum_(k=1)^n k = 1+2+ cdots +n=(n(n+1))/2' =>
|
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><mfenced open="(" close=")"><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></mfenced></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
|
-
},
|
106
|
-
'"Скорость"=("Расстояние")/("Время")' =>
|
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
|
-
},
|
111
|
-
'bb (a + b) + cc c = fr (d^n)' =>
|
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 => nil
|
115
|
-
},
|
116
|
-
'max()' =>
|
117
|
-
{
|
118
|
-
:mathml => '<math><mi>max</mi><mfenced open="(" close=")"></mfenced></math>',
|
119
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">max</span><span class="math-row"><span class="math-brace">(</span><span class="math-brace">)</span></span></span></span>'
|
120
|
-
},
|
121
|
-
'text("foo")' => {
|
122
|
-
:mathml => '<math><mtext>"foo"</mtext></math>',
|
123
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">"foo"</span></span></span>'
|
124
|
-
},
|
125
|
-
'ubrace(1 + 2) obrace(3 + 4' => {
|
126
|
-
:mathml => '<math><munder><mrow><mn>1</mn><mo>+</mo><mn>2</mn></mrow><mo>⏟</mo></munder><mover><mrow><mn>3</mn><mo>+</mo><mn>4</mn></mrow><mo>⏞</mo></mover></math>'
|
127
|
-
},
|
128
|
-
"s'_i = {(- 1, if s_i > s_(i + 1)),( + 1, if s_i <= s_(i + 1)):}" => {
|
129
|
-
:mathml => '<math><mi>s</mi><msub><mi>\'</mi><mi>i</mi></msub><mo>=</mo><mfenced open="{" close=""><mtable><mtr><mtd><mrow><mo>−</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr></mtable></mfenced></math>'
|
130
|
-
},
|
131
|
-
"s'_i = {(, if s_i > s_(i + 1)),( + 1,):}" => {
|
132
|
-
:mathml => '<math><mi>s</mi><msub><mi>\'</mi><mi>i</mi></msub><mo>=</mo><mfenced open="{" close=""><mtable><mtr><mtd></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd></mtd></mtr></mtable></mfenced></math>'
|
133
|
-
},
|
134
|
-
'{:(a,b),(c,d):}' => {
|
135
|
-
:mathml => '<math><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></math>'
|
136
|
-
},
|
137
|
-
}
|
138
|
-
|
139
|
-
version = RUBY_VERSION.split('.').map { |s| s.to_i }
|
140
|
-
|
141
|
-
if version[0] > 1 || version[1] > 8
|
142
|
-
TEST_CASES['Скорость=(Расстояние)/(Время)'] =
|
143
|
-
{
|
144
|
-
: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>',
|
145
|
-
: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>'
|
146
|
-
}
|
147
|
-
end
|
148
7
|
|
149
|
-
module
|
150
|
-
def
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
def expect_html(asciimath, html)
|
155
|
-
expect(AsciiMath.parse(asciimath).to_html).to eq(html)
|
8
|
+
module Xml
|
9
|
+
def self.mathml2_xsd
|
10
|
+
@mathml2_schema ||= File.open(File.expand_path('../schema/mathml2/mathml2.xsd', __FILE__)) { |io| Nokogiri::XML::Schema(io) }
|
156
11
|
end
|
157
|
-
end
|
158
12
|
|
159
|
-
|
160
|
-
|
161
|
-
end
|
13
|
+
def self.mathml3_xsd
|
14
|
+
@mathml3_schema ||= File.open(File.expand_path('../schema/mathml3/mathml3.xsd', __FILE__)) { |io| Nokogiri::XML::Schema(io) }
|
15
|
+
end
|
162
16
|
|
163
|
-
|
164
|
-
|
165
|
-
it "'#{asciimath}' to MathML" do
|
166
|
-
expect_mathml(asciimath, output[:mathml])
|
167
|
-
end
|
17
|
+
def self.parse(content)
|
18
|
+
Nokogiri::XML(content)
|
168
19
|
end
|
169
20
|
end
|
170
21
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
22
|
+
def should_generate(expected_output)
|
23
|
+
Proc.new { |example|
|
24
|
+
parsed = AsciiMath.parse(example.description)
|
25
|
+
variant = example.metadata[:variant]
|
26
|
+
if variant
|
27
|
+
if expected_output.key?(variant)
|
28
|
+
expected = expected_output[variant]
|
29
|
+
case variant
|
30
|
+
when :ast
|
31
|
+
expect(parsed.ast).to eq(expected)
|
32
|
+
when :mathml
|
33
|
+
expect(parsed.to_mathml).to eq(expected)
|
34
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE != 'jruby'
|
35
|
+
xml_dom = Xml.parse(parsed.to_mathml(:xmlns => 'http://www.w3.org/1998/Math/MathML'))
|
36
|
+
Xml.mathml2_xsd.validate(xml_dom).each do |error|
|
37
|
+
fail(error.message)
|
38
|
+
end
|
39
|
+
Xml.mathml3_xsd.validate(xml_dom).each do |error|
|
40
|
+
fail(error.message)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
when :mathml_word
|
44
|
+
expect(::AsciiMath::MathMLBuilder.new(:msword => true).append_expression(parsed.ast).to_s).to eq(expected)
|
45
|
+
when :html
|
46
|
+
expect(parsed.to_html).to eq(expected)
|
47
|
+
when :latex
|
48
|
+
expect(parsed.to_latex).to eq(expected)
|
49
|
+
else
|
50
|
+
skip("Unsupported output variant '#{variant}'")
|
51
|
+
end
|
52
|
+
else
|
53
|
+
skip("No example output provided for '#{variant}'")
|
176
54
|
end
|
55
|
+
else
|
56
|
+
skip('No known output variant found')
|
177
57
|
end
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
RSpec.shared_examples 'AsciiMath Examples' do
|
62
|
+
class << self
|
63
|
+
include ::AsciiMath::ASTHelper
|
178
64
|
end
|
179
|
-
|
65
|
+
|
66
|
+
example('underset(_)(hat A) = hat A exp j vartheta_0', &should_generate(
|
67
|
+
:ast => seq(
|
68
|
+
binary(
|
69
|
+
symbol('underset'),
|
70
|
+
group(symbol('_')),
|
71
|
+
group(unary(symbol('hat'), 'A'))
|
72
|
+
),
|
73
|
+
symbol('='),
|
74
|
+
unary(symbol('hat'), 'A'),
|
75
|
+
symbol('exp'),
|
76
|
+
'j',
|
77
|
+
sub(symbol('vartheta'), '0')
|
78
|
+
),
|
79
|
+
:mathml => '<math><munder><mover accent="true"><mi>A</mi><mo>^</mo></mover><mo>_</mo></munder><mo>=</mo><mover accent="true"><mi>A</mi><mo>^</mo></mover><mi>exp</mi><mi>j</mi><msub><mi>ϑ</mi><mn>0</mn></msub></math>',
|
80
|
+
:mathml_word => '<math><munder><mrow><mover accent="true"><mrow><mi>A</mi></mrow><mo>^</mo></mover></mrow><mrow><mo>_</mo></mrow></munder><mo>=</mo><mover accent="true"><mrow><mi>A</mi></mrow><mo>^</mo></mover><mi>exp</mi><mi>j</mi><msub><mrow><mi>ϑ</mi></mrow><mrow><mn>0</mn></mrow></msub></math>',
|
81
|
+
:latex => '\\underset{\\text{–}}{\\hat{A}} = \\hat{A} \\exp j \\vartheta_0'
|
82
|
+
))
|
83
|
+
|
84
|
+
example('x+b/(2a)<+-sqrt((b^2)/(4a^2)-c/a)', &should_generate(
|
85
|
+
:ast => seq(
|
86
|
+
'x',
|
87
|
+
symbol('+'),
|
88
|
+
infix('b', symbol('/'), grseq('2', 'a')),
|
89
|
+
symbol('<'),
|
90
|
+
symbol('+-'),
|
91
|
+
unary(
|
92
|
+
symbol('sqrt'),
|
93
|
+
grseq(
|
94
|
+
infix(
|
95
|
+
group(sup('b', '2')),
|
96
|
+
symbol('/'),
|
97
|
+
grseq('4', sup('a', '2'))
|
98
|
+
),
|
99
|
+
symbol('-'),
|
100
|
+
infix('c', symbol('/'), 'a')
|
101
|
+
)
|
102
|
+
)
|
103
|
+
),
|
104
|
+
: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>',
|
105
|
+
:latex => 'x + \\frac{b}{2 a} < \\pm \\sqrt{\\frac{b^2}{4 a^2} - \\frac{c}{a}}',
|
106
|
+
))
|
107
|
+
|
108
|
+
example('a^2 + b^2 = c^2', &should_generate(
|
109
|
+
:ast => seq(
|
110
|
+
sup('a', '2'),
|
111
|
+
symbol('+'),
|
112
|
+
sup('b', '2'),
|
113
|
+
symbol('='),
|
114
|
+
sup('c', '2')
|
115
|
+
),
|
116
|
+
: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>',
|
117
|
+
:html => '<span class="math-inline"><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>',
|
118
|
+
:latex => 'a^2 + b^2 = c^2',
|
119
|
+
|
120
|
+
))
|
121
|
+
|
122
|
+
example('x = (-b+-sqrt(b^2-4ac))/(2a)', &should_generate(
|
123
|
+
:ast => seq(
|
124
|
+
'x',
|
125
|
+
symbol('='),
|
126
|
+
infix(
|
127
|
+
grseq(
|
128
|
+
symbol('-'), 'b',
|
129
|
+
symbol('+-'),
|
130
|
+
unary(symbol('sqrt'), grseq(sup('b', '2'), symbol('-'), '4', 'a', 'c'))
|
131
|
+
),
|
132
|
+
symbol('/'),
|
133
|
+
grseq('2', 'a'),
|
134
|
+
)
|
135
|
+
),
|
136
|
+
: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><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math>',
|
137
|
+
:latex => 'x = \\frac{- b \\pm \\sqrt{b^2 - 4 a c}}{2 a}',
|
138
|
+
))
|
139
|
+
|
140
|
+
example('m = (y_2 - y_1)/(x_2 - x_1) = (Deltay)/(Deltax)', &should_generate(
|
141
|
+
:ast => seq(
|
142
|
+
'm',
|
143
|
+
symbol('='),
|
144
|
+
infix(grseq(sub('y', '2'), symbol('-'), sub('y', '1')), symbol('/'), grseq(sub('x', '2'), symbol('-'), sub('x', '1'))),
|
145
|
+
symbol('='),
|
146
|
+
infix(grseq(symbol('Delta'), 'y'), symbol('/'), grseq(symbol('Delta'), 'x')),
|
147
|
+
),
|
148
|
+
: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>',
|
149
|
+
:html => '<span class="math-inline"><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>',
|
150
|
+
:latex => 'm = \\frac{y_2 - y_1}{x_2 - x_1} = \\frac{\\Delta y}{\\Delta x}',
|
151
|
+
))
|
152
|
+
|
153
|
+
example('f\'(x) = lim_(Deltax->0)(f(x+Deltax)-f(x))/(Deltax)', &should_generate(
|
154
|
+
:ast => seq(
|
155
|
+
symbol('f'),
|
156
|
+
symbol('\''),
|
157
|
+
paren('x'),
|
158
|
+
symbol('='),
|
159
|
+
sub(
|
160
|
+
symbol('lim'),
|
161
|
+
grseq(symbol('Delta'), 'x', symbol('->'), '0')
|
162
|
+
),
|
163
|
+
infix(
|
164
|
+
grseq(symbol('f'), paren(seq('x', symbol('+'), symbol('Delta'), 'x')), symbol('-'), symbol('f'), paren('x')),
|
165
|
+
symbol('/'),
|
166
|
+
grseq(symbol('Delta'), 'x')
|
167
|
+
)
|
168
|
+
),
|
169
|
+
:mathml => '<math><mi>f</mi><mo>′</mo><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><mrow><mi>x</mi><mo>+</mo><mo>Δ</mo><mi>x</mi></mrow><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>',
|
170
|
+
:html => '<span class="math-inline"><span class="math-identifier">f</span><span class="math-operator">′</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</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-identifier">x</span><span class="math-operator">+</span><span class="math-operator">Δ</span><span class="math-identifier">x</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-identifier">x</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>',
|
171
|
+
:latex => 'f \' ( x ) = \\lim_{\\Delta x \\rightarrow 0} \\frac{f \\left ( x + \\Delta x \\right ) - f ( x )}{\\Delta x}',
|
172
|
+
))
|
173
|
+
|
174
|
+
example('d/dx [x^n] = nx^(n - 1)', &should_generate(
|
175
|
+
:ast => seq(
|
176
|
+
infix('d', symbol('/'), symbol('dx')),
|
177
|
+
paren(symbol('['), sup('x', 'n'), symbol(']')),
|
178
|
+
symbol('='),
|
179
|
+
'n',
|
180
|
+
sup('x', grseq('n', symbol('-'), '1'))
|
181
|
+
),
|
182
|
+
: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>',
|
183
|
+
:html => '<span class="math-inline"><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-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 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>',
|
184
|
+
:latex => '\\frac{d}{dx} [ x^n ] = n x^{n - 1}',
|
185
|
+
))
|
186
|
+
|
187
|
+
example('int_a^b f(x) dx = [F(x)]_a^b = F(b) - F(a)', &should_generate(
|
188
|
+
:ast => seq(
|
189
|
+
subsup(symbol('int'), 'a', 'b'),
|
190
|
+
symbol('f'),
|
191
|
+
paren('x'),
|
192
|
+
symbol('dx'),
|
193
|
+
symbol('='),
|
194
|
+
subsup(paren(symbol('['), seq('F', paren('x')), symbol(']')), 'a', 'b'),
|
195
|
+
symbol('='),
|
196
|
+
'F', paren('b'),
|
197
|
+
symbol('-'),
|
198
|
+
'F', paren('a')
|
199
|
+
),
|
200
|
+
: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><mrow><mi>F</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></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>',
|
201
|
+
:html => '<span class="math-inline"><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-identifier">x</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-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</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-identifier">b</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-identifier">a</span><span class="math-brace">)</span></span></span>',
|
202
|
+
:latex => '\\int_a^b f ( x ) dx = {\\left [ F ( x ) \\right ]}_a^b = F ( b ) - F ( a )',
|
203
|
+
))
|
204
|
+
|
205
|
+
example('int_a^b f(x) dx = f(c)(b - a)', &should_generate(
|
206
|
+
:ast => seq(
|
207
|
+
subsup(symbol('int'), 'a', 'b'),
|
208
|
+
symbol('f'),
|
209
|
+
paren('x'),
|
210
|
+
symbol('dx'),
|
211
|
+
symbol('='),
|
212
|
+
symbol('f'),
|
213
|
+
paren('c'),
|
214
|
+
paren(seq('b', symbol('-'), 'a')),
|
215
|
+
),
|
216
|
+
: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><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow><mo>)</mo></mrow></math>',
|
217
|
+
:html => '<span class="math-inline"><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-identifier">x</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-identifier">c</span><span class="math-brace">)</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span><span class="math-brace">)</span></span></span>',
|
218
|
+
:latex => '\\int_a^b f ( x ) dx = f ( c ) ( b - a )',
|
219
|
+
))
|
220
|
+
|
221
|
+
example('ax^2 + bx + c = 0', &should_generate(
|
222
|
+
:ast => seq(
|
223
|
+
'a',
|
224
|
+
sup('x', '2'),
|
225
|
+
symbol('+'),
|
226
|
+
'b',
|
227
|
+
'x',
|
228
|
+
symbol('+'),
|
229
|
+
'c',
|
230
|
+
symbol('='),
|
231
|
+
'0'
|
232
|
+
),
|
233
|
+
: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>',
|
234
|
+
:html => '<span class="math-inline"><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>',
|
235
|
+
:latex => 'a x^2 + b x + c = 0',
|
236
|
+
))
|
237
|
+
|
238
|
+
example('"average value"=1/(b-a) int_a^b f(x) dx', &should_generate(
|
239
|
+
:ast => seq(
|
240
|
+
'average value',
|
241
|
+
symbol('='),
|
242
|
+
infix('1', symbol('/'), grseq('b', symbol('-'), 'a')),
|
243
|
+
subsup(symbol('int'), 'a', 'b'),
|
244
|
+
symbol('f'),
|
245
|
+
paren('x'),
|
246
|
+
symbol('dx')
|
247
|
+
),
|
248
|
+
: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>',
|
249
|
+
:html => '<span class="math-inline"><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-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span>',
|
250
|
+
:latex => '\\text{average value} = \\frac{1}{b - a} \\int_a^b f ( x ) dx',
|
251
|
+
))
|
252
|
+
|
253
|
+
example('d/dx[int_a^x f(t) dt] = f(x)', &should_generate(
|
254
|
+
:ast => seq(
|
255
|
+
infix('d', symbol('/'), symbol('dx')),
|
256
|
+
paren(
|
257
|
+
symbol('['),
|
258
|
+
seq(subsup(symbol('int'), 'a', 'x'), symbol('f'), paren('t'), symbol('dt')),
|
259
|
+
symbol(']')
|
260
|
+
),
|
261
|
+
symbol('='),
|
262
|
+
symbol('f'),
|
263
|
+
paren('x'),
|
264
|
+
),
|
265
|
+
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mrow><mo>[</mo><mrow><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></mrow><mo>]</mo></mrow><mo>=</mo><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></math>',
|
266
|
+
:html => '<span class="math-inline"><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-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-identifier">t</span><span class="math-brace">)</span></span><span class="math-identifier">dt</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-identifier">x</span><span class="math-brace">)</span></span></span>',
|
267
|
+
:latex => '\\frac{d}{dx} \\left [ \\int_a^x f ( t ) dt \\right ] = f ( x )',
|
268
|
+
))
|
269
|
+
|
270
|
+
example('hat(ab) bar(xy) ul(A) vec(v)', &should_generate(
|
271
|
+
:ast => seq(
|
272
|
+
unary(symbol('hat'), grseq('a', 'b')),
|
273
|
+
unary(symbol('bar'), grseq('x', 'y')),
|
274
|
+
unary(symbol('ul'), group('A')),
|
275
|
+
unary(symbol('vec'), group('v')),
|
276
|
+
),
|
277
|
+
:mathml => '<math><mover accent="true"><mrow><mi>a</mi><mi>b</mi></mrow><mo>^</mo></mover><mover accent="true"><mrow><mi>x</mi><mi>y</mi></mrow><mo>¯</mo></mover><munder accentunder="true"><mi>A</mi><mo>_</mo></munder><mover accent="true"><mi>v</mi><mo>→</mo></mover></math>',
|
278
|
+
:html => '<span class="math-inline"><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-identifier">a</span><span class="math-identifier">b</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-identifier">x</span><span class="math-identifier">y</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-identifier">A</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-identifier">v</span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span>',
|
279
|
+
:latex => '\\hat{a b} \\overline{x y} \\underline{A} \\vec{v}',
|
280
|
+
))
|
281
|
+
|
282
|
+
example('z_12^34', &should_generate(
|
283
|
+
:ast => subsup('z', '12', '34'),
|
284
|
+
:mathml => '<math><msubsup><mi>z</mi><mn>12</mn><mn>34</mn></msubsup></math>',
|
285
|
+
:html => '<span class="math-inline"><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>',
|
286
|
+
:latex => 'z_{12}^{34}',
|
287
|
+
))
|
288
|
+
|
289
|
+
example('lim_(x->c)(f(x)-f(c))/(x-c)', &should_generate(
|
290
|
+
:ast => seq(
|
291
|
+
sub(symbol('lim'), grseq('x', symbol('->'), 'c')),
|
292
|
+
infix(
|
293
|
+
grseq(symbol('f'), paren('x'), symbol('-'), symbol('f'), paren('c')),
|
294
|
+
symbol('/'),
|
295
|
+
grseq('x', symbol('-'), 'c')
|
296
|
+
)
|
297
|
+
),
|
298
|
+
: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>',
|
299
|
+
:html => '<span class="math-inline"><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-identifier">x</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-identifier">c</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>',
|
300
|
+
:latex => '\\lim_{x \\rightarrow c} \\frac{f ( x ) - f ( c )}{x - c}',
|
301
|
+
))
|
302
|
+
|
303
|
+
example('int_0^(pi/2) g(x) dx', &should_generate(
|
304
|
+
:ast => seq(
|
305
|
+
subsup(symbol('int'), '0', group(infix(symbol('pi'), symbol('/'), '2'))),
|
306
|
+
symbol('g'), paren('x'),
|
307
|
+
symbol('dx')
|
308
|
+
),
|
309
|
+
: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>',
|
310
|
+
:html => '<span class="math-inline"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><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 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-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span>',
|
311
|
+
:latex => '\\int_0^{\\frac{\\pi}{2}} g ( x ) dx',
|
312
|
+
))
|
313
|
+
|
314
|
+
example('sum_(n=0)^oo a_n', &should_generate(
|
315
|
+
:ast => seq(
|
316
|
+
subsup(symbol('sum'), grseq('n', symbol('='), '0'), symbol('oo'),),
|
317
|
+
sub('a', 'n')
|
318
|
+
),
|
319
|
+
: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>',
|
320
|
+
:html => '<span class="math-inline"><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>',
|
321
|
+
:latex => '\\sum_{n = 0}^\\infty a_n',
|
322
|
+
))
|
323
|
+
|
324
|
+
example('((1),(42))', &should_generate(
|
325
|
+
:ast => matrix([%w[1], %w[42]]),
|
326
|
+
:mathml => '<math><mrow><mo>(</mo><mtable><mtr><mtd><mn>1</mn></mtd></mtr><mtr><mtd><mn>42</mn></mtd></mtr></mtable><mo>)</mo></mrow></math>',
|
327
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace" style="font-size: 200%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(1,1fr);grid-template-rows:repeat(2,1fr);"><span class="math-row"><span class="math-number">1</span></span><span class="math-row"><span class="math-number">42</span></span></span><span class="math-brace" style="font-size: 200%;">)</span></span></span>',
|
328
|
+
:latex => '\\left ( \\begin{matrix} 1 \\\\ 42 \\end{matrix} \\right )',
|
329
|
+
))
|
330
|
+
|
331
|
+
example('((1,2,3),(4,5,6),(7,8,9))', &should_generate(
|
332
|
+
:ast => matrix([%w[1 2 3], %w[4 5 6], %w[7 8 9]]),
|
333
|
+
: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>',
|
334
|
+
:html => '<span class="math-inline"><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>',
|
335
|
+
:latex => '\\left ( \\begin{matrix} 1 & 2 & 3 \\\\ 4 & 5 & 6 \\\\ 7 & 8 & 9 \\end{matrix} \\right )',
|
336
|
+
))
|
337
|
+
|
338
|
+
example('|(a,b),(c,d)|=ad-bc', &should_generate(
|
339
|
+
:ast => seq(
|
340
|
+
matrix(symbol('|'), [%w(a b), %w(c d)], symbol('|'),),
|
341
|
+
symbol('='),
|
342
|
+
'a', 'd',
|
343
|
+
symbol('-'),
|
344
|
+
'b', 'c'
|
345
|
+
),
|
346
|
+
: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>',
|
347
|
+
:mathml_word => '<math><mfenced open="|" close="|"><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></mfenced><mo>=</mo><mi>a</mi><mi>d</mi><mo>−</mo><mi>b</mi><mi>c</mi></math>',
|
348
|
+
:html => '<span class="math-inline"><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>',
|
349
|
+
:latex => '\\left | \\begin{matrix} a & b \\\\ c & d \\end{matrix} \\right | = a d - b c',
|
350
|
+
))
|
351
|
+
|
352
|
+
example('((a_(11), cdots , a_(1n)),(vdots, ddots, vdots),(a_(m1), cdots , a_(mn)))', &should_generate(
|
353
|
+
:ast => matrix([
|
354
|
+
[sub('a', group('11')), symbol('cdots'), sub('a', grseq('1', 'n'))],
|
355
|
+
[symbol('vdots'), symbol('ddots'), symbol('vdots')],
|
356
|
+
[sub('a', grseq('m', '1')), symbol('cdots'), sub('a', grseq('m', 'n'))]
|
357
|
+
]),
|
358
|
+
: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>',
|
359
|
+
:html => '<span class="math-inline"><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-number">11</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>',
|
360
|
+
:latex => '\\left ( \\begin{matrix} a_{11} & \\cdots & a_{1 n} \\\\ \\vdots & \\ddots & \\vdots \\\\ a_{m 1} & \\cdots & a_{m n} \\end{matrix} \\right )',
|
361
|
+
))
|
362
|
+
|
363
|
+
example('sum_(k=1)^n k = 1+2+ cdots +n=(n(n+1))/2', &should_generate(
|
364
|
+
:ast => seq(
|
365
|
+
subsup(symbol('sum'), grseq('k', symbol('='), '1'), 'n'),
|
366
|
+
'k',
|
367
|
+
symbol('='),
|
368
|
+
'1', symbol('+'), '2', symbol('+'), symbol('cdots'), symbol('+'), 'n',
|
369
|
+
symbol('='),
|
370
|
+
infix(
|
371
|
+
grseq('n', paren(seq('n', symbol('+'), '1'))),
|
372
|
+
symbol('/'),
|
373
|
+
'2'
|
374
|
+
)
|
375
|
+
),
|
376
|
+
: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><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mn>2</mn></mfrac></math>',
|
377
|
+
:html => '<span class="math-inline"><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-identifier">n</span><span class="math-operator">+</span><span class="math-number">1</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>',
|
378
|
+
:latex => '\\sum_{k = 1}^n k = 1 + 2 + \\cdots + n = \\frac{n ( n + 1 )}{2}',
|
379
|
+
))
|
380
|
+
|
381
|
+
example('"Скорость"=("Расстояние")/("Время")', &should_generate(
|
382
|
+
:ast => seq(
|
383
|
+
'Скорость',
|
384
|
+
symbol('='),
|
385
|
+
infix(group('Расстояние'), symbol('/'), group('Время'))
|
386
|
+
),
|
387
|
+
:mathml => '<math><mtext>Скорость</mtext><mo>=</mo><mfrac><mtext>Расстояние</mtext><mtext>Время</mtext></mfrac></math>',
|
388
|
+
:html => '<span class="math-inline"><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-text">Расстояние</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-text">Время</span></span></span></span></span></span></span>',
|
389
|
+
:latex => '\\text{Скорость} = \\frac{\\text{Расстояние}}{\\text{Время}}',
|
390
|
+
))
|
391
|
+
|
392
|
+
example('bb (a + b) + cc c = fr (d^n)', &should_generate(
|
393
|
+
:ast => seq(
|
394
|
+
unary(symbol('bb'), grseq('a', symbol('+'), 'b')),
|
395
|
+
symbol('+'),
|
396
|
+
unary(symbol('cc'), 'c'),
|
397
|
+
symbol('='),
|
398
|
+
unary(symbol('fr'), group(sup('d', 'n')))
|
399
|
+
),
|
400
|
+
: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>',
|
401
|
+
:latex => '\\mathbf{a + b} + \\mathscr{c} = \\mathfrak{d^n}',
|
402
|
+
))
|
403
|
+
|
404
|
+
example('max()', &should_generate(
|
405
|
+
:ast => seq(symbol('max'), paren(nil)),
|
406
|
+
:mathml => '<math><mo>max</mo><mrow><mo>(</mo><mo>)</mo></mrow></math>',
|
407
|
+
:html => '<span class="math-inline"><span class="math-operator">max</span><span class="math-row"><span class="math-brace">(</span><span class="math-brace">)</span></span></span>',
|
408
|
+
:latex => '\\max ( )',
|
409
|
+
))
|
410
|
+
|
411
|
+
example('text("foo")', &should_generate(
|
412
|
+
:ast => text('"foo"'),
|
413
|
+
:mathml => '<math><mtext>"foo"</mtext></math>',
|
414
|
+
:html => '<span class="math-inline"><span class="math-text">"foo"</span></span>',
|
415
|
+
:latex => '\\text{"foo"}',
|
416
|
+
))
|
417
|
+
|
418
|
+
example('ubrace(1 + 2) obrace(3 + 4', &should_generate(
|
419
|
+
:ast => seq(
|
420
|
+
unary(symbol('ubrace'), grseq('1', symbol('+'), '2')),
|
421
|
+
unary(symbol('obrace'), group(symbol('('), seq('3', symbol('+'), '4'), nil))
|
422
|
+
),
|
423
|
+
:mathml => '<math><munder accentunder="true"><mrow><mn>1</mn><mo>+</mo><mn>2</mn></mrow><mo>⏟</mo></munder><mover accent="true"><mrow><mn>3</mn><mo>+</mo><mn>4</mn></mrow><mo>⏞</mo></mover></math>',
|
424
|
+
:latex => '\\underbrace{1 + 2} \\overbrace{3 + 4}',
|
425
|
+
))
|
426
|
+
|
427
|
+
example('s\'_i = {(- 1, if s_i > s_(i + 1)),( + 1, if s_i <= s_(i + 1)):}', &should_generate(
|
428
|
+
:ast => seq(
|
429
|
+
's',
|
430
|
+
sub(symbol('\''), 'i'),
|
431
|
+
symbol('='),
|
432
|
+
matrix(
|
433
|
+
symbol('{'),
|
434
|
+
[
|
435
|
+
[seq(symbol('-'), '1'), seq(symbol('if'), sub('s', 'i'), symbol('>'), sub('s', grseq('i', symbol('+'), '1')))],
|
436
|
+
[seq(symbol('+'), '1'), seq(symbol('if'), sub('s', 'i'), symbol('<='), sub('s', grseq('i', symbol('+'), '1')))]
|
437
|
+
],
|
438
|
+
symbol(':}'),
|
439
|
+
)
|
440
|
+
),
|
441
|
+
:mathml => '<math><mi>s</mi><msub><mo>′</mo><mi>i</mi></msub><mo>=</mo><mrow><mo>{</mo><mtable><mtr><mtd><mrow><mo>−</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr></mtable></mrow></math>',
|
442
|
+
:latex => 's \'_i = \\left \\{ \\begin{matrix} - 1 & \\operatorname{if} s_i > s_{i + 1} \\\\ + 1 & \\operatorname{if} s_i \\le s_{i + 1} \\end{matrix} \\right .',
|
443
|
+
))
|
444
|
+
|
445
|
+
example('s\'_i = {(, if s_i > s_(i + 1)),( + 1,):}', &should_generate(
|
446
|
+
:ast => seq(
|
447
|
+
's',
|
448
|
+
sub(symbol('\''), 'i'),
|
449
|
+
symbol('='),
|
450
|
+
matrix(
|
451
|
+
symbol('{'),
|
452
|
+
[
|
453
|
+
[[], [symbol('if'), sub('s', 'i'), symbol('>'), sub('s', grseq('i', symbol('+'), '1'))]],
|
454
|
+
[[symbol('+'), '1'], []]
|
455
|
+
],
|
456
|
+
symbol(':}')
|
457
|
+
)
|
458
|
+
),
|
459
|
+
:mathml => '<math><mi>s</mi><msub><mo>′</mo><mi>i</mi></msub><mo>=</mo><mrow><mo>{</mo><mtable><mtr><mtd></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd></mtd></mtr></mtable></mrow></math>',
|
460
|
+
:latex => 's \'_i = \\left \\{ \\begin{matrix} & \\operatorname{if} s_i > s_{i + 1} \\\\ + 1 & \\end{matrix} \\right .',
|
461
|
+
))
|
462
|
+
|
463
|
+
example('{:(a,b),(c,d):}', &should_generate(
|
464
|
+
:ast => matrix(
|
465
|
+
symbol('{:'),
|
466
|
+
[%w(a b), %w(c d)],
|
467
|
+
symbol(':}')
|
468
|
+
),
|
469
|
+
:mathml => '<math><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></math>',
|
470
|
+
:latex => '\\begin{matrix} a & b \\\\ c & d \\end{matrix}',
|
471
|
+
))
|
472
|
+
|
473
|
+
example('overset (a + b) (c + d)', &should_generate(
|
474
|
+
:ast => binary(
|
475
|
+
symbol('overset'),
|
476
|
+
grseq('a', symbol('+'), 'b'),
|
477
|
+
grseq('c', symbol('+'), 'd')
|
478
|
+
),
|
479
|
+
:mathml => '<math><mover><mrow><mi>c</mi><mo>+</mo><mi>d</mi></mrow><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mover></math>',
|
480
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-row"><span class="math-identifier">a</span><span class="math-operator">+</span><span class="math-identifier">b</span></span></span><span class="math-row"><span class="math-identifier">c</span><span class="math-operator">+</span><span class="math-identifier">d</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span>',
|
481
|
+
:latex => '\\overset{a + b}{c + d}',
|
482
|
+
))
|
483
|
+
|
484
|
+
example('underset a b', &should_generate(
|
485
|
+
:ast => binary(
|
486
|
+
symbol('underset'),
|
487
|
+
'a',
|
488
|
+
'b'
|
489
|
+
),
|
490
|
+
:mathml => '<math><munder><mi>b</mi><mi>a</mi></munder></math>',
|
491
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-identifier">b</span><span class="math-smaller"><span class="math-identifier">a</span></span></span></span>',
|
492
|
+
:latex => '\\underset{a}{b}',
|
493
|
+
))
|
494
|
+
|
495
|
+
example('sin a_c^b', &should_generate(
|
496
|
+
:ast => seq(
|
497
|
+
symbol('sin'),
|
498
|
+
subsup('a', 'c', 'b')
|
499
|
+
),
|
500
|
+
:mathml => '<math><mi>sin</mi><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup></math>',
|
501
|
+
:html => '<span class="math-inline"><span class="math-identifier">sin</span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">c</span></span></span></span>',
|
502
|
+
:latex => '\\sin a_c^b',
|
503
|
+
))
|
504
|
+
|
505
|
+
example('max a_c^b', &should_generate(
|
506
|
+
:ast => seq(
|
507
|
+
symbol('max'),
|
508
|
+
subsup('a', 'c', 'b')
|
509
|
+
),
|
510
|
+
:mathml => '<math><mo>max</mo><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup></math>',
|
511
|
+
:html => '<span class="math-inline"><span class="math-operator">max</span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">c</span></span></span></span>',
|
512
|
+
:latex => '\\max a_c^b',
|
513
|
+
))
|
514
|
+
|
515
|
+
example('norm a_c^b', &should_generate(
|
516
|
+
:ast => subsup(unary(symbol('norm'), 'a'), 'c', 'b'),
|
517
|
+
:mathml => '<math><msubsup><mrow><mo>∥</mo><mi>a</mi><mo>∥</mo></mrow><mi>c</mi><mi>b</mi></msubsup></math>',
|
518
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace">∥</span><span class="math-identifier">a</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">c</span></span></span></span>',
|
519
|
+
:latex => '{\\lVert a \\rVert}_c^b',
|
520
|
+
))
|
521
|
+
|
522
|
+
example('overarc a_b^c', &should_generate(
|
523
|
+
:ast => subsup(unary(symbol('overarc'), 'a'), 'b', 'c'),
|
524
|
+
:mathml => '<math><msubsup><mover accent="true"><mi>a</mi><mo>⏜</mo></mover><mi>b</mi><mi>c</mi></msubsup></math>',
|
525
|
+
:latex => '{\\overset{\\frown}{a}}_b^c'
|
526
|
+
))
|
527
|
+
|
528
|
+
example('frown a_b^c', &should_generate(
|
529
|
+
:ast => seq(symbol('frown'), subsup('a', 'b', 'c')),
|
530
|
+
:mathml => '<math><mo>⌢</mo><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></math>',
|
531
|
+
:latex => '\\frown a_b^c',
|
532
|
+
))
|
533
|
+
|
534
|
+
example('sin(a_c^b)', &should_generate(
|
535
|
+
:ast => seq(symbol('sin'), paren(subsup('a', 'c', 'b'))),
|
536
|
+
:mathml => '<math><mi>sin</mi><mrow><mo>(</mo><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup><mo>)</mo></mrow></math>',
|
537
|
+
:latex => '\\sin ( a_c^b )',
|
538
|
+
))
|
539
|
+
|
540
|
+
example('text(a)a2)', &should_generate(
|
541
|
+
:ast => seq(text('a'), identifier('a'), number('2'), symbol(')')),
|
542
|
+
:mathml => '<math><mtext>a</mtext><mi>a</mi><mn>2</mn><mo>)</mo></math>',
|
543
|
+
:html => '<span class="math-inline"><span class="math-text">a</span><span class="math-identifier">a</span><span class="math-number">2</span><span class="math-operator">)</span></span>',
|
544
|
+
:latex => '\\text{a} a 2 )',
|
545
|
+
))
|
546
|
+
|
547
|
+
example('cancel(a_b^c) cancel a_b^c', &should_generate(
|
548
|
+
:ast => seq(
|
549
|
+
unary(symbol('cancel'), group(subsup('a', 'b', 'c'))),
|
550
|
+
subsup(unary(symbol('cancel'), 'a'), 'b', 'c')
|
551
|
+
),
|
552
|
+
:mathml => '<math><menclose notation="updiagonalstrike"><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></menclose><msubsup><menclose notation="updiagonalstrike"><mi>a</mi></menclose><mi>b</mi><mi>c</mi></msubsup></math>',
|
553
|
+
:latex => '\\cancel{a_b^c} {\\cancel{a}}_b^c',
|
554
|
+
))
|
555
|
+
|
556
|
+
example('color(red)(x) color(#123)(y) color(#1234ab)(z) colortext(blue)(a_b^c)', &should_generate(
|
557
|
+
:ast => seq(
|
558
|
+
binary(symbol('color'), color(255, 0, 0, 'red'), group('x')),
|
559
|
+
binary(symbol('color'), color(17, 34, 51, '#123'), group('y')),
|
560
|
+
binary(symbol('color'), color(18, 52, 171, '#1234ab'), group('z')),
|
561
|
+
binary(symbol('color'), color(0, 0, 255, 'blue'), group(subsup('a', 'b', 'c')))
|
562
|
+
),
|
563
|
+
:mathml => '<math><mstyle mathcolor="#ff0000"><mi>x</mi></mstyle><mstyle mathcolor="#112233"><mi>y</mi></mstyle><mstyle mathcolor="#1234ab"><mi>z</mi></mstyle><mstyle mathcolor="#0000ff"><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></mstyle></math>',
|
564
|
+
:latex => '{\\color{red} x} {\\color[RGB]{17,34,51} y} {\\color[RGB]{18,52,171} z} {\\color{blue} a_b^c}',
|
565
|
+
))
|
566
|
+
|
567
|
+
example('{ x\ : \ x in A ^^ x in B }', &should_generate(
|
568
|
+
:ast => paren(
|
569
|
+
symbol('{'),
|
570
|
+
seq('x', symbol('\ '), ':', symbol('\ '), 'x', symbol('in'), 'A', symbol('^^'), 'x', symbol('in'), 'B'),
|
571
|
+
symbol('}')
|
572
|
+
),
|
573
|
+
:mathml => '<math><mrow><mo>{</mo><mrow><mi>x</mi><mo> </mo><mo>:</mo><mo> </mo><mi>x</mi><mo>∈</mo><mi>A</mi><mo>∧</mo><mi>x</mi><mo>∈</mo><mi>B</mi></mrow><mo>}</mo></mrow></math>',
|
574
|
+
:latex => '\\left \\{ x \\; : \\; x \\in A \\wedge x \\in B \\right \\}',
|
575
|
+
))
|
576
|
+
|
577
|
+
example('ii', &should_generate(
|
578
|
+
:ast => unary(symbol('ii'), identifier('')),
|
579
|
+
:mathml => '<math><mstyle mathvariant="italic"><mi></mi></mstyle></math>'
|
580
|
+
))
|
581
|
+
|
582
|
+
example('rm(ms)', &should_generate(
|
583
|
+
:ast => unary(symbol('rm'), grseq(identifier('m'), identifier('s'))),
|
584
|
+
:mathml => '<math><mstyle mathvariant="normal"><mrow><mi>m</mi><mi>s</mi></mrow></mstyle></math>'
|
585
|
+
))
|
586
|
+
|
587
|
+
example('hat', &should_generate(
|
588
|
+
:ast => unary(symbol('hat'), identifier('')),
|
589
|
+
:mathml => '<math><mover accent="true"><mi></mi><mo>^</mo></mover></math>'
|
590
|
+
))
|
591
|
+
|
592
|
+
example('40% * 3!', &should_generate(
|
593
|
+
:ast => seq('40', '%', symbol('*'), '3', '!'),
|
594
|
+
:mathml => '<math><mn>40</mn><mo>%</mo><mo>⋅</mo><mn>3</mn><mo>!</mo></math>',
|
595
|
+
:html => '<span class="math-inline"><span class="math-number">40</span><span class="math-operator">%</span><span class="math-operator">⋅</span><span class="math-number">3</span><span class="math-operator">!</span></span>',
|
596
|
+
:latex => '40 \% \cdot 3 !'
|
597
|
+
))
|
598
|
+
|
599
|
+
version = RUBY_VERSION.split('.').map { |s| s.to_i }
|
600
|
+
|
601
|
+
if version[0] > 1 || version[1] > 8
|
602
|
+
example('Скорость=(Расстояние)/(Время)', &should_generate(
|
603
|
+
:ast => seq(
|
604
|
+
'С', 'к', 'о', 'р', 'о', 'с', 'т', 'ь',
|
605
|
+
symbol('='),
|
606
|
+
infix(
|
607
|
+
grseq('Р', 'а', 'с', 'с', 'т', 'о', 'я', 'н', 'и', 'е'),
|
608
|
+
symbol('/'),
|
609
|
+
grseq('В', 'р', 'е', 'м', 'я')
|
610
|
+
)
|
611
|
+
),
|
612
|
+
: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>',
|
613
|
+
:html => '<span class="math-inline"><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>',
|
614
|
+
:latex => 'С к о р о с т ь = \\frac{Р а с с т о я н и е}{В р е м я}'
|
615
|
+
))
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
619
|
+
describe 'AsciiMath::Parser', :variant => :ast do
|
620
|
+
include_examples 'AsciiMath Examples'
|
621
|
+
end
|
622
|
+
|
623
|
+
describe 'AsciiMath::MathMLBuilder', :variant => :mathml do
|
624
|
+
include_examples 'AsciiMath Examples'
|
625
|
+
end
|
626
|
+
|
627
|
+
describe 'AsciiMath::MathMLBuilder Microsoft Office', :variant => :mathml_word do
|
628
|
+
include_examples 'AsciiMath Examples'
|
629
|
+
end
|
630
|
+
|
631
|
+
describe 'AsciiMath::HTMLBuilder', :variant => :html do
|
632
|
+
include_examples 'AsciiMath Examples', :html
|
633
|
+
end
|
634
|
+
|
635
|
+
describe 'AsciiMath::LatexBuilder', :variant => :latex do
|
636
|
+
include_examples 'AsciiMath Examples'
|
637
|
+
end
|