plurimath 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +13 -0
  3. data/.github/workflows/release.yml +22 -0
  4. data/.hound.yml +5 -0
  5. data/.rubocop.yml +8 -0
  6. data/AsciiMath-Supported-Data.adoc +1994 -274
  7. data/Gemfile +2 -0
  8. data/Latex-Supported-Data.adoc +1875 -1868
  9. data/MathML-Supported-Data.adoc +280 -263
  10. data/README.adoc +22 -20
  11. data/lib/plurimath/asciimath/constants.rb +187 -141
  12. data/lib/plurimath/asciimath/parse.rb +104 -39
  13. data/lib/plurimath/asciimath/parser.rb +3 -1
  14. data/lib/plurimath/asciimath/transform.rb +1074 -238
  15. data/lib/plurimath/html/parse.rb +1 -1
  16. data/lib/plurimath/latex/constants.rb +3229 -1432
  17. data/lib/plurimath/latex/parse.rb +108 -85
  18. data/lib/plurimath/latex/parser.rb +11 -4
  19. data/lib/plurimath/latex/transform.rb +354 -99
  20. data/lib/plurimath/math/base.rb +15 -0
  21. data/lib/plurimath/math/formula.rb +90 -13
  22. data/lib/plurimath/math/function/bar.rb +35 -1
  23. data/lib/plurimath/math/function/base.rb +25 -4
  24. data/lib/plurimath/math/function/binary_function.rb +101 -19
  25. data/lib/plurimath/math/function/cancel.rb +8 -0
  26. data/lib/plurimath/math/function/ceil.rb +3 -0
  27. data/lib/plurimath/math/function/color.rb +15 -5
  28. data/lib/plurimath/math/function/f.rb +8 -0
  29. data/lib/plurimath/math/function/fenced.rb +95 -8
  30. data/lib/plurimath/math/function/floor.rb +15 -0
  31. data/lib/plurimath/math/function/font_style/bold.rb +19 -0
  32. data/lib/plurimath/math/function/font_style/double_struck.rb +19 -0
  33. data/lib/plurimath/math/function/font_style/fraktur.rb +19 -0
  34. data/lib/plurimath/math/function/font_style/italic.rb +37 -0
  35. data/lib/plurimath/math/function/font_style/monospace.rb +19 -0
  36. data/lib/plurimath/math/function/font_style/normal.rb +37 -0
  37. data/lib/plurimath/math/function/font_style/sans-serif.rb +19 -0
  38. data/lib/plurimath/math/function/font_style/script.rb +19 -0
  39. data/lib/plurimath/math/function/font_style.rb +18 -5
  40. data/lib/plurimath/math/function/frac.rb +33 -3
  41. data/lib/plurimath/math/function/g.rb +7 -0
  42. data/lib/plurimath/math/function/hat.rb +12 -0
  43. data/lib/plurimath/math/function/inf.rb +21 -0
  44. data/lib/plurimath/math/function/int.rb +23 -2
  45. data/lib/plurimath/math/function/left.rb +25 -1
  46. data/lib/plurimath/math/function/lim.rb +40 -2
  47. data/lib/plurimath/math/function/limits.rb +9 -0
  48. data/lib/plurimath/math/function/log.rb +55 -4
  49. data/lib/plurimath/math/function/longdiv.rb +12 -0
  50. data/lib/plurimath/math/function/mbox.rb +31 -0
  51. data/lib/plurimath/math/function/menclose.rb +46 -0
  52. data/lib/plurimath/math/function/merror.rb +12 -0
  53. data/lib/plurimath/math/function/mod.rb +19 -4
  54. data/lib/plurimath/math/function/msgroup.rb +37 -0
  55. data/lib/plurimath/math/function/msline.rb +12 -0
  56. data/lib/plurimath/math/function/multiscript.rb +19 -0
  57. data/lib/plurimath/math/function/norm.rb +17 -1
  58. data/lib/plurimath/math/function/obrace.rb +17 -0
  59. data/lib/plurimath/math/function/oint.rb +2 -2
  60. data/lib/plurimath/math/function/over.rb +12 -5
  61. data/lib/plurimath/math/function/overset.rb +34 -5
  62. data/lib/plurimath/math/function/phantom.rb +28 -0
  63. data/lib/plurimath/math/function/power.rb +27 -9
  64. data/lib/plurimath/math/function/power_base.rb +109 -11
  65. data/lib/plurimath/math/function/prod.rb +25 -4
  66. data/lib/plurimath/math/function/right.rb +22 -2
  67. data/lib/plurimath/math/function/root.rb +23 -1
  68. data/lib/plurimath/math/function/rule.rb +33 -0
  69. data/lib/plurimath/math/function/scarries.rb +12 -0
  70. data/lib/plurimath/math/function/scarry.rb +12 -0
  71. data/lib/plurimath/math/function/sqrt.rb +23 -1
  72. data/lib/plurimath/math/function/stackrel.rb +27 -0
  73. data/lib/plurimath/math/function/substack.rb +7 -0
  74. data/lib/plurimath/math/function/sum.rb +50 -2
  75. data/lib/plurimath/math/function/sup.rb +3 -0
  76. data/lib/plurimath/math/function/table/align.rb +5 -5
  77. data/lib/plurimath/math/function/table/array.rb +25 -6
  78. data/lib/plurimath/math/function/table/bmatrix.rb +18 -7
  79. data/lib/plurimath/math/function/table/matrix.rb +13 -5
  80. data/lib/plurimath/math/function/table/multline.rb +5 -5
  81. data/lib/plurimath/math/function/table/pmatrix.rb +5 -5
  82. data/lib/plurimath/math/function/table/split.rb +5 -5
  83. data/lib/plurimath/math/function/table/vmatrix.rb +5 -6
  84. data/lib/plurimath/math/function/table.rb +185 -27
  85. data/lib/plurimath/math/function/td.rb +22 -9
  86. data/lib/plurimath/math/function/ternary_function.rb +74 -9
  87. data/lib/plurimath/math/function/text.rb +36 -11
  88. data/lib/plurimath/math/function/tr.rb +23 -4
  89. data/lib/plurimath/math/function/ubrace.rb +17 -0
  90. data/lib/plurimath/math/function/ul.rb +29 -0
  91. data/lib/plurimath/math/function/unary_function.rb +81 -8
  92. data/lib/plurimath/math/function/underline.rb +12 -0
  93. data/lib/plurimath/math/function/underover.rb +107 -0
  94. data/lib/plurimath/math/function/underset.rb +39 -0
  95. data/lib/plurimath/math/function/vec.rb +7 -1
  96. data/lib/plurimath/math/number.rb +5 -5
  97. data/lib/plurimath/math/symbol.rb +51 -12
  98. data/lib/plurimath/math/unicode.rb +11 -0
  99. data/lib/plurimath/math.rb +7 -3
  100. data/lib/plurimath/mathml/constants.rb +224 -147
  101. data/lib/plurimath/mathml/parser.rb +24 -8
  102. data/lib/plurimath/mathml/transform.rb +249 -153
  103. data/lib/plurimath/omml/parser.rb +24 -4
  104. data/lib/plurimath/omml/transform.rb +219 -157
  105. data/lib/plurimath/utility.rb +342 -20
  106. data/lib/plurimath/version.rb +1 -1
  107. metadata +21 -6
  108. data/.github/workflows/test.yml +0 -33
  109. data/lib/plurimath/mathml/parse.rb +0 -68
  110. data/lib/plurimath/omml/constants.rb +0 -154
@@ -15,9 +15,9 @@ module Plurimath
15
15
  end
16
16
 
17
17
  def to_asciimath
18
- first_value = parameter_one&.to_asciimath
19
- second_value = "_(#{parameter_two.to_asciimath})" if parameter_two
20
- third_value = "^(#{parameter_three.to_asciimath})" if parameter_three
18
+ first_value = first_field_wrap(parameter_one) if parameter_one
19
+ second_value = "_#{wrapped(parameter_two)}" if parameter_two
20
+ third_value = "^#{wrapped(parameter_three)}" if parameter_three
21
21
  "#{first_value}#{second_value}#{third_value}"
22
22
  end
23
23
 
@@ -29,23 +29,88 @@ module Plurimath
29
29
  end
30
30
 
31
31
  def to_mathml_without_math_tag
32
- first_value = parameter_one&.to_mathml_without_math_tag
33
- second_value = parameter_two&.to_mathml_without_math_tag
34
- third_value = parameter_three&.to_mathml_without_math_tag
35
- body_value = "#{first_value}#{second_value}#{third_value}"
36
- "<m#{class_name}>#{body_value}</m#{class_name}>"
32
+ value_arr = [parameter_one&.to_mathml_without_math_tag]
33
+ value_arr << parameter_two&.to_mathml_without_math_tag
34
+ value_arr << parameter_three&.to_mathml_without_math_tag
35
+ class_tag = Utility.ox_element("m#{class_name}")
36
+ Utility.update_nodes(class_tag, value_arr)
37
+ end
38
+
39
+ def to_latex
40
+ first_value = parameter_one&.to_latex
41
+ second_value = parameter_two&.to_latex
42
+ third_value = parameter_three&.to_latex
43
+ "#{first_value}#{second_value}#{third_value}"
37
44
  end
38
45
 
39
46
  def to_html
40
47
  first_value = "<i>#{parameter_one.to_html}</i>" if parameter_one
41
48
  second_value = "<i>#{parameter_two.to_html}</i>" if parameter_two
42
49
  third_value = "<i>#{parameter_three.to_html}</i>" if parameter_three
43
- first_value + second_value + third_value
50
+ "#{first_value}#{second_value}#{third_value}"
51
+ end
52
+
53
+ def to_omml_without_math_tag
54
+ r_tag = Utility.ox_element("r", namespace: "m")
55
+ r_tag << omml_value(parameter_one) if parameter_one
56
+ r_tag << omml_value(parameter_two) if parameter_two
57
+ r_tag << omml_value(parameter_three) if parameter_three
58
+ r_tag
44
59
  end
45
60
 
46
61
  def class_name
47
62
  self.class.name.split("::").last.downcase
48
63
  end
64
+
65
+ protected
66
+
67
+ def omml_value(field)
68
+ case field
69
+ when Array
70
+ field.compact.map(&:to_omml_without_math_tag)
71
+ else
72
+ t_tag = Utility.ox_element("t", namespace: "m")
73
+ first_value = field.to_omml_without_math_tag
74
+ first_value = (t_tag << first_value) if field.is_a?(Symbol)
75
+ first_value
76
+ end
77
+ end
78
+
79
+ def wrapped(field, type: "ascii")
80
+ return "" unless field
81
+
82
+ type == "ascii" ? "(#{field.to_asciimath})" : "{#{field.to_latex}}"
83
+ end
84
+
85
+ def first_field_wrap(field, type: "ascii")
86
+ return "" unless field
87
+
88
+ type == "ascii" ? ascii_wrap(field) : latex_wrap(field)
89
+ end
90
+
91
+ def ascii_wrap(field)
92
+ asciimath = field.to_asciimath
93
+ return latex if ["obrace", "ubrace"].include?(field.class_name)
94
+
95
+ case field
96
+ when Formula || field.class.name.include?("Function")
97
+ "(#{asciimath})"
98
+ else
99
+ asciimath
100
+ end
101
+ end
102
+
103
+ def latex_wrap(field)
104
+ latex = field.to_latex
105
+ return latex if ["obrace", "ubrace"].include?(field.class_name)
106
+
107
+ case field
108
+ when Formula || field.class.name.include?("Function")
109
+ "{#{latex}}"
110
+ else
111
+ latex
112
+ end
113
+ end
49
114
  end
50
115
  end
51
116
  end
@@ -1,42 +1,67 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "htmlentities"
3
4
  require_relative "unary_function"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Text < UnaryFunction
10
+ PARSER_REGEX = %r{unicode\[:(?<unicode>\w{1,})\]}.freeze
11
+
9
12
  def to_asciimath
10
13
  "\"#{parse_text('asciimath') || parameter_one}\""
11
14
  end
12
15
 
13
16
  def to_mathml_without_math_tag
14
- "<mtext>#{parse_text('mathml') || parameter_one}</mtext>"
15
- end
16
-
17
- def symbol_value(unicode)
18
- Mathml::Constants::UNICODE_SYMBOLS.invert[unicode] ||
19
- Mathml::Constants::SYMBOLS.invert[unicode]
17
+ text = Utility.ox_element("mtext")
18
+ text << (parse_text("mathml") || parameter_one) if parameter_one
20
19
  end
21
20
 
22
21
  def to_latex
23
- parse_text("latex") || parameter_one
22
+ text_value = parse_text("latex") || parameter_one
23
+ "\\text{#{text_value}}"
24
24
  end
25
25
 
26
26
  def to_html
27
27
  parse_text("html") || parameter_one
28
28
  end
29
29
 
30
+ def to_omml_without_math_tag
31
+ text = Utility.ox_element("t", namespace: "m")
32
+ text << (parse_text("omml") || parameter_one)
33
+ end
34
+
35
+ protected
36
+
37
+ def symbol_value(unicode)
38
+ Mathml::Constants::UNICODE_SYMBOLS.invert[unicode] ||
39
+ Mathml::Constants::SYMBOLS.invert[unicode]
40
+ end
41
+
30
42
  def parse_text(lang)
31
- regex = %r{\\mbox\{(?<mbox>.{1,})\}|unicode\[:(?<unicode>\w{1,})\]}
32
- parameter_one.gsub!(regex) do |_text|
43
+ html_value = first_value(lang).dup
44
+ html_value&.gsub!(PARSER_REGEX) do |_text|
33
45
  last_match = Regexp.last_match
34
46
  if ["mathml", "html"].include?(lang)
35
- symbol_value(last_match[:unicode]) || last_match[:mbox]
47
+ symbol_value(last_match[:unicode])
36
48
  else
37
- last_match[:unicode] || last_match[:mbox]
49
+ last_match[:unicode]
38
50
  end
39
51
  end
52
+ html_value
53
+ end
54
+
55
+ def first_value(lang)
56
+ if lang == "omml"
57
+ entities = HTMLEntities.new
58
+ entities.encode(
59
+ entities.decode(parameter_one),
60
+ :named,
61
+ )
62
+ else
63
+ parameter_one
64
+ end
40
65
  end
41
66
  end
42
67
  end
@@ -7,23 +7,42 @@ module Plurimath
7
7
  module Function
8
8
  class Tr < UnaryFunction
9
9
  def to_asciimath
10
- "[#{parameter_one.map(&:to_asciimath).join(',')}]"
10
+ "[#{parameter_one.map(&:to_asciimath).join(', ')}]"
11
11
  end
12
12
 
13
13
  def to_mathml_without_math_tag
14
- "<mtr>#{parameter_one.map(&:to_mathml_without_math_tag).join}</mtr>"
14
+ first_value = parameter_one.dup
15
+ row_lines = first_value.first.parameter_one
16
+ row_lines.shift if Utility.symbol_value(row_lines.first, "&#x23af;")
17
+ Utility.update_nodes(
18
+ Utility.ox_element("mtr"),
19
+ first_value.map(&:to_mathml_without_math_tag).compact,
20
+ )
15
21
  end
16
22
 
17
23
  def to_latex
18
24
  parameter_one.reject do |td|
19
- td if td.is_a?(Math::Symbol) && td.value == "|"
20
- end.map(&:to_latex).join("&")
25
+ td if Utility.symbol_value(td, "|") || Utility.symbol_value(td.parameter_one.first, "|")
26
+ end.map(&:to_latex).join(" & ")
21
27
  end
22
28
 
23
29
  def to_html
24
30
  first_value = parameter_one.map(&:to_html).join
25
31
  "<tr>#{first_value}</tr>"
26
32
  end
33
+
34
+ def to_omml_without_math_tag
35
+ omml_content = parameter_one&.map(&:to_omml_without_math_tag)
36
+ if parameter_one.count.eql?(1)
37
+ omml_content
38
+ else
39
+ mr = Utility.ox_element("mr", namespace: "m")
40
+ Utility.update_nodes(
41
+ mr,
42
+ omml_content,
43
+ )
44
+ end
45
+ end
27
46
  end
28
47
  end
29
48
  end
@@ -6,7 +6,24 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Ubrace < UnaryFunction
9
+ def to_latex
10
+ first_value = "{#{parameter_one.to_latex}}" if parameter_one
11
+ "\\underbrace#{first_value}"
12
+ end
13
+
14
+ def to_mathml_without_math_tag
15
+ mo_tag = (Utility.ox_element("mo") << "&#x23df;")
16
+ if parameter_one
17
+ over_tag = Utility.ox_element("munder")
18
+ arr_value = mathml_value
19
+ Utility.update_nodes(over_tag, (arr_value << mo_tag))
20
+ else
21
+ mo_tag
22
+ end
23
+ end
9
24
  end
25
+
26
+ Underbrace = Ubrace
10
27
  end
11
28
  end
12
29
  end
@@ -6,6 +6,35 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Ul < UnaryFunction
9
+ def to_mathml_without_math_tag
10
+ first_value = parameter_one&.to_mathml_without_math_tag
11
+ Utility.update_nodes(
12
+ Utility.ox_element("munder"),
13
+ [
14
+ first_value,
15
+ Utility.ox_element("mo") << "&#xaf;",
16
+ ],
17
+ )
18
+ end
19
+
20
+ def to_omml_without_math_tag
21
+ bar = Utility.ox_element("bar", namespace: "m")
22
+ barpr = Utility.ox_element("barPr", namespace: "m")
23
+ barpr << Utility.pr_element("ctrl", true, namespace: "m")
24
+ me = Utility.ox_element("e", namespace: "m")
25
+ me << parameter_one.to_omml_without_math_tag
26
+ Utility.update_nodes(
27
+ bar,
28
+ [
29
+ barpr,
30
+ me,
31
+ ],
32
+ )
33
+ end
34
+
35
+ def class_name
36
+ "underline"
37
+ end
9
38
  end
10
39
  end
11
40
  end
@@ -7,6 +7,7 @@ module Plurimath
7
7
  attr_accessor :parameter_one
8
8
 
9
9
  def initialize(parameter_one = nil)
10
+ parameter_one = parameter_one.to_s if parameter_one.is_a?(Parslet::Slice)
10
11
  @parameter_one = parameter_one
11
12
  end
12
13
 
@@ -16,30 +17,102 @@ module Plurimath
16
17
  end
17
18
 
18
19
  def to_asciimath
19
- "#{class_name}#{value_to_asciimath}"
20
- end
21
-
22
- def value_to_asciimath
23
- "(#{parameter_one.to_asciimath})" unless parameter_one.nil?
20
+ value = if Utility::UNARY_CLASSES.any?(class_name)
21
+ asciimath_value
22
+ elsif parameter_one
23
+ "(#{asciimath_value})"
24
+ end
25
+ "#{class_name}#{value}"
24
26
  end
25
27
 
26
28
  def to_mathml_without_math_tag
27
- "<mi>#{class_name}</mi>"
29
+ row_tag = Utility.ox_element("mrow")
30
+ tag_name = Utility::UNARY_CLASSES.include?(class_name) ? "mi" : "mo"
31
+ new_arr = [Utility.ox_element(tag_name) << class_name]
32
+ new_arr += mathml_value if parameter_one
33
+ Utility.update_nodes(row_tag, new_arr)
28
34
  end
29
35
 
30
36
  def to_latex
31
- first_value = "{#{parameter_one.to_latex}}" if parameter_one
37
+ first_value = "{#{latex_value}}" if parameter_one
32
38
  "\\#{class_name}#{first_value}"
33
39
  end
34
40
 
35
41
  def to_html
36
- first_value = "<i>#{parameter_one.to_html}</i>" if parameter_one
42
+ first_value = if parameter_one.is_a?(Array)
43
+ "<i>#{parameter_one.map(&:to_html).join}</i>"
44
+ elsif parameter_one
45
+ "<i>#{parameter_one.to_html}</i>"
46
+ end
37
47
  "<i>#{class_name}</i>#{first_value}"
38
48
  end
39
49
 
50
+ def to_omml_without_math_tag
51
+ func = Utility.ox_element("func", namespace: "m")
52
+ funcpr = Utility.ox_element("funcPr", namespace: "m")
53
+ funcpr << Utility.pr_element("ctrl", true, namespace: "m")
54
+ fname = Utility.ox_element("fName", namespace: "m")
55
+ mr = Utility.ox_element("r", namespace: "m")
56
+ rpr = Utility.rpr_element
57
+ mt = Utility.ox_element("t", namespace: "m") << class_name
58
+ fname << Utility.update_nodes(mr, [rpr, mt])
59
+ me = Utility.ox_element("e", namespace: "m")
60
+ Utility.update_nodes(me, omml_value) if parameter_one
61
+ Utility.update_nodes(
62
+ func,
63
+ [
64
+ funcpr,
65
+ fname,
66
+ me,
67
+ ],
68
+ )
69
+ end
70
+
40
71
  def class_name
41
72
  self.class.name.split("::").last.downcase
42
73
  end
74
+
75
+ protected
76
+
77
+ def asciimath_value
78
+ return "" unless parameter_one
79
+
80
+ case parameter_one
81
+ when Array
82
+ parameter_one.compact.map(&:to_asciimath).join
83
+ else
84
+ parameter_one.to_asciimath
85
+ end
86
+ end
87
+
88
+ def mathml_value
89
+ case parameter_one
90
+ when Array
91
+ parameter_one.compact.map(&:to_mathml_without_math_tag)
92
+ else
93
+ Array(parameter_one&.to_mathml_without_math_tag)
94
+ end
95
+ end
96
+
97
+ def latex_value
98
+ if parameter_one.is_a?(Array)
99
+ return parameter_one&.compact&.map(&:to_latex)&.join(" ")
100
+ end
101
+
102
+ parameter_one&.to_latex
103
+ end
104
+
105
+ def omml_value
106
+ if parameter_one.is_a?(Array)
107
+ return parameter_one.compact.map(&:to_omml_without_math_tag)
108
+ end
109
+
110
+ first_value = parameter_one.to_omml_without_math_tag
111
+ if parameter_one.is_a?(Symbol)
112
+ first_value = Utility.ox_element("t", namespace: "m") << first_value
113
+ end
114
+ Array(first_value)
115
+ end
43
116
  end
44
117
  end
45
118
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "unary_function"
4
+
5
+ module Plurimath
6
+ module Math
7
+ module Function
8
+ class Underline < UnaryFunction
9
+ end
10
+ end
11
+ end
12
+ end
@@ -6,6 +6,113 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Underover < TernaryFunction
9
+ def to_asciimath
10
+ first_value = first_field_wrap(parameter_one) if parameter_one
11
+ second_value = "_#{wrapped(parameter_two)}" if parameter_two
12
+ third_value = "^#{wrapped(parameter_three)}" if parameter_three
13
+ "#{first_value}#{second_value}#{third_value}"
14
+ end
15
+
16
+ def to_latex
17
+ first_value = first_field_wrap(parameter_one, type: "latex") if parameter_one
18
+ second_value = "_#{wrapped(parameter_two, type: 'latex')}" if parameter_two
19
+ third_value = "^#{wrapped(parameter_three, type: 'latex')}" if parameter_three
20
+ "#{first_value}#{second_value}#{third_value}"
21
+ end
22
+
23
+ def to_mathml_without_math_tag
24
+ first_value = parameter_one&.to_mathml_without_math_tag
25
+ second_value = parameter_two&.to_mathml_without_math_tag
26
+ third_value = parameter_three&.to_mathml_without_math_tag
27
+ class_tag = Utility.ox_element("m#{class_name}")
28
+ Utility.update_nodes(
29
+ class_tag,
30
+ [
31
+ first_value,
32
+ second_value,
33
+ third_value,
34
+ ],
35
+ )
36
+ end
37
+
38
+ def to_omml_without_math_tag
39
+ limupp = Utility.ox_element("limUpp", namespace: "m")
40
+ limpr = Utility.ox_element("limUppPr", namespace: "m")
41
+ limpr << Utility.pr_element("ctrl", namespace: "m")
42
+ e_tag = Utility.ox_element("e", namespace: "m")
43
+ e_tag << parameter_one&.to_omml_without_math_tag
44
+ lim = Utility.ox_element("lim", namespace: "m")
45
+ lim << parameter_two&.to_omml_without_math_tag if parameter_two
46
+ Utility.update_nodes(
47
+ limupp,
48
+ [
49
+ e_tag,
50
+ lim,
51
+ ],
52
+ )
53
+ end
54
+
55
+ def omml_nary_tag
56
+ pr = Utility.ox_element("naryPr", namespace: "m")
57
+ [pr_element_value(pr), sub_value, sup_value]
58
+ end
59
+
60
+ protected
61
+
62
+ def hidden_sub_tag(pr_element)
63
+ return true unless parameter_two.nil?
64
+
65
+ pr_element << Utility.ox_element(
66
+ "subHide",
67
+ namespace: "m",
68
+ attributes: { "m:val": 1 },
69
+ )
70
+ end
71
+
72
+ def hidden_sup_tag(pr_element)
73
+ return true unless parameter_three.nil?
74
+
75
+ pr_element << Utility.ox_element(
76
+ "supHide",
77
+ namespace: "m",
78
+ attributes: { "m:val": 1 },
79
+ )
80
+ end
81
+
82
+ def pr_element_value(pr_element)
83
+ first_value(pr_element)
84
+ pr_element << Utility.ox_element(
85
+ "limLoc",
86
+ namespace: "m",
87
+ attributes: { "m:val": "undOvr" },
88
+ )
89
+ hidden_sub_tag(pr_element)
90
+ hidden_sup_tag(pr_element)
91
+ pr_element << Utility.pr_element("ctrl", true, namespace: "m")
92
+ end
93
+
94
+ def sub_value
95
+ sub = Utility.ox_element("sub", namespace: "m")
96
+ sub << omml_value(parameter_two) if parameter_two
97
+ sub
98
+ end
99
+
100
+ def sup_value
101
+ sup = Utility.ox_element("sup", namespace: "m")
102
+ sup << omml_value(parameter_three) if parameter_three
103
+ sup
104
+ end
105
+
106
+ def first_value(pr_element)
107
+ first_value = parameter_one.is_a?(Number) ? parameter_one.value : parameter_one.to_omml_without_math_tag
108
+ unless first_value == "∫"
109
+ pr_element << Utility.ox_element(
110
+ "chr",
111
+ namespace: "m",
112
+ attributes: { "m:val": first_value },
113
+ )
114
+ end
115
+ end
9
116
  end
10
117
  end
11
118
  end
@@ -6,6 +6,45 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Underset < BinaryFunction
9
+ def to_mathml_without_math_tag
10
+ first_value = parameter_one&.to_mathml_without_math_tag
11
+ second_value = parameter_two&.to_mathml_without_math_tag
12
+ Utility.update_nodes(
13
+ Utility.ox_element("munder"),
14
+ [
15
+ second_value,
16
+ first_value,
17
+ ],
18
+ )
19
+ end
20
+
21
+ def to_omml_without_math_tag
22
+ first_value = if parameter_one.is_a?(Math::Symbol)
23
+ mt = Utility.ox_element("t", namespace: "m")
24
+ mt << parameter_one.to_omml_without_math_tag
25
+ else
26
+ parameter_one.to_omml_without_math_tag
27
+ end
28
+ second_value = if parameter_two.is_a?(Math::Symbol)
29
+ mt = Utility.ox_element("t", namespace: "m")
30
+ mt << parameter_two.to_omml_without_math_tag
31
+ else
32
+ parameter_two.to_omml_without_math_tag
33
+ end
34
+ limlow = Utility.ox_element("limLow", namespace: "m")
35
+ limlowpr = Utility.ox_element("limLowPr", namespace: "m")
36
+ limlowpr << Utility.pr_element("ctrl", true, namespace: "m")
37
+ me = Utility.ox_element("e", namespace: "m") << first_value
38
+ lim = Utility.ox_element("lim", namespace: "m") << second_value if second_value
39
+ Utility.update_nodes(
40
+ limlow,
41
+ [
42
+ limlowpr,
43
+ me,
44
+ lim,
45
+ ],
46
+ )
47
+ end
9
48
  end
10
49
  end
11
50
  end
@@ -8,7 +8,13 @@ module Plurimath
8
8
  class Vec < UnaryFunction
9
9
  def to_mathml_without_math_tag
10
10
  first_value = parameter_one&.to_mathml_without_math_tag
11
- "<mover>#{first_value}<mo>&#x20D1;</mo></mover>"
11
+ Utility.update_nodes(
12
+ Utility.ox_element("mover"),
13
+ [
14
+ first_value,
15
+ Utility.ox_element("mo") << "&#x2192;",
16
+ ],
17
+ )
12
18
  end
13
19
  end
14
20
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Plurimath
4
4
  module Math
5
- class Number
5
+ class Number < Base
6
6
  attr_accessor :value
7
7
 
8
8
  def initialize(value)
9
- @value = value
9
+ @value = super
10
10
  end
11
11
 
12
12
  def ==(object)
@@ -18,7 +18,7 @@ module Plurimath
18
18
  end
19
19
 
20
20
  def to_mathml_without_math_tag
21
- "<mn>#{value}</mn>"
21
+ Utility.ox_element("mn") << value
22
22
  end
23
23
 
24
24
  def to_latex
@@ -29,8 +29,8 @@ module Plurimath
29
29
  value
30
30
  end
31
31
 
32
- def class_name
33
- self.class.name.split("::").last.downcase
32
+ def to_omml_without_math_tag
33
+ Utility.ox_element("t", namespace: "m") << value
34
34
  end
35
35
  end
36
36
  end