plurimath 0.6.0 → 0.7.1

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/lib/plurimath/asciimath/parse.rb +3 -2
  4. data/lib/plurimath/asciimath/transform.rb +32 -5
  5. data/lib/plurimath/latex/constants.rb +2 -1
  6. data/lib/plurimath/latex/transform.rb +9 -13
  7. data/lib/plurimath/math/core.rb +134 -20
  8. data/lib/plurimath/math/formula.rb +88 -18
  9. data/lib/plurimath/math/function/abs.rb +28 -15
  10. data/lib/plurimath/math/function/bar.rb +5 -0
  11. data/lib/plurimath/math/function/base.rb +14 -0
  12. data/lib/plurimath/math/function/binary_function.rb +2 -8
  13. data/lib/plurimath/math/function/ceil.rb +24 -9
  14. data/lib/plurimath/math/function/ddot.rb +6 -1
  15. data/lib/plurimath/math/function/deg.rb +4 -1
  16. data/lib/plurimath/math/function/det.rb +4 -1
  17. data/lib/plurimath/math/function/dim.rb +4 -1
  18. data/lib/plurimath/math/function/dot.rb +5 -0
  19. data/lib/plurimath/math/function/exp.rb +4 -1
  20. data/lib/plurimath/math/function/fenced.rb +25 -16
  21. data/lib/plurimath/math/function/floor.rb +23 -13
  22. data/lib/plurimath/math/function/font_style.rb +18 -8
  23. data/lib/plurimath/math/function/frac.rb +32 -18
  24. data/lib/plurimath/math/function/gcd.rb +4 -1
  25. data/lib/plurimath/math/function/glb.rb +8 -1
  26. data/lib/plurimath/math/function/hat.rb +16 -5
  27. data/lib/plurimath/math/function/hom.rb +4 -1
  28. data/lib/plurimath/math/function/inf.rb +16 -0
  29. data/lib/plurimath/math/function/int.rb +28 -9
  30. data/lib/plurimath/math/function/ker.rb +4 -1
  31. data/lib/plurimath/math/function/lcm.rb +17 -1
  32. data/lib/plurimath/math/function/left.rb +1 -1
  33. data/lib/plurimath/math/function/lg.rb +4 -1
  34. data/lib/plurimath/math/function/lim.rb +10 -0
  35. data/lib/plurimath/math/function/liminf.rb +4 -1
  36. data/lib/plurimath/math/function/limits.rb +22 -9
  37. data/lib/plurimath/math/function/limsup.rb +4 -1
  38. data/lib/plurimath/math/function/linebreak.rb +95 -0
  39. data/lib/plurimath/math/function/ln.rb +4 -1
  40. data/lib/plurimath/math/function/log.rb +21 -12
  41. data/lib/plurimath/math/function/longdiv.rb +19 -0
  42. data/lib/plurimath/math/function/lub.rb +4 -1
  43. data/lib/plurimath/math/function/max.rb +4 -1
  44. data/lib/plurimath/math/function/mbox.rb +8 -7
  45. data/lib/plurimath/math/function/merror.rb +12 -3
  46. data/lib/plurimath/math/function/min.rb +4 -1
  47. data/lib/plurimath/math/function/mod.rb +42 -15
  48. data/lib/plurimath/math/function/msgroup.rb +4 -0
  49. data/lib/plurimath/math/function/msline.rb +10 -0
  50. data/lib/plurimath/math/function/multiscript.rb +20 -0
  51. data/lib/plurimath/math/function/nary.rb +39 -5
  52. data/lib/plurimath/math/function/norm.rb +24 -15
  53. data/lib/plurimath/math/function/obrace.rb +5 -0
  54. data/lib/plurimath/math/function/oint.rb +42 -20
  55. data/lib/plurimath/math/function/over.rb +23 -10
  56. data/lib/plurimath/math/function/overset.rb +13 -10
  57. data/lib/plurimath/math/function/phantom.rb +24 -6
  58. data/lib/plurimath/math/function/power.rb +13 -4
  59. data/lib/plurimath/math/function/power_base.rb +28 -6
  60. data/lib/plurimath/math/function/prod.rb +33 -14
  61. data/lib/plurimath/math/function/right.rb +1 -1
  62. data/lib/plurimath/math/function/rule.rb +1 -1
  63. data/lib/plurimath/math/function/scarries.rb +14 -0
  64. data/lib/plurimath/math/function/semantics.rb +9 -0
  65. data/lib/plurimath/math/function/sqrt.rb +5 -0
  66. data/lib/plurimath/math/function/stackrel.rb +8 -0
  67. data/lib/plurimath/math/function/substack.rb +12 -51
  68. data/lib/plurimath/math/function/sum.rb +43 -20
  69. data/lib/plurimath/math/function/sup.rb +11 -2
  70. data/lib/plurimath/math/function/table/array.rb +1 -1
  71. data/lib/plurimath/math/function/table/matrix.rb +4 -0
  72. data/lib/plurimath/math/function/table.rb +11 -3
  73. data/lib/plurimath/math/function/td.rb +14 -4
  74. data/lib/plurimath/math/function/ternary_function.rb +8 -10
  75. data/lib/plurimath/math/function/text.rb +1 -1
  76. data/lib/plurimath/math/function/tilde.rb +5 -0
  77. data/lib/plurimath/math/function/tr.rb +1 -1
  78. data/lib/plurimath/math/function/ubrace.rb +5 -0
  79. data/lib/plurimath/math/function/unary_function.rb +72 -26
  80. data/lib/plurimath/math/function/underover.rb +25 -8
  81. data/lib/plurimath/math/function/underset.rb +19 -9
  82. data/lib/plurimath/math/function/vec.rb +5 -0
  83. data/lib/plurimath/math/number.rb +3 -3
  84. data/lib/plurimath/math/symbol.rb +13 -5
  85. data/lib/plurimath/mathml/parser.rb +2 -0
  86. data/lib/plurimath/mathml/transform.rb +23 -15
  87. data/lib/plurimath/omml/transform.rb +22 -10
  88. data/lib/plurimath/unitsml.rb +2 -1
  89. data/lib/plurimath/utility.rb +29 -28
  90. data/lib/plurimath/version.rb +1 -1
  91. metadata +3 -3
  92. data/lib/plurimath/math/function/scarry.rb +0 -12
@@ -14,6 +14,10 @@ module Plurimath
14
14
  super
15
15
  end
16
16
 
17
+ def to_asciimath
18
+ "{:#{value.map(&:to_asciimath).join(", ")}:}"
19
+ end
20
+
17
21
  def to_latex
18
22
  "\\begin#{opening}#{latex_content}\\end#{matrix_class}"
19
23
  end
@@ -6,6 +6,8 @@ module Plurimath
6
6
  class Table < Core
7
7
  attr_accessor :value, :open_paren, :close_paren, :options
8
8
 
9
+ SIMPLE_TABLES = %w[array align split].freeze
10
+
9
11
  def initialize(value = nil,
10
12
  open_paren = nil,
11
13
  close_paren = nil,
@@ -25,6 +27,8 @@ module Plurimath
25
27
  end
26
28
 
27
29
  def to_asciimath
30
+ return parentheless_table if SIMPLE_TABLES.include?(class_name)
31
+
28
32
  parenthesis = Asciimath::Constants::TABLE_PARENTHESIS
29
33
  first_value = value.map(&:to_asciimath).join(", ")
30
34
  third_value = close_paren.is_a?(::Array) || close_paren.nil?
@@ -193,7 +197,7 @@ module Plurimath
193
197
  eqarrpr = Utility.ox_element("eqArrPr", namespace: "m")
194
198
  eqarrpr << Utility.pr_element("ctrl", true, namespace: "m")
195
199
  eqarr << eqarrpr
196
- tr_value = value.map { |obj| obj.to_omml_without_math_tag(display_style) }.flatten
200
+ tr_value = value.map { |object| object.to_omml_without_math_tag(display_style) }.flatten
197
201
  Utility.update_nodes(eqarr, tr_value.compact)
198
202
  [eqarr]
199
203
  end
@@ -202,7 +206,7 @@ module Plurimath
202
206
  count = { "m:val": value&.first&.parameter_one&.count }
203
207
  mcjc = { "m:val": "center" }
204
208
  mm = Utility.ox_element("m", namespace: "m")
205
- mpr = Utility.ox_element("mpr", namespace: "m")
209
+ mpr = Utility.ox_element("mPr", namespace: "m")
206
210
  mcs = Utility.ox_element("mcs", namespace: "m")
207
211
  mc = Utility.ox_element("mc", namespace: "m")
208
212
  mcpr = Utility.ox_element("mcPr", namespace: "m")
@@ -222,7 +226,7 @@ module Plurimath
222
226
  mcs << mc
223
227
  mpr << mcs
224
228
  mpr << ctrlpr
225
- mm_value = value&.map { |obj| obj.to_omml_without_math_tag(display_style) }
229
+ mm_value = value&.map { |object| object.to_omml_without_math_tag(display_style) }
226
230
  Utility.update_nodes(
227
231
  mm,
228
232
  mm_value.insert(0, mpr).flatten,
@@ -276,6 +280,10 @@ module Plurimath
276
280
 
277
281
  parenthesis
278
282
  end
283
+
284
+ def parentheless_table
285
+ "{:#{value.map(&:to_asciimath).join(", ")}:}"
286
+ end
279
287
  end
280
288
  end
281
289
  end
@@ -36,10 +36,7 @@ module Plurimath
36
36
  me = Utility.ox_element("e", namespace: "m")
37
37
  return [me] if parameter_one&.empty?
38
38
 
39
- Utility.update_nodes(
40
- me,
41
- Formula.new(parameter_one).omml_content(display_style),
42
- )
39
+ Utility.update_nodes(me, omml_content(display_style))
43
40
  [me]
44
41
  end
45
42
 
@@ -70,6 +67,19 @@ module Plurimath
70
67
  Formula.new(parameter_one).to_omml_math_zone(gsub_spacing(spacing, last), last, indent, display_style: display_style),
71
68
  ]
72
69
  end
70
+
71
+ def omml_content(display_style)
72
+ parameter_one&.map { |val| val.insert_t_tag(display_style) }
73
+ end
74
+
75
+ def line_breaking(obj)
76
+ sliced_value = result(Array(parameter_one))
77
+ return unless sliced_value.length > 1
78
+
79
+ sliced_result = sliced_value.first.last.omml_line_break(sliced_value)
80
+ table = Table.new(sliced_result.map { |res| Tr.new(Array(Td.new(Array(res)))) })
81
+ self.parameter_one = [table]
82
+ end
73
83
  end
74
84
  end
75
85
  end
@@ -4,7 +4,7 @@ module Plurimath
4
4
  module Math
5
5
  module Function
6
6
  class TernaryFunction < Core
7
- attr_accessor :parameter_one, :parameter_two, :parameter_three
7
+ attr_accessor :parameter_one, :parameter_two, :parameter_three, :hide_function_name
8
8
 
9
9
  def initialize(parameter_one = nil,
10
10
  parameter_two = nil,
@@ -12,7 +12,7 @@ module Plurimath
12
12
  @parameter_one = parameter_one
13
13
  @parameter_two = parameter_two
14
14
  @parameter_three = parameter_three
15
- Utility.validate_left_right([parameter_one, parameter_two, parameter_three])
15
+ Utility.validate_left_right(variables.map { |var| get(var) })
16
16
  end
17
17
 
18
18
  def to_asciimath
@@ -30,10 +30,12 @@ module Plurimath
30
30
  end
31
31
 
32
32
  def to_mathml_without_math_tag
33
- value_arr = [parameter_one&.to_mathml_without_math_tag]
34
- value_arr << parameter_two&.to_mathml_without_math_tag
35
- value_arr << parameter_three&.to_mathml_without_math_tag
36
- class_tag = Utility.ox_element("m#{class_name}")
33
+ value_arr = [
34
+ validate_mathml_fields(parameter_one),
35
+ validate_mathml_fields(parameter_two),
36
+ validate_mathml_fields(parameter_three),
37
+ ]
38
+ class_tag = ox_element("m#{class_name}")
37
39
  Utility.update_nodes(class_tag, value_arr)
38
40
  end
39
41
 
@@ -99,10 +101,6 @@ module Plurimath
99
101
  new_arr
100
102
  end
101
103
 
102
- def any_value_exist?
103
- !(parameter_one.nil? || parameter_two.nil? || parameter_three.nil?)
104
- end
105
-
106
104
  protected
107
105
 
108
106
  def latex_wrapped(field)
@@ -29,7 +29,7 @@ module Plurimath
29
29
  parse_text("html") || parameter_one
30
30
  end
31
31
 
32
- def to_omml_without_math_tag(_display_style)
32
+ def to_omml_without_math_tag(_)
33
33
  text = Utility.ox_element("t", namespace: "m")
34
34
  text << (parse_text("omml") || parameter_one)
35
35
  [text]
@@ -36,6 +36,11 @@ module Plurimath
36
36
  false
37
37
  end
38
38
 
39
+ def line_breaking(obj)
40
+ parameter_one&.line_breaking(obj)
41
+ obj.update(Utility.filter_values(obj.value)) if obj.value_exist?
42
+ end
43
+
39
44
  protected
40
45
 
41
46
  def acc_tag(display_style)
@@ -32,7 +32,7 @@ module Plurimath
32
32
  end
33
33
 
34
34
  def to_omml_without_math_tag(display_style)
35
- omml_content = parameter_one&.map { |obj| obj.to_omml_without_math_tag(display_style) }
35
+ omml_content = parameter_one&.map { |object| object.to_omml_without_math_tag(display_style) }
36
36
  if parameter_one.count.eql?(1)
37
37
  omml_content
38
38
  else
@@ -56,6 +56,11 @@ module Plurimath
56
56
  symbol = Symbol.new("⏟")
57
57
  Underset.new(parameter_one, symbol).to_omml_without_math_tag(true)
58
58
  end
59
+
60
+ def line_breaking(obj)
61
+ parameter_one&.line_breaking(obj)
62
+ obj.update(Utility.filter_values(obj.value)) if obj.value_exist?
63
+ end
59
64
  end
60
65
 
61
66
  Underbrace = Ubrace
@@ -4,12 +4,13 @@ module Plurimath
4
4
  module Math
5
5
  module Function
6
6
  class UnaryFunction < Core
7
- attr_accessor :parameter_one
7
+ attr_accessor :parameter_one, :hide_function_name
8
8
 
9
9
  def initialize(parameter_one = nil)
10
10
  parameter_one = parameter_one.to_s if parameter_one.is_a?(Parslet::Slice)
11
11
  @parameter_one = parameter_one
12
- Utility.validate_left_right([parameter_one])
12
+ method(:post_initialize).call if methods.include?(:post_initialize)
13
+ Utility.validate_left_right(variables.map { |var| get(var) })
13
14
  end
14
15
 
15
16
  def ==(object)
@@ -27,12 +28,12 @@ module Plurimath
27
28
  end
28
29
 
29
30
  def to_mathml_without_math_tag
30
- row_tag = Utility.ox_element("mrow")
31
31
  tag_name = Utility::UNARY_CLASSES.include?(class_name) ? "mi" : "mo"
32
- new_arr = [Utility.ox_element(tag_name) << class_name]
32
+ new_arr = []
33
+ new_arr << (ox_element(tag_name) << class_name) unless hide_function_name
33
34
  if parameter_one
34
35
  new_arr += mathml_value
35
- Utility.update_nodes(row_tag, new_arr)
36
+ Utility.update_nodes(ox_element("mrow"), new_arr)
36
37
  else
37
38
  new_arr.first
38
39
  end
@@ -54,25 +55,13 @@ module Plurimath
54
55
  def to_omml_without_math_tag(display_style)
55
56
  return r_element(class_name, rpr_tag: false) unless parameter_one
56
57
 
57
- func = Utility.ox_element("func", namespace: "m")
58
- funcpr = Utility.ox_element("funcPr", namespace: "m")
59
- funcpr << Utility.pr_element("ctrl", true, namespace: "m")
60
- fname = Utility.ox_element("fName", namespace: "m")
61
- mr = Utility.ox_element("r", namespace: "m")
62
- rpr = Utility.rpr_element
63
- mt = Utility.ox_element("t", namespace: "m") << class_name
64
- fname << Utility.update_nodes(mr, [rpr, mt])
65
- me = Utility.ox_element("e", namespace: "m")
66
- Utility.update_nodes(me, omml_value(display_style)) if parameter_one
67
- Utility.update_nodes(
68
- func,
69
- [
70
- funcpr,
71
- fname,
72
- me,
73
- ],
74
- )
75
- [func]
58
+ if @hide_function_name
59
+ value = omml_value(display_style)
60
+ else
61
+ func = Utility.ox_element("func", namespace: "m")
62
+ value = Utility.update_nodes(func, function_values(display_style))
63
+ end
64
+ Array(value)
76
65
  end
77
66
 
78
67
  def to_asciimath_math_zone(spacing, last = false, _)
@@ -115,6 +104,39 @@ module Plurimath
115
104
  new_arr
116
105
  end
117
106
 
107
+ def custom_array_line_breaking(obj)
108
+ parameter_value = result(parameter_one)
109
+ if parameter_value.size > 1
110
+ breaked_result = parameter_value.first.last.omml_line_break(parameter_value)
111
+ update(Array(breaked_result.shift))
112
+ obj.update(self.class.new(breaked_result.flatten))
113
+ reprocess_parameter_one(obj)
114
+ return
115
+ end
116
+
117
+ parameter_one.each.with_index(1) do |object, index|
118
+ object.line_breaking(obj)
119
+ break obj.insert(parameter_one.slice!(index..parameter_one.size)) if obj.value_exist?
120
+ end
121
+ end
122
+
123
+ def update(value)
124
+ self.parameter_one = value
125
+ end
126
+
127
+ def reprocess_parameter_one(obj)
128
+ new_obj = Formula.new([])
129
+ self.line_breaking(new_obj)
130
+ if new_obj.value_exist?
131
+ obj.value.insert(0, Linebreak.new)
132
+ obj.value.insert(0, self.class.new(new_obj.value))
133
+ end
134
+ end
135
+
136
+ def value_nil?
137
+ !parameter_one
138
+ end
139
+
118
140
  protected
119
141
 
120
142
  def asciimath_value
@@ -147,15 +169,39 @@ module Plurimath
147
169
 
148
170
  def omml_value(display_style)
149
171
  if parameter_one.is_a?(Array)
150
- return parameter_one&.compact&.map { |obj| obj.insert_t_tag(display_style) }
172
+ return parameter_one&.compact&.map { |object| formula_to_nodes(object, display_style) }
151
173
  end
152
174
 
153
- Array(parameter_one&.insert_t_tag(display_style))
175
+ Array(formula_to_nodes(parameter_one, display_style))
176
+ end
177
+
178
+ def formula_to_nodes(object, display_style)
179
+ object&.insert_t_tag(display_style)
154
180
  end
155
181
 
156
182
  def latex_paren
157
183
  Latex::Constants::LEFT_RIGHT_PARENTHESIS.invert[parameter_one] || '.'
158
184
  end
185
+
186
+ def exist?
187
+ !(parameter_one.is_a?(Array) ? parameter_one.empty? : parameter_one.nil?)
188
+ end
189
+
190
+ def function_values(display_style)
191
+ funcpr = Utility.ox_element("funcPr", namespace: "m")
192
+ funcpr << Utility.pr_element("ctrl", true, namespace: "m")
193
+ fname = Utility.ox_element("fName", namespace: "m")
194
+ fname << Utility.update_nodes(
195
+ Utility.ox_element("r", namespace: "m"),
196
+ [
197
+ Utility.rpr_element,
198
+ (Utility.ox_element("t", namespace: "m") << class_name),
199
+ ],
200
+ )
201
+ me = Utility.ox_element("e", namespace: "m")
202
+ Utility.update_nodes(me, omml_value(display_style)) if parameter_one
203
+ [funcpr, fname, me]
204
+ end
159
205
  end
160
206
  end
161
207
  end
@@ -28,16 +28,12 @@ module Plurimath
28
28
  end
29
29
 
30
30
  def to_mathml_without_math_tag
31
- first_value = parameter_one&.to_mathml_without_math_tag
32
- second_value = parameter_two&.to_mathml_without_math_tag
33
- third_value = parameter_three&.to_mathml_without_math_tag
34
- class_tag = Utility.ox_element("m#{class_name}")
35
31
  Utility.update_nodes(
36
- class_tag,
32
+ ox_element("m#{class_name}"),
37
33
  [
38
- first_value,
39
- second_value,
40
- third_value,
34
+ validate_mathml_fields(parameter_one),
35
+ validate_mathml_fields(parameter_two),
36
+ validate_mathml_fields(parameter_three),
41
37
  ],
42
38
  )
43
39
  end
@@ -50,6 +46,27 @@ module Plurimath
50
46
 
51
47
  underover(display_style)
52
48
  end
49
+
50
+ def line_breaking(obj)
51
+ parameter_one&.line_breaking(obj)
52
+ if obj.value_exist?
53
+ obj.update(
54
+ Underover.new(Utility.filter_values(obj.value), parameter_two, parameter_three)
55
+ )
56
+ self.parameter_two = nil
57
+ self.parameter_three = nil
58
+ return
59
+ end
60
+
61
+ parameter_two.line_breaking(obj)
62
+ if obj.value_exist?
63
+ obj.update(
64
+ Underover.new(nil, Utility.filter_values(obj.value), parameter_three)
65
+ )
66
+ self.parameter_two = nil
67
+ self.parameter_three = nil
68
+ end
69
+ end
53
70
  end
54
71
  end
55
72
  end
@@ -13,15 +13,11 @@ module Plurimath
13
13
  }.freeze
14
14
 
15
15
  def to_mathml_without_math_tag
16
- first_value = parameter_one&.to_mathml_without_math_tag
17
- second_value = parameter_two&.to_mathml_without_math_tag
18
- Utility.update_nodes(
19
- Utility.ox_element("munder"),
20
- [
21
- second_value,
22
- first_value,
23
- ],
24
- )
16
+ value_array = [
17
+ validate_mathml_fields(parameter_two),
18
+ validate_mathml_fields(parameter_one),
19
+ ]
20
+ Utility.update_nodes(ox_element("munder"), value_array)
25
21
  end
26
22
 
27
23
  def to_omml_without_math_tag(display_style)
@@ -43,6 +39,20 @@ module Plurimath
43
39
  )
44
40
  [limlow]
45
41
  end
42
+
43
+ def line_breaking(obj)
44
+ parameter_one&.line_breaking(obj)
45
+ if obj.value_exist?
46
+ obj.update(self.class.new(Utility.filter_values(obj.value), parameter_two))
47
+ self.parameter_two = nil
48
+ return
49
+ end
50
+
51
+ parameter_two&.line_breaking(obj)
52
+ if obj.value_exist?
53
+ obj.update(self.class.new(nil, Utility.filter_values(obj.value)))
54
+ end
55
+ end
46
56
  end
47
57
  end
48
58
  end
@@ -77,6 +77,11 @@ module Plurimath
77
77
  new_arr
78
78
  end
79
79
 
80
+ def line_breaking(obj)
81
+ parameter_one&.line_breaking(obj)
82
+ obj.update(Utility.filter_values(obj.value)) if obj.value_exist?
83
+ end
84
+
80
85
  protected
81
86
 
82
87
  def acc_tag(display_style)
@@ -29,17 +29,17 @@ module Plurimath
29
29
  value
30
30
  end
31
31
 
32
- def to_omml_without_math_tag(_display_style)
32
+ def to_omml_without_math_tag(_)
33
33
  [t_tag]
34
34
  end
35
35
 
36
- def insert_t_tag(_display_style)
36
+ def insert_t_tag(_)
37
37
  [
38
38
  (Utility.ox_element("r", namespace: "m") << t_tag),
39
39
  ]
40
40
  end
41
41
 
42
- def font_style_t_tag(_display_style)
42
+ def font_style_t_tag(_)
43
43
  t_tag
44
44
  end
45
45
 
@@ -5,7 +5,7 @@ module Plurimath
5
5
  class Symbol < Core
6
6
  attr_accessor :value
7
7
 
8
- def initialize(sym)
8
+ def initialize(sym = nil)
9
9
  @value = sym.is_a?(Parslet::Slice) ? sym.to_s : sym
10
10
  end
11
11
 
@@ -56,11 +56,11 @@ module Plurimath
56
56
  value
57
57
  end
58
58
 
59
- def to_omml_without_math_tag(_display_style)
59
+ def to_omml_without_math_tag(_, _)
60
60
  value
61
61
  end
62
62
 
63
- def insert_t_tag(_display_style)
63
+ def insert_t_tag(_)
64
64
  [(Utility.ox_element("r", namespace: "m") << t_tag)]
65
65
  end
66
66
 
@@ -76,7 +76,7 @@ module Plurimath
76
76
  "subSup"
77
77
  end
78
78
 
79
- def font_style_t_tag(_display_style)
79
+ def font_style_t_tag(_)
80
80
  t_tag
81
81
  end
82
82
 
@@ -88,7 +88,7 @@ module Plurimath
88
88
  false
89
89
  end
90
90
 
91
- def omml_nodes(display_style)
91
+ def omml_nodes(_)
92
92
  Array(t_tag)
93
93
  end
94
94
 
@@ -96,6 +96,14 @@ module Plurimath
96
96
  Utility.ox_element("t", namespace: "m") << value
97
97
  end
98
98
 
99
+ def separate_table
100
+ ["&", "\\\\"].include?(value)
101
+ end
102
+
103
+ def linebreak
104
+ value == "\\\\"
105
+ end
106
+
99
107
  private
100
108
 
101
109
  def operator?(unicode)
@@ -8,9 +8,11 @@ module Plurimath
8
8
  attr_accessor :text
9
9
 
10
10
  SUPPORTED_ATTRS = %w[
11
+ linebreakstyle
11
12
  columnlines
12
13
  mathvariant
13
14
  accentunder
15
+ linebreak
14
16
  mathcolor
15
17
  notation
16
18
  accent
@@ -9,6 +9,7 @@ module Plurimath
9
9
  rule(mtd: sequence(:mtd)) { Math::Function::Td.new(mtd) }
10
10
  rule(mtr: sequence(:mtr)) { Math::Function::Tr.new(mtr) }
11
11
  rule(none: sequence(:none)) { nil }
12
+ rule(mspace: simple(:space)) { nil }
12
13
  rule(notation: simple(:att)) { Math::Function::Menclose.new(att) }
13
14
  rule(mtable: simple(:table)) { table }
14
15
  rule(msqrt: sequence(:sqrt)) { Math::Function::Sqrt.new(sqrt.first) }
@@ -36,7 +37,9 @@ module Plurimath
36
37
  end
37
38
 
38
39
  rule(mphantom: sequence(:phantom)) do
39
- Math::Function::Phantom.new(phantom)
40
+ Math::Function::Phantom.new(
41
+ Utility.filter_values(phantom),
42
+ )
40
43
  end
41
44
 
42
45
  rule(mn: sequence(:mn)) do
@@ -316,11 +319,6 @@ module Plurimath
316
319
  end
317
320
  end
318
321
 
319
- rule(attributes: simple(:attrs),
320
- value: subtree(:value)) do
321
- Utility.join_attr_value(attrs, value&.flatten&.compact)
322
- end
323
-
324
322
  rule(semantics: subtree(:value)) do
325
323
  Math::Function::Semantics.new(
326
324
  value.shift,
@@ -328,17 +326,27 @@ module Plurimath
328
326
  )
329
327
  end
330
328
 
329
+ rule(attributes: simple(:attrs),
330
+ value: subtree(:value)) do
331
+ Utility.join_attr_value(attrs, value&.flatten&.compact)
332
+ end
333
+
331
334
  rule(attributes: subtree(:attrs),
332
335
  value: sequence(:value)) do
333
- approved_attrs = if attrs.is_a?(Hash)
334
- supported_attrs = %w[accentunder accent]
335
- attrs if attrs.keys.any? do |k|
336
- supported_attrs.include?(k.to_s)
337
- end
338
- else
339
- attrs
340
- end
341
- Utility.join_attr_value(approved_attrs, value&.flatten&.compact)
336
+ approved = if attrs.is_a?(Hash)
337
+ supported = %w[accentunder accent linebreak]
338
+ if attrs.keys.any? { |k| supported.include?(k.to_s) }
339
+ unicode_only = true if attrs.key?(:linebreak)
340
+ attrs
341
+ end
342
+ else
343
+ attrs
344
+ end
345
+ Utility.join_attr_value(
346
+ approved,
347
+ value&.flatten&.compact,
348
+ unicode_only: unicode_only,
349
+ )
342
350
  end
343
351
  end
344
352
  end
@@ -9,6 +9,7 @@ module Plurimath
9
9
  rule(i: sequence(:i)) { i }
10
10
  rule(e: sequence(:e)) { e.flatten.compact }
11
11
 
12
+ rule(br: sequence(:br)) { Math::Function::Linebreak.new }
12
13
  rule(val: simple(:val)) { val }
13
14
  rule(scr: simple(:scr)) { scr }
14
15
  rule(sty: simple(:sty)) { sty }
@@ -210,7 +211,7 @@ module Plurimath
210
211
  end
211
212
  if Utility.valid_class(subsup[0])
212
213
  Utility.get_class(
213
- subsup[0].extract_class_from_text,
214
+ subsup[0].extract_class_name_from_text,
214
215
  ).new(
215
216
  subsup[1],
216
217
  subsup[2],
@@ -256,20 +257,31 @@ module Plurimath
256
257
  rule(limUpp: subtree(:lim)) do
257
258
  lim_values = lim.flatten.compact
258
259
  first_value = lim_values[0]
259
- Math::Function::Overset.new(
260
- first_value,
261
- lim_values[1],
262
- )
260
+ if lim.last.is_unary? && lim.last.value_nil?
261
+ function_class = lim.pop
262
+ function_class.parameter_one = Utility.filter_values(lim.flatten.compact)
263
+ function_class
264
+ else
265
+ Math::Function::Overset.new(
266
+ first_value,
267
+ lim_values[1],
268
+ )
269
+ end
263
270
  end
264
271
 
265
272
  rule(limLow: subtree(:lim)) do
266
273
  second_value = Utility.filter_values(lim[2])
267
- unicode = Mathml::Constants::UNICODE_SYMBOLS.invert[second_value.class_name]
274
+ unicode = Mathml::Constants::UNICODE_SYMBOLS.invert[second_value&.class_name]
268
275
  second_value = unicode ? Math::Symbol.new(unicode.to_s) : second_value
269
- Math::Function::Underset.new(
270
- Utility.filter_values(lim[1]),
271
- second_value,
272
- )
276
+ if second_value.is_unary? && second_value.value_nil?
277
+ second_value.parameter_one = Utility.filter_values(lim[1])
278
+ second_value
279
+ else
280
+ Math::Function::Underset.new(
281
+ Utility.filter_values(lim[1]),
282
+ second_value,
283
+ )
284
+ end
273
285
  end
274
286
 
275
287
  rule(borderBox: subtree(:box)) do
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "unitsml"
3
4
  module Plurimath
4
5
  class Unitsml
5
6
  attr_accessor :text
@@ -9,7 +10,7 @@ module Plurimath
9
10
  end
10
11
 
11
12
  def to_formula
12
- # TODO: Will be implemented soon
13
+ ::Unitsml.parse(text).to_plurimath
13
14
  end
14
15
  end
15
16
  end