plurimath 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/lib/plurimath/asciimath/parse.rb +3 -2
- data/lib/plurimath/asciimath/transform.rb +32 -5
- data/lib/plurimath/latex/constants.rb +2 -1
- data/lib/plurimath/latex/transform.rb +9 -13
- data/lib/plurimath/math/core.rb +134 -20
- data/lib/plurimath/math/formula.rb +88 -18
- data/lib/plurimath/math/function/abs.rb +28 -15
- data/lib/plurimath/math/function/bar.rb +5 -0
- data/lib/plurimath/math/function/base.rb +14 -0
- data/lib/plurimath/math/function/binary_function.rb +2 -8
- data/lib/plurimath/math/function/ceil.rb +24 -9
- data/lib/plurimath/math/function/ddot.rb +6 -1
- data/lib/plurimath/math/function/deg.rb +4 -1
- data/lib/plurimath/math/function/det.rb +4 -1
- data/lib/plurimath/math/function/dim.rb +4 -1
- data/lib/plurimath/math/function/dot.rb +5 -0
- data/lib/plurimath/math/function/exp.rb +4 -1
- data/lib/plurimath/math/function/fenced.rb +25 -16
- data/lib/plurimath/math/function/floor.rb +23 -13
- data/lib/plurimath/math/function/font_style.rb +18 -8
- data/lib/plurimath/math/function/frac.rb +32 -18
- data/lib/plurimath/math/function/gcd.rb +4 -1
- data/lib/plurimath/math/function/glb.rb +8 -1
- data/lib/plurimath/math/function/hat.rb +16 -5
- data/lib/plurimath/math/function/hom.rb +4 -1
- data/lib/plurimath/math/function/inf.rb +16 -0
- data/lib/plurimath/math/function/int.rb +28 -9
- data/lib/plurimath/math/function/ker.rb +4 -1
- data/lib/plurimath/math/function/lcm.rb +17 -1
- data/lib/plurimath/math/function/left.rb +1 -1
- data/lib/plurimath/math/function/lg.rb +4 -1
- data/lib/plurimath/math/function/lim.rb +10 -0
- data/lib/plurimath/math/function/liminf.rb +4 -1
- data/lib/plurimath/math/function/limits.rb +22 -9
- data/lib/plurimath/math/function/limsup.rb +4 -1
- data/lib/plurimath/math/function/linebreak.rb +95 -0
- data/lib/plurimath/math/function/ln.rb +4 -1
- data/lib/plurimath/math/function/log.rb +21 -12
- data/lib/plurimath/math/function/longdiv.rb +19 -0
- data/lib/plurimath/math/function/lub.rb +4 -1
- data/lib/plurimath/math/function/max.rb +4 -1
- data/lib/plurimath/math/function/mbox.rb +8 -7
- data/lib/plurimath/math/function/merror.rb +12 -3
- data/lib/plurimath/math/function/min.rb +4 -1
- data/lib/plurimath/math/function/mod.rb +42 -15
- data/lib/plurimath/math/function/msgroup.rb +4 -0
- data/lib/plurimath/math/function/msline.rb +10 -0
- data/lib/plurimath/math/function/multiscript.rb +20 -0
- data/lib/plurimath/math/function/nary.rb +39 -5
- data/lib/plurimath/math/function/norm.rb +24 -15
- data/lib/plurimath/math/function/obrace.rb +5 -0
- data/lib/plurimath/math/function/oint.rb +42 -20
- data/lib/plurimath/math/function/over.rb +23 -10
- data/lib/plurimath/math/function/overset.rb +13 -10
- data/lib/plurimath/math/function/phantom.rb +24 -6
- data/lib/plurimath/math/function/power.rb +13 -4
- data/lib/plurimath/math/function/power_base.rb +28 -6
- data/lib/plurimath/math/function/prod.rb +33 -14
- data/lib/plurimath/math/function/right.rb +1 -1
- data/lib/plurimath/math/function/rule.rb +1 -1
- data/lib/plurimath/math/function/scarries.rb +14 -0
- data/lib/plurimath/math/function/semantics.rb +9 -0
- data/lib/plurimath/math/function/sqrt.rb +5 -0
- data/lib/plurimath/math/function/stackrel.rb +8 -0
- data/lib/plurimath/math/function/substack.rb +12 -51
- data/lib/plurimath/math/function/sum.rb +43 -20
- data/lib/plurimath/math/function/sup.rb +11 -2
- data/lib/plurimath/math/function/table/array.rb +1 -1
- data/lib/plurimath/math/function/table/matrix.rb +4 -0
- data/lib/plurimath/math/function/table.rb +10 -2
- data/lib/plurimath/math/function/td.rb +14 -4
- data/lib/plurimath/math/function/ternary_function.rb +8 -10
- data/lib/plurimath/math/function/text.rb +1 -1
- data/lib/plurimath/math/function/tilde.rb +5 -0
- data/lib/plurimath/math/function/tr.rb +1 -1
- data/lib/plurimath/math/function/ubrace.rb +5 -0
- data/lib/plurimath/math/function/unary_function.rb +72 -26
- data/lib/plurimath/math/function/underover.rb +25 -8
- data/lib/plurimath/math/function/underset.rb +19 -9
- data/lib/plurimath/math/function/vec.rb +5 -0
- data/lib/plurimath/math/number.rb +3 -3
- data/lib/plurimath/math/symbol.rb +13 -5
- data/lib/plurimath/mathml/parser.rb +2 -0
- data/lib/plurimath/mathml/transform.rb +23 -15
- data/lib/plurimath/omml/transform.rb +22 -10
- data/lib/plurimath/unitsml.rb +2 -1
- data/lib/plurimath/utility.rb +29 -28
- data/lib/plurimath/version.rb +1 -1
- metadata +3 -3
- data/lib/plurimath/math/function/scarry.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f58b20082cd94488f247f22399522d777ea751a4eba4f21e45a7a792fc6d30f3
|
4
|
+
data.tar.gz: f6e55fa7493ac10ac6e8ded470ea547640b3b5b53f00ac36c8cf941d56d5cc87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 133860ffcca6250cb3bef1e9eb186536685b3697a7d26bcda1d287170d74b9ac98083d352143cc6a9fc3649832229c0e1c3c1963c3e787db4d8b6f992b3f5802
|
7
|
+
data.tar.gz: 3a2044197aa65f0820961c14a602ca6df69c316e48203b2d448263032837336053715d95c52290b5241486426d000588d632cd820563ddf6466b0f4ab5d46569
|
data/Gemfile
CHANGED
@@ -69,7 +69,8 @@ module Plurimath
|
|
69
69
|
end
|
70
70
|
|
71
71
|
rule(:quoted_text) do
|
72
|
-
(str('"') >> match("[^\"]").repeat.as(:
|
72
|
+
(str('"') >> str("unitsml(") >> match("[^\)\"]").repeat.as(:unitsml) >> str(')"')) |
|
73
|
+
(str('"') >> match("[^\"]").repeat.as(:text) >> str('"')) |
|
73
74
|
(str('"') >> str("").as(:text))
|
74
75
|
end
|
75
76
|
|
@@ -188,7 +189,7 @@ module Plurimath
|
|
188
189
|
def dynamic_parser_rules(expr)
|
189
190
|
first_value = str(expr.first.to_s)
|
190
191
|
case expr.last
|
191
|
-
when :symbol then first_value.as(:symbol)
|
192
|
+
when :symbol then (str("\\").as(:slash) >> match("\s").repeat >> str("\n")) | first_value.as(:symbol)
|
192
193
|
when :unary_class then (first_value.as(:unary_class) >> space? >> sequence.maybe).as(:unary)
|
193
194
|
when :fonts then first_value.as(:fonts_class) >> space? >> sequence.as(:fonts_value)
|
194
195
|
when :special_fonts then first_value.as(:bold_fonts)
|
@@ -8,6 +8,7 @@ module Plurimath
|
|
8
8
|
rule(unary: simple(:unary)) { unary }
|
9
9
|
rule(table: simple(:table)) { table }
|
10
10
|
rule(comma: simple(:comma)) { Utility.symbol_object(comma) }
|
11
|
+
rule(slash: simple(:slash)) { Math::Function::Linebreak.new }
|
11
12
|
rule(unary: sequence(:unary)) { Utility.filter_values(unary) }
|
12
13
|
rule(rparen: simple(:rparen)) { Utility.symbol_object(rparen) }
|
13
14
|
rule(number: simple(:number)) { Math::Number.new(number) }
|
@@ -27,6 +28,12 @@ module Plurimath
|
|
27
28
|
rule(power_value: sequence(:power_value)) { power_value }
|
28
29
|
rule(mod: simple(:mod), expr: simple(:expr)) { [mod, expr] }
|
29
30
|
|
31
|
+
rule(unitsml: simple(:unitsml)) do
|
32
|
+
Utility.filter_values(
|
33
|
+
Unitsml.new(unitsml.to_s).to_formula.value,
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
30
37
|
rule(bold_fonts: simple(:font)) do
|
31
38
|
Math::Function::FontStyle::DoubleStruck.new(
|
32
39
|
Utility.symbol_object(font.to_s[0]),
|
@@ -303,11 +310,15 @@ module Plurimath
|
|
303
310
|
end
|
304
311
|
|
305
312
|
rule(td: simple(:td)) do
|
306
|
-
Math::Function::
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
313
|
+
if td.is_a?(Math::Formula) && td.value.any?(Math::Function::Table)
|
314
|
+
Utility.td_values(td.value, ",")
|
315
|
+
else
|
316
|
+
Math::Function::Td.new(
|
317
|
+
[
|
318
|
+
Utility.td_value(td),
|
319
|
+
],
|
320
|
+
)
|
321
|
+
end
|
311
322
|
end
|
312
323
|
|
313
324
|
rule(td: sequence(:td)) do
|
@@ -631,6 +642,13 @@ module Plurimath
|
|
631
642
|
new_arr
|
632
643
|
end
|
633
644
|
|
645
|
+
rule(sequence: sequence(:sequence),
|
646
|
+
left_right: simple(:left_right)) do
|
647
|
+
new_arr = sequence.flatten.compact
|
648
|
+
new_arr << left_right unless left_right.to_s.strip.empty?
|
649
|
+
new_arr
|
650
|
+
end
|
651
|
+
|
634
652
|
rule(sequence: sequence(:sequence),
|
635
653
|
expr: sequence(:expr)) do
|
636
654
|
sequence.flatten.compact + expr.flatten.compact
|
@@ -860,6 +878,15 @@ module Plurimath
|
|
860
878
|
)
|
861
879
|
end
|
862
880
|
|
881
|
+
rule(unary_class: simple(:function),
|
882
|
+
unitsml: simple(:unitsml)) do
|
883
|
+
Utility.get_class(function).new(
|
884
|
+
Utility.filter_values(
|
885
|
+
Unitsml.new(unitsml.to_s).to_formula.value,
|
886
|
+
),
|
887
|
+
)
|
888
|
+
end
|
889
|
+
|
863
890
|
rule(number: simple(:number),
|
864
891
|
comma: simple(:comma)) do
|
865
892
|
[
|
@@ -2856,6 +2856,7 @@ module Plurimath
|
|
2856
2856
|
overline: :unary,
|
2857
2857
|
underset: :binary,
|
2858
2858
|
overset: :binary,
|
2859
|
+
phantom: :unary,
|
2859
2860
|
ddagger: :symbols,
|
2860
2861
|
trprime: :symbols,
|
2861
2862
|
closure: :symbols,
|
@@ -3562,7 +3563,7 @@ module Plurimath
|
|
3562
3563
|
tanh: :unary,
|
3563
3564
|
cosh: :unary,
|
3564
3565
|
ddot: :unary,
|
3565
|
-
mbox: :
|
3566
|
+
mbox: :text,
|
3566
3567
|
text: :text,
|
3567
3568
|
'"': :symbols,
|
3568
3569
|
sum: :ternary,
|
@@ -14,7 +14,7 @@ module Plurimath
|
|
14
14
|
rule(lparen: simple(:lparen)) { Math::Symbol.new(lparen) }
|
15
15
|
rule(rparen: simple(:rparen)) { Math::Symbol.new(rparen) }
|
16
16
|
rule(limits: simple(:limits)) { limits }
|
17
|
-
rule("\\\\" => simple(:slash)) { Math::
|
17
|
+
rule("\\\\" => simple(:slash)) { Math::Function::Linebreak.new }
|
18
18
|
rule(expression: simple(:expr)) { expr }
|
19
19
|
rule(environment: simple(:env)) { env }
|
20
20
|
rule(ternary: simple(:ternary)) { Utility.get_class(ternary).new }
|
@@ -488,19 +488,19 @@ module Plurimath
|
|
488
488
|
|
489
489
|
rule(text: simple(:text),
|
490
490
|
first_value: simple(:first_value)) do
|
491
|
-
|
491
|
+
Utility.get_class(text).new(first_value)
|
492
492
|
end
|
493
493
|
|
494
494
|
rule(text: simple(:text),
|
495
495
|
first_value: sequence(:first_value)) do
|
496
|
-
|
496
|
+
Utility.get_class(text).new(first_value.join)
|
497
497
|
end
|
498
498
|
|
499
499
|
rule(text: simple(:text),
|
500
500
|
first_value: simple(:first_value),
|
501
501
|
supscript: simple(:supscript),) do
|
502
502
|
Math::Function::Power.new(
|
503
|
-
|
503
|
+
Utility.get_class(text).new(first_value),
|
504
504
|
supscript,
|
505
505
|
)
|
506
506
|
end
|
@@ -509,7 +509,7 @@ module Plurimath
|
|
509
509
|
first_value: sequence(:first_value),
|
510
510
|
supscript: simple(:supscript),) do
|
511
511
|
Math::Function::Power.new(
|
512
|
-
|
512
|
+
Utility.get_class(text).new(first_value.join),
|
513
513
|
supscript,
|
514
514
|
)
|
515
515
|
end
|
@@ -518,7 +518,7 @@ module Plurimath
|
|
518
518
|
first_value: sequence(:first_value),
|
519
519
|
subscript: simple(:subscript)) do
|
520
520
|
Math::Function::Base.new(
|
521
|
-
|
521
|
+
Utility.get_class(text).new(first_value.join),
|
522
522
|
subscript,
|
523
523
|
)
|
524
524
|
end
|
@@ -527,7 +527,7 @@ module Plurimath
|
|
527
527
|
first_value: simple(:first_value),
|
528
528
|
subscript: simple(:subscript)) do
|
529
529
|
Math::Function::Base.new(
|
530
|
-
|
530
|
+
Utility.get_class(text).new(first_value),
|
531
531
|
subscript,
|
532
532
|
)
|
533
533
|
end
|
@@ -537,7 +537,7 @@ module Plurimath
|
|
537
537
|
subscript: simple(:subscript),
|
538
538
|
supscript: simple(:supscript)) do
|
539
539
|
Math::Function::PowerBase.new(
|
540
|
-
|
540
|
+
Utility.get_class(text).new(first_value),
|
541
541
|
subscript,
|
542
542
|
supscript,
|
543
543
|
)
|
@@ -948,12 +948,8 @@ module Plurimath
|
|
948
948
|
|
949
949
|
rule(substack: simple(:substack),
|
950
950
|
expression: sequence(:value)) do
|
951
|
-
tds = Utility.td_values(value, "\\\\")
|
952
|
-
|
953
|
-
substack_values = tds.map { |td| Math::Function::Tr.new([td]) }
|
954
951
|
Math::Function::Substack.new(
|
955
|
-
|
956
|
-
substack_values.shift,
|
952
|
+
Utility.organize_table(value),
|
957
953
|
)
|
958
954
|
end
|
959
955
|
end
|
data/lib/plurimath/math/core.rb
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
module Plurimath
|
4
4
|
module Math
|
5
5
|
class Core
|
6
|
+
REPLACABLES = {
|
7
|
+
/&/ => "&",
|
8
|
+
/^\n/ => "",
|
9
|
+
}
|
10
|
+
|
6
11
|
def class_name
|
7
12
|
self.class.name.split("::").last.downcase
|
8
13
|
end
|
@@ -24,18 +29,18 @@ module Plurimath
|
|
24
29
|
end
|
25
30
|
|
26
31
|
def empty_tag(wrapper_tag)
|
27
|
-
r_tag =
|
28
|
-
r_tag << (
|
32
|
+
r_tag = ox_element("r", namespace: "m")
|
33
|
+
r_tag << (ox_element("t", namespace: "m") << "​")
|
29
34
|
wrapper_tag << r_tag
|
30
35
|
end
|
31
36
|
|
32
|
-
def omml_parameter(field, display_style, tag_name
|
33
|
-
tag =
|
37
|
+
def omml_parameter(field, display_style, tag_name:, namespace: "m")
|
38
|
+
tag = ox_element(tag_name, namespace: namespace)
|
34
39
|
return empty_tag(tag) unless field
|
35
40
|
|
36
41
|
Utility.update_nodes(
|
37
42
|
tag,
|
38
|
-
field
|
43
|
+
field.insert_t_tag(display_style),
|
39
44
|
)
|
40
45
|
end
|
41
46
|
|
@@ -44,12 +49,13 @@ module Plurimath
|
|
44
49
|
end
|
45
50
|
|
46
51
|
def r_element(string, rpr_tag: true)
|
47
|
-
r_tag =
|
52
|
+
r_tag = ox_element("r", namespace: "m")
|
48
53
|
if rpr_tag
|
49
|
-
|
50
|
-
|
54
|
+
attrs = { "m:val": "p" }
|
55
|
+
sty_tag = ox_element("sty", namespace: "m", attributes: attrs)
|
56
|
+
r_tag << (ox_element("rPr", namespace: "m") << sty_tag)
|
51
57
|
end
|
52
|
-
r_tag << (
|
58
|
+
r_tag << (ox_element("t", namespace: "m") << string)
|
53
59
|
Array(r_tag)
|
54
60
|
end
|
55
61
|
|
@@ -57,7 +63,7 @@ module Plurimath
|
|
57
63
|
false
|
58
64
|
end
|
59
65
|
|
60
|
-
def
|
66
|
+
def extract_class_name_from_text
|
61
67
|
""
|
62
68
|
end
|
63
69
|
|
@@ -107,16 +113,13 @@ module Plurimath
|
|
107
113
|
end
|
108
114
|
|
109
115
|
def dump_mathml(field)
|
110
|
-
|
111
|
-
mathml.gsub(/\n\s*/, "").gsub("&", "&")
|
116
|
+
dump_ox_nodes(field.to_mathml_without_math_tag).gsub(/\n\s*/, "")
|
112
117
|
end
|
113
118
|
|
114
119
|
def dump_omml(field, display_style)
|
115
120
|
return if field.nil?
|
116
121
|
|
117
|
-
|
118
|
-
omml_string = omml.is_a?(Array) ? omml.flatten.map { |obj| dump_ox_nodes(obj) }.join : dump_ox_nodes(omml)
|
119
|
-
omml_string.gsub(/\n\s*/, "").gsub("&", "&")
|
122
|
+
dump_ox_nodes(field.omml_nodes(display_style)).gsub(/\n\s*/, "")
|
120
123
|
end
|
121
124
|
|
122
125
|
def omml_nodes(display_style)
|
@@ -124,16 +127,16 @@ module Plurimath
|
|
124
127
|
end
|
125
128
|
|
126
129
|
def validate_mathml_fields(field)
|
127
|
-
field.nil? ?
|
130
|
+
field.nil? ? ox_element("mi") : field.to_mathml_without_math_tag
|
128
131
|
end
|
129
132
|
|
130
133
|
def common_math_zone_conversion(field, options = {})
|
131
134
|
{
|
132
135
|
spacing: options[:spacing],
|
133
136
|
last: options[:last] || true,
|
134
|
-
indent: !field
|
137
|
+
indent: !field.is_a?(Formula),
|
135
138
|
function_spacing: "#{options[:spacing]}#{options[:additional_space]}",
|
136
|
-
field_name: options[:field_name] ?
|
139
|
+
field_name: (options[:field_name] ? " #{options[:field_name]}" : ""),
|
137
140
|
}
|
138
141
|
end
|
139
142
|
|
@@ -142,16 +145,127 @@ module Plurimath
|
|
142
145
|
end
|
143
146
|
|
144
147
|
def dump_ox_nodes(nodes)
|
145
|
-
|
148
|
+
return dump_nodes(nodes) unless nodes.is_a?(Array)
|
149
|
+
|
150
|
+
nodes.flatten.map { |node| dump_nodes(node) }.join
|
151
|
+
end
|
152
|
+
|
153
|
+
def dump_nodes(nodes, indent: nil)
|
154
|
+
replacable_values(
|
155
|
+
Plurimath.xml_engine.dump(nodes, indent: indent),
|
156
|
+
)
|
157
|
+
end
|
158
|
+
|
159
|
+
def replacable_values(string)
|
160
|
+
REPLACABLES.each { |regex, str| string.gsub!(regex, str) }
|
161
|
+
string
|
146
162
|
end
|
147
163
|
|
148
164
|
def gsub_spacing(spacing, last)
|
149
|
-
spacing.gsub(
|
165
|
+
spacing.gsub(/\|_/, last ? " " : "| ")
|
150
166
|
end
|
151
167
|
|
152
168
|
def invert_unicode_symbols
|
153
169
|
Mathml::Constants::UNICODE_SYMBOLS.invert[class_name] || class_name
|
154
170
|
end
|
171
|
+
|
172
|
+
def separate_table
|
173
|
+
false
|
174
|
+
end
|
175
|
+
|
176
|
+
def linebreak
|
177
|
+
false
|
178
|
+
end
|
179
|
+
|
180
|
+
def cloned_objects
|
181
|
+
object = self.class.new rescue self.class.new(nil)
|
182
|
+
variables.each { |var| object.set(var, variable_value(get(var))) }
|
183
|
+
object
|
184
|
+
end
|
185
|
+
|
186
|
+
def variable_value(value)
|
187
|
+
case value
|
188
|
+
when Core
|
189
|
+
value.cloned_objects
|
190
|
+
when Array
|
191
|
+
value.map { |object| variable_value(object) }
|
192
|
+
else
|
193
|
+
value
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def line_breaking(obj)
|
198
|
+
variables.each do |variable|
|
199
|
+
field = get(variable)
|
200
|
+
case field
|
201
|
+
when Core
|
202
|
+
field.line_breaking(obj)
|
203
|
+
updated_object_values(variable, obj: obj, update_value: true) if obj.value_exist?
|
204
|
+
when Array
|
205
|
+
if result(field).length > 1
|
206
|
+
updated_object_values(variable, obj: obj)
|
207
|
+
else
|
208
|
+
field.each { |object| object.line_breaking(obj) }
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def updated_object_values(param, obj:, update_value: false)
|
215
|
+
object = self.class.new(nil)
|
216
|
+
found = false
|
217
|
+
variables.each do |variable|
|
218
|
+
value = if param == variable
|
219
|
+
found = true
|
220
|
+
if update_value
|
221
|
+
return_value = obj.value
|
222
|
+
obj.value = []
|
223
|
+
return_value
|
224
|
+
else
|
225
|
+
formula = Formula.new(get(variable))
|
226
|
+
formula.line_breaking(obj)
|
227
|
+
set(variable, obj)
|
228
|
+
get(variable)
|
229
|
+
end
|
230
|
+
else
|
231
|
+
return_value = get(variable)
|
232
|
+
set(variable, nil) if found
|
233
|
+
return_value
|
234
|
+
end
|
235
|
+
object.set(variable, Utility.filter_values(value))
|
236
|
+
end
|
237
|
+
object.hide_function_name = true if object.methods.include?(:hide_function_name)
|
238
|
+
obj.update(object)
|
239
|
+
end
|
240
|
+
|
241
|
+
def get(variable)
|
242
|
+
instance_variable_get(variable)
|
243
|
+
end
|
244
|
+
|
245
|
+
def set(variable, value)
|
246
|
+
instance_variable_set(variable, value)
|
247
|
+
end
|
248
|
+
|
249
|
+
def variables
|
250
|
+
instance_variables
|
251
|
+
end
|
252
|
+
|
253
|
+
def ox_element(node, attributes: [], namespace: "")
|
254
|
+
Utility.ox_element(
|
255
|
+
node,
|
256
|
+
attributes: attributes,
|
257
|
+
namespace: namespace,
|
258
|
+
)
|
259
|
+
end
|
260
|
+
|
261
|
+
def result(value = [])
|
262
|
+
value = get("@value") || value
|
263
|
+
value.slice_after { |d| d.is_a?(Math::Function::Linebreak) }.to_a
|
264
|
+
end
|
265
|
+
|
266
|
+
def is_unary?
|
267
|
+
is_a?(Math::Function::UnaryFunction)
|
268
|
+
end
|
155
269
|
end
|
156
270
|
end
|
157
271
|
end
|
@@ -4,6 +4,7 @@ module Plurimath
|
|
4
4
|
module Math
|
5
5
|
class Formula < Core
|
6
6
|
attr_accessor :value, :left_right_wrapper, :displaystyle, :input_string
|
7
|
+
|
7
8
|
MATH_ZONE_TYPES = %i[
|
8
9
|
omml
|
9
10
|
latex
|
@@ -36,21 +37,29 @@ module Plurimath
|
|
36
37
|
parse_error!(:asciimath)
|
37
38
|
end
|
38
39
|
|
39
|
-
def to_mathml(display_style: displaystyle)
|
40
|
+
def to_mathml(display_style: displaystyle, split_on_linebreak: false)
|
41
|
+
return line_breaked_mathml(display_style) if split_on_linebreak
|
42
|
+
|
40
43
|
math_attrs = {
|
41
44
|
xmlns: "http://www.w3.org/1998/Math/MathML",
|
42
45
|
display: "block",
|
43
46
|
}
|
44
47
|
style_attrs = { displaystyle: boolean_display_style(display_style) }
|
45
|
-
math =
|
46
|
-
style =
|
48
|
+
math = ox_element("math", attributes: math_attrs)
|
49
|
+
style = ox_element("mstyle", attributes: style_attrs)
|
47
50
|
Utility.update_nodes(style, mathml_content)
|
48
51
|
Utility.update_nodes(math, [style])
|
49
|
-
|
52
|
+
dump_nodes(math, indent: 2)
|
50
53
|
rescue
|
51
54
|
parse_error!(:mathml)
|
52
55
|
end
|
53
56
|
|
57
|
+
def line_breaked_mathml(display_style)
|
58
|
+
new_line_support.map do |formula|
|
59
|
+
formula.to_mathml(display_style: display_style)
|
60
|
+
end.join
|
61
|
+
end
|
62
|
+
|
54
63
|
def to_mathml_without_math_tag
|
55
64
|
return mathml_content unless left_right_wrapper
|
56
65
|
|
@@ -76,7 +85,7 @@ module Plurimath
|
|
76
85
|
parse_error!(:html)
|
77
86
|
end
|
78
87
|
|
79
|
-
def
|
88
|
+
def omml_attrs
|
80
89
|
{
|
81
90
|
"xmlns:m": "http://schemas.openxmlformats.org/officeDocument/2006/math",
|
82
91
|
"xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
@@ -99,16 +108,20 @@ module Plurimath
|
|
99
108
|
}
|
100
109
|
end
|
101
110
|
|
102
|
-
def to_omml(display_style: displaystyle)
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
111
|
+
def to_omml(display_style: displaystyle, split_on_linebreak: false)
|
112
|
+
objects = split_on_linebreak ? new_line_support : [self]
|
113
|
+
|
114
|
+
para_element = Utility.ox_element("oMathPara", attributes: omml_attrs, namespace: "m")
|
115
|
+
objects.each.with_index(1) do |object, index|
|
116
|
+
para_element << Utility.update_nodes(
|
117
|
+
Utility.ox_element("oMath", namespace: "m"),
|
118
|
+
object.omml_content(boolean_display_style(display_style)),
|
119
|
+
)
|
120
|
+
next if objects.length == index
|
121
|
+
|
122
|
+
para_element << omml_br_tag
|
123
|
+
end
|
124
|
+
dump_nodes(para_element, indent: 2)
|
112
125
|
rescue
|
113
126
|
parse_error!(:omml)
|
114
127
|
end
|
@@ -168,8 +181,8 @@ module Plurimath
|
|
168
181
|
end
|
169
182
|
end
|
170
183
|
|
171
|
-
def
|
172
|
-
return
|
184
|
+
def extract_class_name_from_text
|
185
|
+
return unless value.length < 2 && value.first.is_a?(Function::Text)
|
173
186
|
|
174
187
|
value.first.parameter_one
|
175
188
|
end
|
@@ -182,10 +195,62 @@ module Plurimath
|
|
182
195
|
(value.none?(Function::Left) || value.none?(Function::Right))
|
183
196
|
end
|
184
197
|
|
198
|
+
def value_exist?
|
199
|
+
value && !value.empty?
|
200
|
+
end
|
201
|
+
|
202
|
+
def update(object)
|
203
|
+
self.value = Array(object)
|
204
|
+
end
|
205
|
+
|
206
|
+
def cloned_objects
|
207
|
+
cloned_obj = value.map(&:cloned_objects)
|
208
|
+
formula = self.class.new(cloned_obj)
|
209
|
+
formula.left_right_wrapper = @left_right_wrapper
|
210
|
+
formula
|
211
|
+
end
|
212
|
+
|
213
|
+
def new_line_support(array = [])
|
214
|
+
cloned = cloned_objects
|
215
|
+
obj = self.class.new
|
216
|
+
cloned.line_breaking(obj)
|
217
|
+
array << cloned
|
218
|
+
obj.value_exist? ? obj.new_line_support(array) : array
|
219
|
+
end
|
220
|
+
|
221
|
+
def line_breaking(obj)
|
222
|
+
if result.size > 1
|
223
|
+
breaked_result = result.first.last.omml_line_break(result)
|
224
|
+
update(Array(breaked_result.shift))
|
225
|
+
obj.update(breaked_result.flatten)
|
226
|
+
reprocess_value(obj)
|
227
|
+
return
|
228
|
+
end
|
229
|
+
|
230
|
+
value.each.with_index(1) do |object, index|
|
231
|
+
object.line_breaking(obj)
|
232
|
+
break obj.insert(value.slice!(index..value.size)) if obj.value_exist?
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def reprocess_value(obj)
|
237
|
+
new_obj = self.class.new([])
|
238
|
+
self.line_breaking(new_obj)
|
239
|
+
if new_obj.value_exist?
|
240
|
+
obj.value.insert(0, Function::Linebreak.new)
|
241
|
+
obj.value.insert(0, self.class.new(new_obj.value))
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def insert(values)
|
246
|
+
update(Array(value) + values)
|
247
|
+
end
|
248
|
+
|
249
|
+
|
185
250
|
protected
|
186
251
|
|
187
252
|
def boolean_display_style(display_style = displaystyle)
|
188
|
-
YAML.
|
253
|
+
YAML.safe_load(display_style.to_s)
|
189
254
|
end
|
190
255
|
|
191
256
|
def new_space(spacing, indent)
|
@@ -203,6 +268,11 @@ module Plurimath
|
|
203
268
|
def parse_error!(type)
|
204
269
|
Math.parse_error!(input_string, type)
|
205
270
|
end
|
271
|
+
|
272
|
+
def omml_br_tag
|
273
|
+
r_tag = ox_element("r", namespace: "m")
|
274
|
+
r_tag << ox_element("br")
|
275
|
+
end
|
206
276
|
end
|
207
277
|
end
|
208
278
|
end
|
@@ -6,32 +6,45 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Abs < UnaryFunction
|
9
|
+
attr_accessor :open_paren, :close_paren
|
10
|
+
|
9
11
|
def to_mathml_without_math_tag
|
10
12
|
symbol = Utility.ox_element("mo") << "|"
|
11
|
-
first_value = mathml_value
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
)
|
13
|
+
first_value = mathml_value
|
14
|
+
first_value = first_value&.insert(0, symbol) unless open_paren
|
15
|
+
first_value << symbol unless close_paren
|
16
|
+
Utility.update_nodes(ox_element("mrow"), first_value)
|
16
17
|
end
|
17
18
|
|
18
19
|
def to_omml_without_math_tag(display_style)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
Array(
|
21
|
+
md_tag << omml_parameter(parameter_one, display_style, tag_name: "e"),
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def line_breaking(obj)
|
26
|
+
parameter_one.line_breaking(obj)
|
27
|
+
if obj.value_exist?
|
28
|
+
ceil_object = self.class.new(Utility.filter_values(obj.value))
|
29
|
+
ceil_object.open_paren = true
|
30
|
+
ceil_object.close_paren = false
|
31
|
+
obj.update(ceil_object)
|
32
|
+
self.close_paren = true
|
33
|
+
self.open_paren = false unless open_paren
|
34
|
+
end
|
24
35
|
end
|
25
36
|
|
26
37
|
protected
|
27
38
|
|
28
|
-
def
|
39
|
+
def md_tag
|
29
40
|
attribute = { "m:val": "|" }
|
41
|
+
sepchr_attr = { "m:val": "" }
|
30
42
|
mdpr = Utility.pr_element("d", namespace: "m")
|
31
|
-
mdpr <<
|
32
|
-
mdpr <<
|
33
|
-
mdpr <<
|
34
|
-
mdpr <<
|
43
|
+
mdpr << ox_element("begChr", namespace: "m", attributes: attribute) unless open_paren
|
44
|
+
mdpr << ox_element("endChr", namespace: "m", attributes: attribute) unless close_paren
|
45
|
+
mdpr << ox_element("sepChr", namespace: "m", attributes: sepchr_attr)
|
46
|
+
mdpr << ox_element("grow", namespace: "m")
|
47
|
+
ox_element("d", namespace: "m") << mdpr
|
35
48
|
end
|
36
49
|
end
|
37
50
|
end
|