plurimath 0.2.1 → 0.2.2

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.
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 +186 -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 +3228 -1432
  17. data/lib/plurimath/latex/parse.rb +106 -83
  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
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../font_style"
4
+
5
+ module Plurimath
6
+ module Math
7
+ module Function
8
+ class FontStyle
9
+ class Italic < FontStyle
10
+ def initialize(parameter_one,
11
+ parameter_two = "italic")
12
+ super
13
+ end
14
+
15
+ def to_asciimath
16
+ "ii(#{parameter_one.to_asciimath})"
17
+ end
18
+
19
+ def to_latex
20
+ first_value = parameter_one.to_latex if parameter_one
21
+ "\\mathit{#{first_value}}"
22
+ end
23
+
24
+ def to_mathml_without_math_tag
25
+ Utility.update_nodes(
26
+ Utility.ox_element(
27
+ "mstyle",
28
+ attributes: { mathvariant: "italic" },
29
+ ),
30
+ [parameter_one.to_mathml_without_math_tag],
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -11,6 +11,25 @@ module Plurimath
11
11
  parameter_two = "monospace")
12
12
  super
13
13
  end
14
+
15
+ def to_asciimath
16
+ "mathtt(#{parameter_one.to_asciimath})"
17
+ end
18
+
19
+ def to_latex
20
+ first_value = parameter_one.to_latex if parameter_one
21
+ "\\mathtt{#{first_value}}"
22
+ end
23
+
24
+ def to_mathml_without_math_tag
25
+ Utility.update_nodes(
26
+ Utility.ox_element(
27
+ "mstyle",
28
+ attributes: { mathvariant: "monospace" },
29
+ ),
30
+ [parameter_one.to_mathml_without_math_tag],
31
+ )
32
+ end
14
33
  end
15
34
  end
16
35
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../font_style"
4
+
5
+ module Plurimath
6
+ module Math
7
+ module Function
8
+ class FontStyle
9
+ class Normal < FontStyle
10
+ def initialize(parameter_one,
11
+ parameter_two = "rm")
12
+ super
13
+ end
14
+
15
+ def to_asciimath
16
+ "rm(#{parameter_one.to_asciimath})"
17
+ end
18
+
19
+ def to_latex
20
+ first_value = parameter_one.to_latex if parameter_one
21
+ "\\mathrm{#{first_value}}"
22
+ end
23
+
24
+ def to_mathml_without_math_tag
25
+ Utility.update_nodes(
26
+ Utility.ox_element(
27
+ "mstyle",
28
+ attributes: { mathvariant: "normal" },
29
+ ),
30
+ [parameter_one.to_mathml_without_math_tag],
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -11,6 +11,25 @@ module Plurimath
11
11
  parameter_two = "sans-serif")
12
12
  super
13
13
  end
14
+
15
+ def to_asciimath
16
+ "mathsf(#{parameter_one.to_asciimath})"
17
+ end
18
+
19
+ def to_latex
20
+ first_value = parameter_one.to_latex if parameter_one
21
+ "\\mathsf{#{first_value}}"
22
+ end
23
+
24
+ def to_mathml_without_math_tag
25
+ Utility.update_nodes(
26
+ Utility.ox_element(
27
+ "mstyle",
28
+ attributes: { mathvariant: "sans-serif" },
29
+ ),
30
+ [parameter_one.to_mathml_without_math_tag],
31
+ )
32
+ end
14
33
  end
15
34
  end
16
35
  end
@@ -11,6 +11,25 @@ module Plurimath
11
11
  parameter_two = "script")
12
12
  super
13
13
  end
14
+
15
+ def to_asciimath
16
+ "mathcal(#{parameter_one.to_asciimath})"
17
+ end
18
+
19
+ def to_latex
20
+ first_value = parameter_one.to_latex if parameter_one
21
+ "\\mathcal{#{first_value}}"
22
+ end
23
+
24
+ def to_mathml_without_math_tag
25
+ Utility.update_nodes(
26
+ Utility.ox_element(
27
+ "mstyle",
28
+ attributes: { mathvariant: "script" },
29
+ ),
30
+ [parameter_one.to_mathml_without_math_tag],
31
+ )
32
+ end
14
33
  end
15
34
  end
16
35
  end
@@ -7,17 +7,30 @@ module Plurimath
7
7
  module Function
8
8
  class FontStyle < BinaryFunction
9
9
  def to_asciimath
10
- "#{parameter_two}(#{parameter_one.to_asciimath})"
10
+ parameter_one&.to_asciimath
11
11
  end
12
12
 
13
13
  def to_mathml_without_math_tag
14
- first_value = parameter_one.to_mathml_without_math_tag
15
- "<mstyle mathvariant='#{parameter_two}'>#{first_value}</mstyle>"
14
+ first_value = parameter_one&.to_mathml_without_math_tag
15
+ Utility.update_nodes(
16
+ Utility.ox_element(
17
+ "mstyle",
18
+ attributes: { mathvariant: parameter_two },
19
+ ),
20
+ [first_value],
21
+ )
22
+ end
23
+
24
+ def to_omml_without_math_tag
25
+ parameter_one&.to_omml_without_math_tag
26
+ end
27
+
28
+ def to_html
29
+ parameter_one&.to_html
16
30
  end
17
31
 
18
32
  def to_latex
19
- first_value = parameter_one.to_latex if parameter_one
20
- "\\#{parameter_two}{#{first_value}}"
33
+ parameter_one&.to_latex
21
34
  end
22
35
  end
23
36
  end
@@ -6,10 +6,23 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Frac < BinaryFunction
9
+ def to_asciimath
10
+ first_value = "(#{parameter_one&.to_asciimath})" if parameter_one
11
+ second_value = "(#{parameter_two&.to_asciimath})" if parameter_two
12
+ "frac#{first_value}#{second_value}"
13
+ end
14
+
9
15
  def to_mathml_without_math_tag
10
- first_value = parameter_one&.to_mathml_without_math_tag
11
- two_value = parameter_two&.to_mathml_without_math_tag
12
- "<mfrac>#{first_value}#{two_value}</mfrac>"
16
+ frac_tag = Utility.ox_element("mfrac")
17
+ first_value = parameter_one&.to_mathml_without_math_tag
18
+ second_value = parameter_two&.to_mathml_without_math_tag
19
+ Utility.update_nodes(
20
+ frac_tag,
21
+ [
22
+ first_value,
23
+ second_value,
24
+ ].flatten,
25
+ )
13
26
  end
14
27
 
15
28
  def to_latex
@@ -17,6 +30,23 @@ module Plurimath
17
30
  two_value = parameter_two&.to_latex
18
31
  "\\frac{#{first_value}}{#{two_value}}"
19
32
  end
33
+
34
+ def to_omml_without_math_tag
35
+ f_element = Utility.ox_element("f", namespace: "m")
36
+ fpr_element = Utility.ox_element("fPr", namespace: "m")
37
+ num_element = Utility.ox_element("num", namespace: "m")
38
+ num_element << parameter_one.to_omml_without_math_tag if parameter_one
39
+ den_element = Utility.ox_element("den", namespace: "m")
40
+ den_element << parameter_two.to_omml_without_math_tag if parameter_two
41
+ Utility.update_nodes(
42
+ f_element,
43
+ [
44
+ fpr_element << Utility.pr_element("ctrl", true, namespace: "m"),
45
+ num_element,
46
+ den_element,
47
+ ],
48
+ )
49
+ end
20
50
  end
21
51
  end
22
52
  end
@@ -6,6 +6,13 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class G < UnaryFunction
9
+ def to_asciimath
10
+ "g#{parameter_one&.to_asciimath}"
11
+ end
12
+
13
+ def to_latex
14
+ "g#{parameter_one&.to_latex}"
15
+ end
9
16
  end
10
17
  end
11
18
  end
@@ -6,6 +6,18 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Hat < UnaryFunction
9
+ def to_mathml_without_math_tag
10
+ mover_tag = Utility.ox_element("mover")
11
+ first_value = parameter_one&.to_mathml_without_math_tag
12
+ second_value = (Utility.ox_element("mo") << "^")
13
+ Utility.update_nodes(
14
+ mover_tag,
15
+ [
16
+ first_value,
17
+ second_value,
18
+ ],
19
+ )
20
+ end
9
21
  end
10
22
  end
11
23
  end
@@ -11,6 +11,27 @@ module Plurimath
11
11
  second_value = "^{#{parameter_two.to_latex}}" if parameter_two
12
12
  "\\#{class_name}#{first_value}#{second_value}"
13
13
  end
14
+
15
+ def to_mathml_without_math_tag
16
+ first_value = Utility.ox_element("mo") << class_name
17
+ if parameter_one || parameter_two
18
+ value_array = [first_value]
19
+ value_array << parameter_one&.to_mathml_without_math_tag
20
+ value_array << parameter_two&.to_mathml_without_math_tag
21
+ tag_name = if parameter_two && parameter_one
22
+ "underover"
23
+ else
24
+ parameter_one ? "under" : "over"
25
+ end
26
+ munderover_tag = Utility.ox_element("m#{tag_name}")
27
+ Utility.update_nodes(
28
+ munderover_tag,
29
+ value_array,
30
+ )
31
+ else
32
+ first_value
33
+ end
34
+ end
14
35
  end
15
36
  end
16
37
  end
@@ -7,10 +7,31 @@ module Plurimath
7
7
  module Function
8
8
  class Int < BinaryFunction
9
9
  def to_asciimath
10
- first_value = "_(#{parameter_one.to_asciimath})" if parameter_one
11
- second_value = "^(#{parameter_two.to_asciimath})" if parameter_two
10
+ first_value = "_#{wrapped(parameter_one)}" if parameter_one
11
+ second_value = "^#{wrapped(parameter_two)}" if parameter_two
12
12
  "int#{first_value}#{second_value}"
13
13
  end
14
+
15
+ def to_latex
16
+ first_value = "_#{latex_wrapped(parameter_one)}" if parameter_one
17
+ second_value = "^#{latex_wrapped(parameter_two)}" if parameter_two
18
+ "\\#{class_name}#{first_value}#{second_value}"
19
+ end
20
+
21
+ def to_mathml_without_math_tag
22
+ mrow_tag = Utility.ox_element("msubsup")
23
+ mo_tag = Utility.ox_element("mo") << invert_unicode_symbols.to_s
24
+ first_value = parameter_one&.to_mathml_without_math_tag if parameter_one
25
+ second_value = parameter_two&.to_mathml_without_math_tag if parameter_two
26
+ Utility.update_nodes(
27
+ mrow_tag,
28
+ [
29
+ mo_tag,
30
+ first_value,
31
+ second_value,
32
+ ],
33
+ )
34
+ end
14
35
  end
15
36
  end
16
37
  end
@@ -10,9 +10,33 @@ module Plurimath
10
10
  "left#{parameter_one}"
11
11
  end
12
12
 
13
+ def to_mathml_without_math_tag
14
+ mo = Utility.ox_element("mo")
15
+ mo << left_paren if parameter_one
16
+ mo
17
+ end
18
+
19
+ def to_omml_without_math_tag
20
+ mt = Utility.ox_element("m:t")
21
+ mt << parameter_one if parameter_one
22
+ mt
23
+ end
24
+
25
+ def to_html
26
+ "<i>#{parameter_one}</i>"
27
+ end
28
+
13
29
  def to_latex
14
30
  prefix = "\\" if parameter_one == "{"
15
- "\\left#{prefix}#{parameter_one}"
31
+ "\\left #{prefix}#{parameter_one}"
32
+ end
33
+
34
+ protected
35
+
36
+ def left_paren
37
+ return "{" if parameter_one == "\\{"
38
+
39
+ parameter_one
16
40
  end
17
41
  end
18
42
  end
@@ -7,8 +7,8 @@ module Plurimath
7
7
  module Function
8
8
  class Lim < BinaryFunction
9
9
  def to_asciimath
10
- first_value = "_(#{parameter_one.to_asciimath})" if parameter_one
11
- second_value = "^(#{parameter_two.to_asciimath})" if parameter_two
10
+ first_value = "_#{wrapped(parameter_one)}" if parameter_one
11
+ second_value = "^#{wrapped(parameter_two)}" if parameter_two
12
12
  "lim#{first_value}#{second_value}"
13
13
  end
14
14
 
@@ -17,6 +17,44 @@ module Plurimath
17
17
  second_value = "^{#{parameter_two.to_latex}}" if parameter_two
18
18
  "\\#{class_name}#{first_value}#{second_value}"
19
19
  end
20
+
21
+ def to_mathml_without_math_tag
22
+ first_value = (Utility.ox_element("mo") << "lim")
23
+ if parameter_one || parameter_two
24
+ value_array = [first_value]
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,
36
+ )
37
+ else
38
+ first_value
39
+ end
40
+ end
41
+
42
+ def to_omml_without_math_tag
43
+ limupp = Utility.ox_element("limUpp", namespace: "m")
44
+ limpr = Utility.ox_element("limUppPr", namespace: "m")
45
+ limpr << Utility.pr_element("ctrl", namespace: "m")
46
+ e_tag = Utility.ox_element("e", namespace: "m")
47
+ e_tag << parameter_one&.to_omml_without_math_tag
48
+ lim = Utility.ox_element("lim", namespace: "m")
49
+ lim << parameter_two&.to_omml_without_math_tag if parameter_two
50
+ Utility.update_nodes(
51
+ limupp,
52
+ [
53
+ e_tag,
54
+ lim,
55
+ ],
56
+ )
57
+ end
20
58
  end
21
59
  end
22
60
  end
@@ -6,6 +6,15 @@ module Plurimath
6
6
  module Math
7
7
  module Function
8
8
  class Limits < TernaryFunction
9
+ def to_mathml_without_math_tag
10
+ underover = Utility.ox_element("munderover")
11
+ value_array = []
12
+ value_array << parameter_one&.to_mathml_without_math_tag
13
+ value_array << parameter_two&.to_mathml_without_math_tag
14
+ value_array << parameter_three&.to_mathml_without_math_tag
15
+ Utility.update_nodes(underover, value_array)
16
+ end
17
+
9
18
  def to_latex
10
19
  first_value = parameter_one&.to_latex
11
20
  second_value = "{#{parameter_two.to_latex}}" if parameter_two
@@ -7,14 +7,14 @@ module Plurimath
7
7
  module Function
8
8
  class Log < BinaryFunction
9
9
  def to_asciimath
10
- first_value = "_(#{parameter_one.to_asciimath})" if parameter_one
11
- second_value = "^(#{parameter_two.to_asciimath})" if parameter_two
10
+ first_value = "_#{wrapped(parameter_one)}" if parameter_one
11
+ second_value = "^#{wrapped(parameter_two)}" if parameter_two
12
12
  "log#{first_value}#{second_value}"
13
13
  end
14
14
 
15
15
  def to_latex
16
- first_value = "_{#{parameter_one.to_latex}}" if parameter_one
17
- second_value = "^{#{parameter_two.to_latex}}" if parameter_two
16
+ first_value = "_#{latex_wrapped(parameter_one)}" if parameter_one
17
+ second_value = "^#{latex_wrapped(parameter_two)}" if parameter_two
18
18
  "\\log#{first_value}#{second_value}"
19
19
  end
20
20
 
@@ -23,6 +23,57 @@ module Plurimath
23
23
  second_value = "<sup>#{parameter_two.to_html}</sup>" if parameter_two
24
24
  "<i>log</i>#{first_value}#{second_value}"
25
25
  end
26
+
27
+ def to_omml_without_math_tag
28
+ func = Utility.ox_element("func", namespace: "m")
29
+ funcpr = Utility.ox_element("funcPr", namespace: "m")
30
+ funcpr << Utility.pr_element("ctrl", true, namespace: "m")
31
+ fname = Utility.ox_element("fName", namespace: "m")
32
+ mr = Utility.ox_element("r", namespace: "m")
33
+ rpr = Utility.rpr_element
34
+ mt = Utility.ox_element("t", namespace: "m") << class_name
35
+ fname << Utility.update_nodes(mr, [rpr, mt])
36
+ log_values = [first_value, second_value].flatten.compact
37
+ Utility.update_nodes(
38
+ func,
39
+ [
40
+ funcpr,
41
+ fname,
42
+ ] + log_values,
43
+ )
44
+ end
45
+
46
+ def to_mathml_without_math_tag
47
+ subsup_tag = Utility.ox_element("msubsup")
48
+ first_value = (Utility.ox_element("mi") << "log")
49
+ if parameter_one || parameter_two
50
+ new_arr = [first_value]
51
+ new_arr << parameter_one&.to_mathml_without_math_tag
52
+ new_arr << parameter_two&.to_mathml_without_math_tag
53
+ Utility.update_nodes(
54
+ subsup_tag,
55
+ new_arr,
56
+ )
57
+ else
58
+ first_value
59
+ end
60
+ end
61
+
62
+ protected
63
+
64
+ def first_value
65
+ return nil if parameter_one.nil?
66
+
67
+ first_value = parameter_one.to_omml_without_math_tag
68
+ Utility.ox_element("e", namespace: "m") << first_value
69
+ end
70
+
71
+ def second_value
72
+ return nil if parameter_two.nil?
73
+
74
+ second_value = parameter_two.to_omml_without_math_tag
75
+ Utility.ox_element("e", namespace: "m") << second_value
76
+ end
26
77
  end
27
78
  end
28
79
  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 Longdiv < UnaryFunction
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "unary_function"
4
+ module Plurimath
5
+ module Math
6
+ module Function
7
+ class Mbox < UnaryFunction
8
+ def to_mathml_without_math_tag
9
+ text = Utility.ox_element("mtext")
10
+ text << (parameter_one.to_mathml_without_math_tag) if parameter_one
11
+ text
12
+ end
13
+
14
+ def to_latex
15
+ first_value = parameter_one&.to_latex
16
+ "\\mbox{#{first_value}}"
17
+ end
18
+
19
+ def to_html
20
+ parameter_one&.to_html
21
+ end
22
+
23
+ def to_omml_without_math_tag
24
+ text = Utility.ox_element("t", namespace: "m")
25
+ text << parameter_one.to_omml_without_math_tag if parameter_one
26
+ text
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "binary_function"
4
+
5
+ module Plurimath
6
+ module Math
7
+ module Function
8
+ class Menclose < BinaryFunction
9
+ def to_asciimath
10
+ parameter_two&.to_asciimath
11
+ end
12
+
13
+ def to_mathml_without_math_tag
14
+ attributes = { notation: parameter_one }
15
+ menclose = Utility.ox_element("menclose", attributes: attributes)
16
+ menclose << parameter_two.to_mathml_without_math_tag if parameter_two
17
+ menclose
18
+ end
19
+
20
+ def to_latex
21
+ parameter_two&.to_latex
22
+ end
23
+
24
+ def to_html
25
+ second_value = parameter_two&.to_html
26
+ "<menclose notation=\"#{parameter_one}\">#{second_value}</menclose>"
27
+ end
28
+
29
+ def to_omml_without_math_tag
30
+ borderbox = Utility.ox_element("borderBox", namespace: "m")
31
+ borderpr = Utility.ox_element("borderBoxPr", namespace: "m")
32
+ borderpr << Utility.pr_element("ctrl", true, namespace: "m")
33
+ me = Utility.ox_element("e", namespace: "m")
34
+ me << parameter_two.to_omml_without_math_tag if parameter_two
35
+ Utility.update_nodes(
36
+ borderbox,
37
+ [
38
+ borderpr,
39
+ me,
40
+ ],
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "binary_function"
4
+
5
+ module Plurimath
6
+ module Math
7
+ module Function
8
+ class Merror < BinaryFunction
9
+ end
10
+ end
11
+ end
12
+ end
@@ -7,15 +7,30 @@ module Plurimath
7
7
  module Function
8
8
  class Mod < BinaryFunction
9
9
  def to_asciimath
10
- first_value = "(#{parameter_one.to_asciimath})" if parameter_one
11
- second_value = "(#{parameter_two.to_asciimath})" if parameter_two
12
- "#{first_value}mod#{second_value}"
10
+ first_value = parameter_one&.to_asciimath
11
+ second_value = parameter_two&.to_asciimath
12
+ "#{first_value} mod #{second_value}"
13
+ end
14
+
15
+ def to_mathml_without_math_tag
16
+ mrow_tag = Utility.ox_element("mrow")
17
+ mo_tag = Utility.ox_element("mi") << "mod"
18
+ first_value = parameter_one&.to_mathml_without_math_tag if parameter_one
19
+ second_value = parameter_two&.to_mathml_without_math_tag if parameter_two
20
+ Utility.update_nodes(
21
+ mrow_tag,
22
+ [
23
+ first_value,
24
+ mo_tag,
25
+ second_value,
26
+ ],
27
+ )
13
28
  end
14
29
 
15
30
  def to_latex
16
31
  first_value = "{#{parameter_one.to_latex}}" if parameter_one
17
32
  second_value = "{#{parameter_two.to_latex}}" if parameter_two
18
- "#{first_value}\\pmod#{second_value}"
33
+ "#{first_value} \\mod #{second_value}"
19
34
  end
20
35
 
21
36
  def to_html