plurimath 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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 +10 -2
  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
@@ -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