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
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Frac < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "fraction",
|
11
|
+
first_value: "numerator",
|
12
|
+
second_value: "denominator",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = "(#{parameter_one&.to_asciimath})" if parameter_one
|
11
17
|
second_value = "(#{parameter_two&.to_asciimath})" if parameter_two
|
@@ -6,6 +6,13 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Int < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "integral",
|
11
|
+
first_value: "lower limit",
|
12
|
+
second_value: "upper limit",
|
13
|
+
third_value: "integrand"
|
14
|
+
}
|
15
|
+
|
9
16
|
def to_asciimath
|
10
17
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
18
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -30,13 +30,31 @@ module Plurimath
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def to_latex
|
33
|
-
"\\left #{
|
33
|
+
"\\left #{latex_paren}"
|
34
34
|
end
|
35
35
|
|
36
36
|
def validate_function_formula
|
37
37
|
false
|
38
38
|
end
|
39
39
|
|
40
|
+
def to_asciimath_math_zone(spacing = "", _, _)
|
41
|
+
"#{spacing}\"#{latex_paren}\" left\n"
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_latex_math_zone(spacing = "", _, _)
|
45
|
+
"#{spacing}\"#{latex_paren}\" left\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_mathml_math_zone(spacing = "", _, _)
|
49
|
+
mo_tag = (Utility.ox_element("mo") << left_paren)
|
50
|
+
"#{spacing}\"#{dump_ox_nodes(mo_tag).gsub(/\s+/, "")}\" left\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_omml_math_zone(spacing = "", _, _, display_style:)
|
54
|
+
t_tag = (Utility.ox_element("t", namespace: "m") << left_paren)
|
55
|
+
"#{spacing}\"#{dump_ox_nodes(t_tag).gsub(/\s+/, "")}\" left\n"
|
56
|
+
end
|
57
|
+
|
40
58
|
protected
|
41
59
|
|
42
60
|
def left_paren
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Lim < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "limit",
|
11
|
+
first_value: "limit subscript",
|
12
|
+
second_value: "limit supscript",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
17
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -6,6 +6,13 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Limits < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "function apply",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "subscript",
|
13
|
+
third_value: "supscript",
|
14
|
+
}.freeze
|
15
|
+
|
9
16
|
def to_mathml_without_math_tag
|
10
17
|
underover = Utility.ox_element("munderover")
|
11
18
|
value_array = []
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Log < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "function apply",
|
11
|
+
first_value: "subscript",
|
12
|
+
second_value: "supscript",
|
13
|
+
}
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
17
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Menclose < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "enclosure",
|
11
|
+
first_value: "enclosure type",
|
12
|
+
second_value: "expression",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
parameter_two&.to_asciimath
|
11
17
|
end
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Mod < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "mod",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "argument",
|
13
|
+
}
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = parameter_one&.to_asciimath
|
11
17
|
second_value = parameter_two&.to_asciimath
|
@@ -28,6 +28,34 @@ module Plurimath
|
|
28
28
|
def to_html
|
29
29
|
"<i>#{parameter_one.map(&:to_html).join}</i>"
|
30
30
|
end
|
31
|
+
|
32
|
+
def to_asciimath_math_zone(spacing, last = false, _indent = true)
|
33
|
+
[
|
34
|
+
"#{spacing}\"msgroup\" function apply\n",
|
35
|
+
Formula.new(parameter_one).to_asciimath_math_zone(gsub_spacing(spacing, last)),
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_latex_math_zone(spacing, last = false, indent = true)
|
40
|
+
[
|
41
|
+
"#{spacing}\"msgroup\" function apply\n",
|
42
|
+
Formula.new(parameter_one).to_latex_math_zone(gsub_spacing(spacing, last), last, indent),
|
43
|
+
]
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_mathml_math_zone(spacing, last = false, indent = true)
|
47
|
+
[
|
48
|
+
"#{spacing}\"msgroup\" function apply\n",
|
49
|
+
Formula.new(parameter_one).to_mathml_math_zone(gsub_spacing(spacing, last), last, indent),
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_omml_math_zone(spacing, last = false, indent = true, display_style:)
|
54
|
+
[
|
55
|
+
"#{spacing}\"msgroup\" function apply\n",
|
56
|
+
Formula.new(parameter_one).to_omml_math_zone(gsub_spacing(spacing, last), last, indent, display_style: display_style),
|
57
|
+
]
|
58
|
+
end
|
31
59
|
end
|
32
60
|
end
|
33
61
|
end
|
@@ -5,6 +5,13 @@ module Plurimath
|
|
5
5
|
module Math
|
6
6
|
module Function
|
7
7
|
class Multiscript < TernaryFunction
|
8
|
+
FUNCTION = {
|
9
|
+
name: "multiscript",
|
10
|
+
first_value: "base",
|
11
|
+
second_value: "subscript",
|
12
|
+
third_value: "supscript",
|
13
|
+
}.freeze
|
14
|
+
|
8
15
|
def to_omml_without_math_tag(display_style)
|
9
16
|
pre_element = Utility.ox_element("sPre", namespace: "m")
|
10
17
|
pr_element = Utility.ox_element("sPrePr", namespace: "m")
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Plurimath
|
4
|
+
module Math
|
5
|
+
module Function
|
6
|
+
class Nary < Core
|
7
|
+
attr_accessor :parameter_one, :parameter_two, :parameter_three, :parameter_four, :options
|
8
|
+
|
9
|
+
def initialize(parameter_one = nil,
|
10
|
+
parameter_two = nil,
|
11
|
+
parameter_three = nil,
|
12
|
+
parameter_four = nil,
|
13
|
+
options = {})
|
14
|
+
@parameter_one = parameter_one
|
15
|
+
@parameter_two = parameter_two
|
16
|
+
@parameter_three = parameter_three
|
17
|
+
@parameter_four = parameter_four
|
18
|
+
@options = options
|
19
|
+
Utility.validate_left_right([parameter_one, parameter_two, parameter_three, parameter_four])
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(object)
|
23
|
+
self.class == object.class &&
|
24
|
+
object.parameter_one == parameter_one &&
|
25
|
+
object.parameter_two == parameter_two &&
|
26
|
+
object.parameter_three == parameter_three &&
|
27
|
+
object.parameter_four == parameter_four &&
|
28
|
+
object.options == options
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_asciimath
|
32
|
+
first_value = parameter_one&.to_asciimath || "int"
|
33
|
+
second_value = "_#{parameter_two.to_asciimath}" if parameter_two
|
34
|
+
third_value = "^#{parameter_three.to_asciimath}" if parameter_three
|
35
|
+
fourth_value = " #{parameter_four.to_asciimath}" if parameter_four
|
36
|
+
"#{first_value}#{second_value}#{third_value}#{fourth_value}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_latex
|
40
|
+
first_value = parameter_one&.to_latex || "\\int"
|
41
|
+
second_value = "_#{parameter_two.to_latex}" if parameter_two
|
42
|
+
third_value = "^#{parameter_three.to_latex}" if parameter_three
|
43
|
+
fourth_value = "{#{parameter_four.to_latex}}" if parameter_four
|
44
|
+
"#{first_value}#{second_value}#{third_value}#{fourth_value}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_mathml_without_math_tag
|
48
|
+
tag_name = options[:type] == "undOvr" ? "munderover" : "msubsup"
|
49
|
+
subsup_tag = Utility.ox_element(tag_name)
|
50
|
+
new_arr = []
|
51
|
+
new_arr << validate_mathml_fields(parameter_one)
|
52
|
+
new_arr << validate_mathml_fields(parameter_two)
|
53
|
+
new_arr << validate_mathml_fields(parameter_three)
|
54
|
+
Utility.update_nodes(subsup_tag, new_arr)
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_omml_without_math_tag(display_style)
|
58
|
+
nary_element = Utility.ox_element("nary", namespace: "m")
|
59
|
+
Utility.update_nodes(nary_element, omml_nary_tag(display_style))
|
60
|
+
Array(nary_element)
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
def chr_value(narypr)
|
66
|
+
first_value = Utility.html_entity_to_unicode(parameter_one&.nary_attr_value)
|
67
|
+
narypr << Utility.ox_element("chr", namespace: "m", attributes: { "m:val": first_value }) unless first_value == "∫"
|
68
|
+
|
69
|
+
narypr << Utility.ox_element("limLoc", namespace: "m", attributes: { "m:val": options[:type].to_s })
|
70
|
+
hide_tags(narypr, parameter_two, "sub")
|
71
|
+
hide_tags(narypr, parameter_three, "sup")
|
72
|
+
narypr
|
73
|
+
end
|
74
|
+
|
75
|
+
def hide_tags(nar, field, tag_prefix)
|
76
|
+
return nar unless field.nil?
|
77
|
+
|
78
|
+
nar << Utility.ox_element("#{tag_prefix}Hide", namespace: "m", attributes: { "m:val": "1" })
|
79
|
+
end
|
80
|
+
|
81
|
+
def omml_nary_tag(display_style)
|
82
|
+
narypr = Utility.ox_element("naryPr", namespace: "m")
|
83
|
+
chr_value(narypr)
|
84
|
+
[
|
85
|
+
(narypr << Utility.pr_element("ctrl", true, namespace: "m")),
|
86
|
+
omml_parameter(parameter_two, display_style, tag_name: "sub"),
|
87
|
+
omml_parameter(parameter_three, display_style, tag_name: "sup"),
|
88
|
+
omml_parameter(parameter_four, display_style, tag_name: "e"),
|
89
|
+
]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Oint < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "contour integral",
|
11
|
+
first_value: "subscript",
|
12
|
+
second_value: "supscript",
|
13
|
+
}
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
17
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Over < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "over",
|
11
|
+
first_value: "numerator",
|
12
|
+
second_value: "denominator",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = wrapped(parameter_one)
|
11
17
|
second_value = wrapped(parameter_two)
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Overset < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "overset",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "supscript",
|
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
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Power < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "superscript",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "script",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
11
17
|
"#{parameter_one.to_asciimath}#{second_value}"
|
@@ -14,8 +20,8 @@ module Plurimath
|
|
14
20
|
def to_mathml_without_math_tag
|
15
21
|
tag_name = (["ubrace", "obrace"].include?(parameter_one&.class_name) ? "over" : "sup")
|
16
22
|
sup_tag = Utility.ox_element("m#{tag_name}")
|
17
|
-
mathml_value = [parameter_one
|
18
|
-
mathml_value << parameter_two
|
23
|
+
mathml_value = [validate_mathml_fields(parameter_one)]
|
24
|
+
mathml_value << validate_mathml_fields(parameter_two)
|
19
25
|
Utility.update_nodes(sup_tag, mathml_value)
|
20
26
|
end
|
21
27
|
|
@@ -6,12 +6,19 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class PowerBase < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "subsup",
|
11
|
+
first_value: "base",
|
12
|
+
second_value: "subscript",
|
13
|
+
third_value: "supscript",
|
14
|
+
}.freeze
|
15
|
+
|
9
16
|
def to_mathml_without_math_tag
|
10
17
|
subsup_tag = Utility.ox_element("m#{parameter_one.tag_name}")
|
11
18
|
new_arr = []
|
12
|
-
new_arr << parameter_one
|
13
|
-
new_arr << parameter_two
|
14
|
-
new_arr << parameter_three
|
19
|
+
new_arr << validate_mathml_fields(parameter_one)
|
20
|
+
new_arr << validate_mathml_fields(parameter_two)
|
21
|
+
new_arr << validate_mathml_fields(parameter_three)
|
15
22
|
Utility.update_nodes(subsup_tag, new_arr)
|
16
23
|
end
|
17
24
|
|
@@ -29,23 +36,6 @@ module Plurimath
|
|
29
36
|
"#{first_value}#{second_value}#{third_value}"
|
30
37
|
end
|
31
38
|
|
32
|
-
def omml_nary_tag(display_style)
|
33
|
-
narypr = Utility.ox_element("naryPr", namespace: "m")
|
34
|
-
chr_value(narypr)
|
35
|
-
narypr << Utility.ox_element(
|
36
|
-
"limLoc",
|
37
|
-
namespace: "m",
|
38
|
-
attributes: { "m:val": parameter_one.omml_tag_name },
|
39
|
-
)
|
40
|
-
hide_tags(narypr)
|
41
|
-
narypr << Utility.pr_element("ctrl", true, namespace: "m")
|
42
|
-
[
|
43
|
-
narypr,
|
44
|
-
omml_parameter(parameter_two, display_style, tag_name: "sub"),
|
45
|
-
omml_parameter(parameter_three, display_style, tag_name: "sup"),
|
46
|
-
]
|
47
|
-
end
|
48
|
-
|
49
39
|
def to_omml_without_math_tag(display_style)
|
50
40
|
return underover(display_style) if parameter_one.omml_tag_name == "undOvr"
|
51
41
|
|
@@ -68,17 +58,6 @@ module Plurimath
|
|
68
58
|
|
69
59
|
protected
|
70
60
|
|
71
|
-
def chr_value(narypr)
|
72
|
-
first_value = Utility.html_entity_to_unicode(parameter_one&.nary_attr_value)
|
73
|
-
return narypr if first_value == "∫"
|
74
|
-
|
75
|
-
narypr << Utility.ox_element(
|
76
|
-
"chr",
|
77
|
-
namespace: "m",
|
78
|
-
attributes: { "m:val": first_value },
|
79
|
-
)
|
80
|
-
end
|
81
|
-
|
82
61
|
def hide_tags(nar)
|
83
62
|
attr = { "m:val": "1" }
|
84
63
|
if parameter_two.nil?
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Prod < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "prod",
|
11
|
+
first_value: "subscript",
|
12
|
+
second_value: "supscript",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
17
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -55,24 +61,19 @@ module Plurimath
|
|
55
61
|
end
|
56
62
|
|
57
63
|
def to_omml_without_math_tag(display_style)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
r_tag = Utility.ox_element("r", namespace: "m")
|
72
|
-
t_tag = Utility.ox_element("t", namespace: "m")
|
73
|
-
r_tag << (t_tag << "∏")
|
74
|
-
[r_tag]
|
75
|
-
end
|
64
|
+
return r_element("∏", rpr_tag: false) unless all_values_exist?
|
65
|
+
|
66
|
+
nary = Utility.ox_element("nary", namespace: "m")
|
67
|
+
Utility.update_nodes(
|
68
|
+
nary,
|
69
|
+
[
|
70
|
+
narypr("∏"),
|
71
|
+
omml_parameter(parameter_one, display_style, tag_name: "sub"),
|
72
|
+
omml_parameter(parameter_two, display_style, tag_name: "sup"),
|
73
|
+
omml_parameter(parameter_three, display_style, tag_name: "e"),
|
74
|
+
],
|
75
|
+
)
|
76
|
+
[nary]
|
76
77
|
end
|
77
78
|
|
78
79
|
def nary_attr_value
|
@@ -30,13 +30,31 @@ module Plurimath
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def to_latex
|
33
|
-
"\\right #{
|
33
|
+
"\\right #{latex_paren}"
|
34
34
|
end
|
35
35
|
|
36
36
|
def validate_function_formula
|
37
37
|
false
|
38
38
|
end
|
39
39
|
|
40
|
+
def to_asciimath_math_zone(spacing = "", _, _)
|
41
|
+
"#{spacing}\"#{latex_paren}\" right\n"
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_latex_math_zone(spacing = "", _, _)
|
45
|
+
"#{spacing}\"#{latex_paren}\" right\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_mathml_math_zone(spacing = "", _, _)
|
49
|
+
mo_tag = (Utility.ox_element("mo") << right_paren)
|
50
|
+
"#{spacing}\"#{dump_ox_nodes(mo_tag).gsub(/\s+/, "")}\" right\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_omml_math_zone(spacing = "", _, _, display_style:)
|
54
|
+
t_tag = (Utility.ox_element("t", namespace: "m") << right_paren)
|
55
|
+
"#{spacing}\"#{dump_ox_nodes(t_tag).gsub(/\s+/, "")}\" right\n"
|
56
|
+
end
|
57
|
+
|
40
58
|
protected
|
41
59
|
|
42
60
|
def right_paren
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Root < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "root",
|
11
|
+
first_value: "radicand",
|
12
|
+
second_value: "index",
|
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
|
@@ -5,6 +5,13 @@ module Plurimath
|
|
5
5
|
module Math
|
6
6
|
module Function
|
7
7
|
class Rule < TernaryFunction
|
8
|
+
FUNCTION = {
|
9
|
+
name: "rule",
|
10
|
+
first_value: "first argument",
|
11
|
+
second_value: "second argument",
|
12
|
+
third_value: "third argument",
|
13
|
+
}.freeze
|
14
|
+
|
8
15
|
def to_asciimath
|
9
16
|
""
|
10
17
|
end
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Semantics < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "semantics",
|
11
|
+
first_value: "first argument",
|
12
|
+
second_value: "second argument",
|
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 = other_tags(parameter_two)
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Stackrel < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "stackrel",
|
11
|
+
first_value: "above",
|
12
|
+
second_value: "below",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = wrapped(parameter_one)
|
11
17
|
second_value = wrapped(parameter_two)
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Substack < BinaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "substack",
|
11
|
+
first_value: "above",
|
12
|
+
second_value: "below",
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
def to_latex
|
10
16
|
first_value = parameter_one.to_latex if parameter_one
|
11
17
|
second_value = "\\\\#{parameter_two.to_latex}" if parameter_two
|
@@ -6,6 +6,13 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Sum < TernaryFunction
|
9
|
+
FUNCTION = {
|
10
|
+
name: "summation",
|
11
|
+
first_value: "subscript",
|
12
|
+
second_value: "supscript",
|
13
|
+
third_value: "term",
|
14
|
+
}.freeze
|
15
|
+
|
9
16
|
def to_asciimath
|
10
17
|
first_value = "_#{wrapped(parameter_one)}" if parameter_one
|
11
18
|
second_value = "^#{wrapped(parameter_two)}" if parameter_two
|
@@ -20,32 +27,26 @@ module Plurimath
|
|
20
27
|
|
21
28
|
def to_mathml_without_math_tag
|
22
29
|
first_value = Utility.ox_element("mo") << invert_unicode_symbols.to_s
|
23
|
-
|
24
|
-
value_array = []
|
25
|
-
value_array << parameter_one&.to_mathml_without_math_tag
|
26
|
-
value_array << parameter_two&.to_mathml_without_math_tag
|
27
|
-
tag_name = if parameter_two && parameter_one
|
28
|
-
"underover"
|
29
|
-
else
|
30
|
-
parameter_one ? "under" : "over"
|
31
|
-
end
|
32
|
-
munderover_tag = Utility.ox_element("m#{tag_name}")
|
33
|
-
Utility.update_nodes(
|
34
|
-
munderover_tag,
|
35
|
-
value_array.insert(0, first_value),
|
36
|
-
)
|
37
|
-
return munderover_tag if parameter_three.nil?
|
30
|
+
return first_value unless parameter_one || parameter_two
|
38
31
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
32
|
+
value_array = [parameter_one&.to_mathml_without_math_tag]
|
33
|
+
value_array << parameter_two&.to_mathml_without_math_tag
|
34
|
+
tag_name = if parameter_two && parameter_one
|
35
|
+
"underover"
|
36
|
+
else
|
37
|
+
parameter_one ? "under" : "over"
|
38
|
+
end
|
39
|
+
munderover_tag = Utility.ox_element("m#{tag_name}")
|
40
|
+
Utility.update_nodes(munderover_tag, value_array.insert(0, first_value))
|
41
|
+
return munderover_tag if parameter_three.nil?
|
42
|
+
|
43
|
+
Utility.update_nodes(
|
44
|
+
Utility.ox_element("mrow"),
|
45
|
+
[
|
46
|
+
munderover_tag,
|
47
|
+
parameter_three&.to_mathml_without_math_tag,
|
48
|
+
].flatten.compact,
|
49
|
+
)
|
49
50
|
end
|
50
51
|
|
51
52
|
def to_html
|