plurimath 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|