plurimath 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.rspec-opal +11 -0
- data/Gemfile +3 -0
- data/Rakefile +11 -0
- data/lib/plurimath/asciimath/transform.rb +15 -0
- data/lib/plurimath/latex/constants.rb +3 -0
- data/lib/plurimath/latex/parse.rb +20 -11
- data/lib/plurimath/latex/transform.rb +24 -2
- data/lib/plurimath/math/core.rb +88 -0
- data/lib/plurimath/math/formula.rb +68 -24
- data/lib/plurimath/math/function/base.rb +8 -2
- data/lib/plurimath/math/function/binary_function.rb +36 -4
- data/lib/plurimath/math/function/color.rb +14 -0
- data/lib/plurimath/math/function/fenced.rb +27 -0
- data/lib/plurimath/math/function/floor.rb +1 -1
- data/lib/plurimath/math/function/font_style.rb +45 -0
- data/lib/plurimath/math/function/frac.rb +6 -0
- data/lib/plurimath/math/function/int.rb +7 -0
- data/lib/plurimath/math/function/left.rb +19 -1
- data/lib/plurimath/math/function/lim.rb +6 -0
- data/lib/plurimath/math/function/limits.rb +7 -0
- data/lib/plurimath/math/function/log.rb +6 -0
- data/lib/plurimath/math/function/menclose.rb +6 -0
- data/lib/plurimath/math/function/mod.rb +6 -0
- data/lib/plurimath/math/function/msgroup.rb +28 -0
- data/lib/plurimath/math/function/multiscript.rb +7 -0
- data/lib/plurimath/math/function/nary.rb +94 -0
- data/lib/plurimath/math/function/oint.rb +6 -0
- data/lib/plurimath/math/function/over.rb +6 -0
- data/lib/plurimath/math/function/overset.rb +6 -0
- data/lib/plurimath/math/function/power.rb +8 -2
- data/lib/plurimath/math/function/power_base.rb +10 -31
- data/lib/plurimath/math/function/prod.rb +19 -18
- data/lib/plurimath/math/function/right.rb +19 -1
- data/lib/plurimath/math/function/root.rb +6 -0
- data/lib/plurimath/math/function/rule.rb +7 -0
- data/lib/plurimath/math/function/semantics.rb +6 -0
- data/lib/plurimath/math/function/stackrel.rb +6 -0
- data/lib/plurimath/math/function/substack.rb +6 -0
- data/lib/plurimath/math/function/sum.rb +26 -25
- data/lib/plurimath/math/function/table.rb +52 -24
- data/lib/plurimath/math/function/td.rb +28 -0
- data/lib/plurimath/math/function/ternary_function.rb +44 -4
- data/lib/plurimath/math/function/text.rb +24 -2
- data/lib/plurimath/math/function/tr.rb +28 -0
- data/lib/plurimath/math/function/unary_function.rb +43 -3
- data/lib/plurimath/math/function/underover.rb +7 -55
- data/lib/plurimath/math/function/underset.rb +6 -0
- data/lib/plurimath/math/function/vec.rb +40 -0
- data/lib/plurimath/math/function.rb +7 -5
- data/lib/plurimath/math/number.rb +9 -5
- data/lib/plurimath/math/symbol.rb +13 -9
- data/lib/plurimath/math.rb +1 -3
- data/lib/plurimath/mathml/parser.rb +4 -4
- data/lib/plurimath/mathml/transform.rb +3 -4
- data/lib/plurimath/omml/parser.rb +3 -3
- data/lib/plurimath/omml/transform.rb +12 -11
- data/lib/plurimath/setup/oga.rb +5 -0
- data/lib/plurimath/setup/opal.rb.erb +8 -0
- data/lib/plurimath/setup/ox.rb +5 -0
- data/lib/plurimath/utility.rb +48 -13
- data/lib/plurimath/version.rb +1 -1
- data/lib/plurimath/xml_engine/oga.rb +246 -0
- data/lib/plurimath/xml_engine/ox.rb +29 -0
- data/lib/plurimath/xml_engine.rb +6 -0
- data/lib/plurimath.rb +12 -2
- metadata +11 -2
@@ -52,13 +52,11 @@ module Plurimath
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def to_latex
|
55
|
-
if open_paren == "norm["
|
56
|
-
return "\\begin{Vmatrix}#{latex_content}\\end{Vmatrix}"
|
57
|
-
end
|
55
|
+
return "\\begin{Vmatrix}#{latex_content}\\end{Vmatrix}" if open_paren == "norm["
|
58
56
|
|
59
57
|
separator = "{#{table_attribute(:latex)}}" if environment&.include?("array")
|
60
|
-
left_paren = latex_parenthesis(open_paren)
|
61
|
-
right_paren = latex_parenthesis(close_paren)
|
58
|
+
left_paren = latex_parenthesis(open_paren)
|
59
|
+
right_paren = latex_parenthesis(close_paren)
|
62
60
|
left = "\\left #{left_paren}\\begin{matrix}"
|
63
61
|
right = "\\end{matrix}\\right #{right_paren}"
|
64
62
|
"#{left}#{separator}#{latex_content}#{right}"
|
@@ -70,11 +68,40 @@ module Plurimath
|
|
70
68
|
end
|
71
69
|
|
72
70
|
def to_omml_without_math_tag(display_style)
|
73
|
-
if value.map { |d| d.parameter_one.length == 1 }.all?
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
ox_table = if value.map { |d| d.parameter_one.length == 1 }.all?
|
72
|
+
single_td_table(display_style)
|
73
|
+
else
|
74
|
+
multiple_td_table(display_style)
|
75
|
+
end
|
76
|
+
fenced_table(ox_table)
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_asciimath_math_zone(spacing, last = false, indent = true)
|
80
|
+
[
|
81
|
+
"#{spacing}\"table\" function apply\n",
|
82
|
+
Formula.new(value).to_asciimath_math_zone(gsub_spacing(spacing, last), last, indent),
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_latex_math_zone(spacing, last = false, indent = true)
|
87
|
+
[
|
88
|
+
"#{spacing}\"table\" function apply\n",
|
89
|
+
Formula.new(value).to_latex_math_zone(gsub_spacing(spacing, last), last, indent),
|
90
|
+
]
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_mathml_math_zone(spacing, last = false, indent = true)
|
94
|
+
[
|
95
|
+
"#{spacing}\"table\" function apply\n",
|
96
|
+
Formula.new(value).to_mathml_math_zone(gsub_spacing(spacing, last), last, indent),
|
97
|
+
]
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_omml_math_zone(spacing, last = false, indent = true, display_style:)
|
101
|
+
[
|
102
|
+
"#{spacing}\"table\" function apply\n",
|
103
|
+
Formula.new(value).to_omml_math_zone(gsub_spacing(spacing, last), last, indent, display_style: display_style),
|
104
|
+
]
|
78
105
|
end
|
79
106
|
|
80
107
|
protected
|
@@ -90,6 +117,7 @@ module Plurimath
|
|
90
117
|
end
|
91
118
|
|
92
119
|
def latex_parenthesis(field)
|
120
|
+
return "." unless field
|
93
121
|
return " ." if field&.include?(":")
|
94
122
|
|
95
123
|
return "\\#{field}" if ["{", "}"].include?(field)
|
@@ -215,7 +243,7 @@ module Plurimath
|
|
215
243
|
end
|
216
244
|
|
217
245
|
def fenced_table(ox_table)
|
218
|
-
return ox_table unless open_paren
|
246
|
+
return ox_table unless open_paren || close_paren
|
219
247
|
|
220
248
|
d_node = Utility.ox_element("d", namespace: "m")
|
221
249
|
e_node = Utility.ox_element("e", namespace: "m")
|
@@ -225,22 +253,22 @@ module Plurimath
|
|
225
253
|
end
|
226
254
|
|
227
255
|
def mdpr_node
|
228
|
-
begchr = Utility.ox_element("begChr", namespace: "m")
|
229
|
-
begchr.attributes["m:val"] = paren(open_paren)
|
230
|
-
endchr = Utility.ox_element("endChr", namespace: "m")
|
231
|
-
endchr.attributes["m:val"] = paren(close_paren)
|
232
256
|
sepchr = Utility.ox_element("sepChr", attributes: { "m:val": "" }, namespace: "m")
|
233
257
|
mgrow = Utility.ox_element("grow", namespace: "m")
|
234
258
|
mdpr = Utility.ox_element("dPr", namespace: "m")
|
235
|
-
Utility.update_nodes(
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
259
|
+
Utility.update_nodes(mdpr, [begchr, endchr, sepchr, mgrow])
|
260
|
+
end
|
261
|
+
|
262
|
+
def begchr
|
263
|
+
return unless open_paren
|
264
|
+
|
265
|
+
Utility.ox_element("begChr", attributes: { "m:val": paren(open_paren) }, namespace: "m")
|
266
|
+
end
|
267
|
+
|
268
|
+
def endchr
|
269
|
+
return unless close_paren
|
270
|
+
|
271
|
+
Utility.ox_element("endChr", attributes: { "m:val": paren(close_paren) }, namespace: "m")
|
244
272
|
end
|
245
273
|
|
246
274
|
def paren(parenthesis)
|
@@ -42,6 +42,34 @@ module Plurimath
|
|
42
42
|
)
|
43
43
|
[me]
|
44
44
|
end
|
45
|
+
|
46
|
+
def to_asciimath_math_zone(spacing, last = false, _)
|
47
|
+
[
|
48
|
+
"#{spacing}\"td\" function apply\n",
|
49
|
+
Formula.new(parameter_one).to_asciimath_math_zone(gsub_spacing(spacing, last), last),
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_latex_math_zone(spacing, last = false, indent = true)
|
54
|
+
[
|
55
|
+
"#{spacing}\"td\" function apply\n",
|
56
|
+
Formula.new(parameter_one).to_latex_math_zone(gsub_spacing(spacing, last), last, indent),
|
57
|
+
]
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_mathml_math_zone(spacing, last = false, indent = true)
|
61
|
+
[
|
62
|
+
"#{spacing}\"td\" function apply\n",
|
63
|
+
Formula.new(parameter_one).to_mathml_math_zone(gsub_spacing(spacing, last), last, indent),
|
64
|
+
]
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_omml_math_zone(spacing, last = false, indent = true, display_style:)
|
68
|
+
[
|
69
|
+
"#{spacing}\"td\" function apply\n",
|
70
|
+
Formula.new(parameter_one).to_omml_math_zone(gsub_spacing(spacing, last), last, indent, display_style: display_style),
|
71
|
+
]
|
72
|
+
end
|
45
73
|
end
|
46
74
|
end
|
47
75
|
end
|
@@ -59,6 +59,50 @@ module Plurimath
|
|
59
59
|
!(parameter_one.nil? && parameter_two.nil? && parameter_three.nil?)
|
60
60
|
end
|
61
61
|
|
62
|
+
def to_asciimath_math_zone(spacing, last = false, _)
|
63
|
+
parameters = self.class::FUNCTION
|
64
|
+
new_spacing = gsub_spacing(spacing, last)
|
65
|
+
new_arr = ["#{spacing}\"#{to_asciimath}\" #{parameters[:name]}\n"]
|
66
|
+
ascii_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr })
|
67
|
+
ascii_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr })
|
68
|
+
ascii_fields_to_print(parameter_three, { spacing: new_spacing, field_name: parameters[:third_value], additional_space: " |_ ", array: new_arr })
|
69
|
+
new_arr
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_latex_math_zone(spacing, last = false, _)
|
73
|
+
parameters = self.class::FUNCTION
|
74
|
+
new_spacing = gsub_spacing(spacing, last)
|
75
|
+
new_arr = ["#{spacing}\"#{to_latex}\" #{parameters[:name]}\n"]
|
76
|
+
latex_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr })
|
77
|
+
latex_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr })
|
78
|
+
latex_fields_to_print(parameter_three, { spacing: new_spacing, field_name: parameters[:third_value], additional_space: " |_ ", array: new_arr })
|
79
|
+
new_arr
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_mathml_math_zone(spacing, last = false, _)
|
83
|
+
parameters = self.class::FUNCTION
|
84
|
+
new_spacing = gsub_spacing(spacing, last)
|
85
|
+
new_arr = ["#{spacing}\"#{dump_mathml(self)}\" #{parameters[:name]}\n"]
|
86
|
+
mathml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr })
|
87
|
+
mathml_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr })
|
88
|
+
mathml_fields_to_print(parameter_three, { spacing: new_spacing, field_name: parameters[:third_value], additional_space: " |_ ", array: new_arr })
|
89
|
+
new_arr
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_omml_math_zone(spacing, last = false, _, display_style:)
|
93
|
+
parameters = self.class::FUNCTION
|
94
|
+
new_spacing = gsub_spacing(spacing, last)
|
95
|
+
new_arr = ["#{spacing}\"#{dump_omml(self, display_style)}\" #{parameters[:name]}\n"]
|
96
|
+
omml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr, display_style: display_style })
|
97
|
+
omml_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr, display_style: display_style })
|
98
|
+
omml_fields_to_print(parameter_three, { spacing: new_spacing, field_name: parameters[:third_value], additional_space: " |_ ", array: new_arr, display_style: display_style })
|
99
|
+
new_arr
|
100
|
+
end
|
101
|
+
|
102
|
+
def any_value_exist?
|
103
|
+
!(parameter_one.nil? || parameter_two.nil? || parameter_three.nil?)
|
104
|
+
end
|
105
|
+
|
62
106
|
protected
|
63
107
|
|
64
108
|
def latex_wrapped(field)
|
@@ -69,10 +113,6 @@ module Plurimath
|
|
69
113
|
end
|
70
114
|
end
|
71
115
|
|
72
|
-
def invert_unicode_symbols
|
73
|
-
Mathml::Constants::UNICODE_SYMBOLS.invert[class_name] || class_name
|
74
|
-
end
|
75
|
-
|
76
116
|
def wrapped(field, type: "ascii")
|
77
117
|
return "" unless field
|
78
118
|
|
@@ -15,7 +15,9 @@ module Plurimath
|
|
15
15
|
|
16
16
|
def to_mathml_without_math_tag
|
17
17
|
text = Utility.ox_element("mtext")
|
18
|
-
text
|
18
|
+
return text unless parameter_one
|
19
|
+
|
20
|
+
text << (parse_text("mathml") || parameter_one)
|
19
21
|
end
|
20
22
|
|
21
23
|
def to_latex
|
@@ -43,6 +45,26 @@ module Plurimath
|
|
43
45
|
false
|
44
46
|
end
|
45
47
|
|
48
|
+
def to_asciimath_math_zone(spacing, _, _)
|
49
|
+
"#{spacing}#{to_asciimath} text\n"
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_latex_math_zone(spacing, _, _)
|
53
|
+
"#{spacing}#{to_asciimath} text\n"
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_mathml_math_zone(spacing, _, _)
|
57
|
+
"#{spacing}\"#{dump_mathml(self)}\" text\n"
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_omml_math_zone(spacing, _, _, display_style:)
|
61
|
+
"#{spacing}\"#{dump_omml(self, display_style)}\" text\n"
|
62
|
+
end
|
63
|
+
|
64
|
+
def value
|
65
|
+
parameter_one
|
66
|
+
end
|
67
|
+
|
46
68
|
protected
|
47
69
|
|
48
70
|
def symbol_value(unicode)
|
@@ -52,7 +74,7 @@ module Plurimath
|
|
52
74
|
|
53
75
|
def parse_text(lang)
|
54
76
|
html_value = first_value(lang).dup
|
55
|
-
html_value&.gsub
|
77
|
+
html_value = html_value&.gsub(PARSER_REGEX) do |_text|
|
56
78
|
last_match = Regexp.last_match
|
57
79
|
case lang
|
58
80
|
when "mathml", "html", "omml"
|
@@ -44,6 +44,34 @@ module Plurimath
|
|
44
44
|
[mr]
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
def to_asciimath_math_zone(spacing, last = false, indent = true)
|
49
|
+
[
|
50
|
+
"#{spacing}\"tr\" function apply\n",
|
51
|
+
Formula.new(parameter_one).to_asciimath_math_zone(gsub_spacing(spacing, last), last, indent),
|
52
|
+
]
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_latex_math_zone(spacing, last = false, indent = true)
|
56
|
+
[
|
57
|
+
"#{spacing}\"tr\" function apply\n",
|
58
|
+
Formula.new(parameter_one).to_latex_math_zone(gsub_spacing(spacing, last), last, indent),
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_mathml_math_zone(spacing, last = false, indent = true)
|
63
|
+
[
|
64
|
+
"#{spacing}\"tr\" function apply\n",
|
65
|
+
Formula.new(parameter_one).to_mathml_math_zone(gsub_spacing(spacing, last), last, indent),
|
66
|
+
]
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_omml_math_zone(spacing, last = false, indent = true, display_style:)
|
70
|
+
[
|
71
|
+
"#{spacing}\"tr\" function apply\n",
|
72
|
+
Formula.new(parameter_one).to_omml_math_zone(gsub_spacing(spacing, last), last, indent, display_style: display_style),
|
73
|
+
]
|
74
|
+
end
|
47
75
|
end
|
48
76
|
end
|
49
77
|
end
|
@@ -75,12 +75,48 @@ module Plurimath
|
|
75
75
|
[func]
|
76
76
|
end
|
77
77
|
|
78
|
-
|
78
|
+
def to_asciimath_math_zone(spacing, last = false, _)
|
79
|
+
new_spacing = gsub_spacing(spacing, last)
|
80
|
+
new_arr = [
|
81
|
+
"#{spacing}\"#{to_asciimath}\" function apply\n",
|
82
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
83
|
+
]
|
84
|
+
ascii_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "argument", additional_space: " |_ " , array: new_arr })
|
85
|
+
new_arr
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_latex_math_zone(spacing, last = false, _)
|
89
|
+
new_spacing = gsub_spacing(spacing, last)
|
90
|
+
new_arr = [
|
91
|
+
"#{spacing}\"#{to_latex}\" function apply\n",
|
92
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
93
|
+
]
|
94
|
+
latex_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "argument", additional_space: " |_ " , array: new_arr })
|
95
|
+
new_arr
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_mathml_math_zone(spacing, last = false, _)
|
99
|
+
new_spacing = gsub_spacing(spacing, last)
|
100
|
+
new_arr = [
|
101
|
+
"#{spacing}\"#{dump_mathml(self)}\" function apply\n",
|
102
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
103
|
+
]
|
104
|
+
mathml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "argument", additional_space: " |_ ", array: new_arr })
|
105
|
+
new_arr
|
106
|
+
end
|
79
107
|
|
80
|
-
def
|
81
|
-
|
108
|
+
def to_omml_math_zone(spacing, last = false, _, display_style:)
|
109
|
+
new_spacing = gsub_spacing(spacing, last)
|
110
|
+
new_arr = [
|
111
|
+
"#{spacing}\"#{dump_omml(self, display_style)}\" function apply\n",
|
112
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
113
|
+
]
|
114
|
+
omml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "argument", additional_space: " |_ ", array: new_arr, display_style: display_style })
|
115
|
+
new_arr
|
82
116
|
end
|
83
117
|
|
118
|
+
protected
|
119
|
+
|
84
120
|
def asciimath_value
|
85
121
|
return "" unless parameter_one
|
86
122
|
|
@@ -116,6 +152,10 @@ module Plurimath
|
|
116
152
|
|
117
153
|
Array(parameter_one&.insert_t_tag(display_style))
|
118
154
|
end
|
155
|
+
|
156
|
+
def latex_paren
|
157
|
+
Latex::Constants::LEFT_RIGHT_PARENTHESIS.invert[parameter_one] || '.'
|
158
|
+
end
|
119
159
|
end
|
120
160
|
end
|
121
161
|
end
|
@@ -6,6 +6,13 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Underover < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "UnderOver",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "Under",
|
13
|
+
third_value: "Over",
|
14
|
+
}.freeze
|
15
|
+
|
9
16
|
def to_asciimath
|
10
17
|
first_value = first_field_wrap(parameter_one) if parameter_one
|
11
18
|
second_value = "_#{wrapped(parameter_two)}" if parameter_two
|
@@ -43,61 +50,6 @@ module Plurimath
|
|
43
50
|
|
44
51
|
underover(display_style)
|
45
52
|
end
|
46
|
-
|
47
|
-
def omml_nary_tag(display_style)
|
48
|
-
pr = Utility.ox_element("naryPr", namespace: "m")
|
49
|
-
[
|
50
|
-
pr_element_value(pr),
|
51
|
-
omml_parameter(parameter_two, display_style, tag_name: "sub"),
|
52
|
-
omml_parameter(parameter_three, display_style, tag_name: "sup"),
|
53
|
-
]
|
54
|
-
end
|
55
|
-
|
56
|
-
protected
|
57
|
-
|
58
|
-
def hidden_sub_tag(pr_element)
|
59
|
-
return true unless parameter_two.nil?
|
60
|
-
|
61
|
-
pr_element << Utility.ox_element(
|
62
|
-
"subHide",
|
63
|
-
namespace: "m",
|
64
|
-
attributes: { "m:val": 1 },
|
65
|
-
)
|
66
|
-
end
|
67
|
-
|
68
|
-
def hidden_sup_tag(pr_element)
|
69
|
-
return true unless parameter_three.nil?
|
70
|
-
|
71
|
-
pr_element << Utility.ox_element(
|
72
|
-
"supHide",
|
73
|
-
namespace: "m",
|
74
|
-
attributes: { "m:val": 1 },
|
75
|
-
)
|
76
|
-
end
|
77
|
-
|
78
|
-
def pr_element_value(pr_element)
|
79
|
-
first_value(pr_element)
|
80
|
-
pr_element << Utility.ox_element(
|
81
|
-
"limLoc",
|
82
|
-
namespace: "m",
|
83
|
-
attributes: { "m:val": "undOvr" },
|
84
|
-
)
|
85
|
-
hidden_sub_tag(pr_element)
|
86
|
-
hidden_sup_tag(pr_element)
|
87
|
-
pr_element << Utility.pr_element("ctrl", true, namespace: "m")
|
88
|
-
end
|
89
|
-
|
90
|
-
def first_value(pr_element)
|
91
|
-
first_value = parameter_one.nary_attr_value
|
92
|
-
first_value = Utility.html_entity_to_unicode(first_value)
|
93
|
-
unless first_value == "∫"
|
94
|
-
pr_element << Utility.ox_element(
|
95
|
-
"chr",
|
96
|
-
namespace: "m",
|
97
|
-
attributes: { "m:val": first_value },
|
98
|
-
)
|
99
|
-
end
|
100
|
-
end
|
101
53
|
end
|
102
54
|
end
|
103
55
|
end
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Underset < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "underscript",
|
11
|
+
first_value: "underscript value",
|
12
|
+
second_value: "base expression",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_mathml_without_math_tag
|
10
16
|
first_value = parameter_one&.to_mathml_without_math_tag
|
11
17
|
second_value = parameter_two&.to_mathml_without_math_tag
|
@@ -37,6 +37,46 @@ module Plurimath
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
def to_asciimath_math_zone(spacing, last = false, _)
|
41
|
+
new_spacing = gsub_spacing(spacing, last)
|
42
|
+
new_arr = [
|
43
|
+
"#{spacing}\"#{to_asciimath}\" function apply\n",
|
44
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
45
|
+
]
|
46
|
+
ascii_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "supscript", additional_space: "| |_ " , array: new_arr })
|
47
|
+
new_arr
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_latex_math_zone(spacing, last = false, _)
|
51
|
+
new_spacing = gsub_spacing(spacing, last)
|
52
|
+
new_arr = [
|
53
|
+
"#{spacing}\"#{to_latex}\" function apply\n",
|
54
|
+
"#{new_spacing}|_ \"#{class_name}\" function name\n",
|
55
|
+
]
|
56
|
+
latex_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "supscript", additional_space: "| |_ " , array: new_arr })
|
57
|
+
new_arr
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_mathml_math_zone(spacing, last = false, _)
|
61
|
+
new_spacing = gsub_spacing(spacing, last)
|
62
|
+
new_arr = [
|
63
|
+
"#{spacing}\"#{dump_mathml(self)}\" overset\n",
|
64
|
+
"#{new_spacing}|_ \"<mo>→</mo>\" base\n",
|
65
|
+
]
|
66
|
+
mathml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "supscript", additional_space: "| |_ ", array: new_arr })
|
67
|
+
new_arr
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_omml_math_zone(spacing, last = false, _, display_style:)
|
71
|
+
new_spacing = gsub_spacing(spacing, last)
|
72
|
+
new_arr = [
|
73
|
+
"#{spacing}\"#{dump_omml(self, display_style)}\" overset\n",
|
74
|
+
"#{new_spacing}|_ \"<m:t>→</m:t>\" base\n",
|
75
|
+
]
|
76
|
+
omml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: "supscript", additional_space: "| |_ ", array: new_arr, display_style: display_style })
|
77
|
+
new_arr
|
78
|
+
end
|
79
|
+
|
40
80
|
protected
|
41
81
|
|
42
82
|
def acc_tag(display_style)
|
@@ -6,9 +6,11 @@ module Plurimath
|
|
6
6
|
end
|
7
7
|
|
8
8
|
# Include the first level files before the next
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
if RUBY_ENGINE != 'opal'
|
10
|
+
(
|
11
|
+
Dir.glob(File.join(__dir__, "function", "*.rb")) +
|
12
|
+
Dir.glob(File.join(__dir__, "function", "*", "*.rb"))
|
13
|
+
).each do |file|
|
14
|
+
require file
|
15
|
+
end
|
14
16
|
end
|
@@ -10,7 +10,7 @@ module Plurimath
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def ==(object)
|
13
|
-
object.value == value
|
13
|
+
object.respond_to?(:value) && object.value == value
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_asciimath
|
@@ -30,16 +30,20 @@ module Plurimath
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def to_omml_without_math_tag(_display_style)
|
33
|
-
[
|
33
|
+
[t_tag]
|
34
34
|
end
|
35
35
|
|
36
36
|
def insert_t_tag(_display_style)
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
[
|
38
|
+
(Utility.ox_element("r", namespace: "m") << t_tag),
|
39
|
+
]
|
40
40
|
end
|
41
41
|
|
42
42
|
def font_style_t_tag(_display_style)
|
43
|
+
t_tag
|
44
|
+
end
|
45
|
+
|
46
|
+
def t_tag
|
43
47
|
Utility.ox_element("t", namespace: "m") << value
|
44
48
|
end
|
45
49
|
|
@@ -10,7 +10,7 @@ module Plurimath
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def ==(object)
|
13
|
-
object.value == value
|
13
|
+
object.respond_to?(:value) && object.value == value
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_asciimath
|
@@ -29,11 +29,9 @@ module Plurimath
|
|
29
29
|
mi_tag = Utility.ox_element("mi")
|
30
30
|
return mi_tag if ["{:", ":}"].include?(value)
|
31
31
|
|
32
|
-
|
33
|
-
unicode = unicodes.invert[value]
|
32
|
+
unicode = Mathml::Constants::UNICODE_SYMBOLS.invert[value]
|
34
33
|
if operator?(unicode) || unicode || explicit_checks(unicode)
|
35
|
-
|
36
|
-
return Utility.ox_element("mo") << mo_value
|
34
|
+
return Utility.ox_element("mo") << (unicode || value).to_s
|
37
35
|
end
|
38
36
|
|
39
37
|
mi_tag << value
|
@@ -63,9 +61,7 @@ module Plurimath
|
|
63
61
|
end
|
64
62
|
|
65
63
|
def insert_t_tag(_display_style)
|
66
|
-
|
67
|
-
r_tag << (Utility.ox_element("t", namespace: "m") << value)
|
68
|
-
[r_tag]
|
64
|
+
[(Utility.ox_element("r", namespace: "m") << t_tag)]
|
69
65
|
end
|
70
66
|
|
71
67
|
def tag_name
|
@@ -81,7 +77,7 @@ module Plurimath
|
|
81
77
|
end
|
82
78
|
|
83
79
|
def font_style_t_tag(_display_style)
|
84
|
-
|
80
|
+
t_tag
|
85
81
|
end
|
86
82
|
|
87
83
|
def nary_attr_value
|
@@ -92,6 +88,14 @@ module Plurimath
|
|
92
88
|
false
|
93
89
|
end
|
94
90
|
|
91
|
+
def omml_nodes(display_style)
|
92
|
+
Array(t_tag)
|
93
|
+
end
|
94
|
+
|
95
|
+
def t_tag
|
96
|
+
Utility.ox_element("t", namespace: "m") << value
|
97
|
+
end
|
98
|
+
|
95
99
|
private
|
96
100
|
|
97
101
|
def operator?(unicode)
|
data/lib/plurimath/math.rb
CHANGED
@@ -19,9 +19,7 @@ require_relative "latex/parser"
|
|
19
19
|
require_relative "html/parser"
|
20
20
|
require_relative "omml/parser"
|
21
21
|
require_relative "utility"
|
22
|
-
require "ox"
|
23
22
|
require "yaml"
|
24
|
-
Ox.default_options = { encoding: "UTF-8" }
|
25
23
|
|
26
24
|
module Plurimath
|
27
25
|
module Math
|
@@ -72,7 +70,7 @@ module Plurimath
|
|
72
70
|
|
73
71
|
def type_error!
|
74
72
|
raise InvalidTypeError.new(
|
75
|
-
"`type` must be one of: `#{VALID_TYPES.keys.join('`, `')}`"
|
73
|
+
"`type` must be one of: `#{VALID_TYPES.keys.join('`, `')}`",
|
76
74
|
)
|
77
75
|
end
|
78
76
|
|
@@ -23,8 +23,8 @@ module Plurimath
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def parse
|
26
|
-
ox_nodes =
|
27
|
-
display_style = ox_nodes&.locate("
|
26
|
+
ox_nodes = Plurimath.xml_engine.load(text)
|
27
|
+
display_style = ox_nodes&.locate("mstyle/@displaystyle")&.first
|
28
28
|
nodes = parse_nodes(ox_nodes.nodes)
|
29
29
|
Math::Formula.new(
|
30
30
|
Transform.new.apply(nodes).flatten.compact,
|
@@ -34,7 +34,7 @@ module Plurimath
|
|
34
34
|
|
35
35
|
def parse_nodes(nodes)
|
36
36
|
nodes.map do |node|
|
37
|
-
next if
|
37
|
+
next if Plurimath.xml_engine.is_xml_comment?(node)
|
38
38
|
|
39
39
|
if node.is_a?(String)
|
40
40
|
node
|
@@ -47,7 +47,7 @@ module Plurimath
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def validate_attributes(attributes)
|
50
|
-
attributes&.select! { |key, _| SUPPORTED_ATTRS.include?(key
|
50
|
+
attributes&.select! { |key, _| SUPPORTED_ATTRS.include?(key.to_s) }
|
51
51
|
attributes&.transform_keys(&:to_sym) if attributes&.any?
|
52
52
|
end
|
53
53
|
|