plurimath 0.8.16 → 0.8.18

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/gen_docs.yml +10 -8
  3. data/Gemfile +1 -1
  4. data/README.adoc +4 -0
  5. data/Rakefile +55 -8
  6. data/intent_supported_classes.adoc +82 -0
  7. data/lib/plurimath/asciimath/parse.rb +1 -0
  8. data/lib/plurimath/asciimath/transform.rb +12 -0
  9. data/lib/plurimath/formatter/number_formatter.rb +6 -6
  10. data/lib/plurimath/formatter/numeric_formatter.rb +5 -2
  11. data/lib/plurimath/formatter/standard.rb +2 -0
  12. data/lib/plurimath/math/core.rb +65 -6
  13. data/lib/plurimath/math/formula/mrow.rb +193 -0
  14. data/lib/plurimath/math/formula/mstyle.rb +17 -0
  15. data/lib/plurimath/math/formula.rb +317 -7
  16. data/lib/plurimath/math/function/abs.rb +5 -1
  17. data/lib/plurimath/math/function/base.rb +4 -0
  18. data/lib/plurimath/math/function/color.rb +17 -4
  19. data/lib/plurimath/math/function/fenced.rb +238 -7
  20. data/lib/plurimath/math/function/frac.rb +12 -1
  21. data/lib/plurimath/math/function/inf.rb +5 -1
  22. data/lib/plurimath/math/function/int.rb +5 -1
  23. data/lib/plurimath/math/function/intent.rb +6 -2
  24. data/lib/plurimath/math/function/lim.rb +5 -1
  25. data/lib/plurimath/math/function/linebreak.rb +2 -2
  26. data/lib/plurimath/math/function/longdiv.rb +3 -0
  27. data/lib/plurimath/math/function/menclose.rb +3 -0
  28. data/lib/plurimath/math/function/merror.rb +5 -2
  29. data/lib/plurimath/math/function/mglyph.rb +27 -0
  30. data/lib/plurimath/math/function/mlabeledtr.rb +19 -0
  31. data/lib/plurimath/math/function/mpadded.rb +28 -1
  32. data/lib/plurimath/math/function/ms.rb +80 -0
  33. data/lib/plurimath/math/function/msgroup.rb +15 -0
  34. data/lib/plurimath/math/function/msline.rb +5 -2
  35. data/lib/plurimath/math/function/multiscript.rb +14 -0
  36. data/lib/plurimath/math/function/nary.rb +13 -1
  37. data/lib/plurimath/math/function/oint.rb +5 -1
  38. data/lib/plurimath/math/function/over.rb +3 -0
  39. data/lib/plurimath/math/function/overset.rb +11 -0
  40. data/lib/plurimath/math/function/phantom.rb +3 -0
  41. data/lib/plurimath/math/function/power.rb +3 -0
  42. data/lib/plurimath/math/function/power_base.rb +3 -0
  43. data/lib/plurimath/math/function/prod.rb +5 -1
  44. data/lib/plurimath/math/function/root.rb +3 -0
  45. data/lib/plurimath/math/function/scarries.rb +3 -0
  46. data/lib/plurimath/math/function/semantics.rb +14 -0
  47. data/lib/plurimath/math/function/sqrt.rb +3 -0
  48. data/lib/plurimath/math/function/stackrel.rb +3 -0
  49. data/lib/plurimath/math/function/sum.rb +5 -1
  50. data/lib/plurimath/math/function/table/array.rb +1 -1
  51. data/lib/plurimath/math/function/table/bmatrix.rb +1 -1
  52. data/lib/plurimath/math/function/table/cases.rb +2 -2
  53. data/lib/plurimath/math/function/table/eqarray.rb +2 -2
  54. data/lib/plurimath/math/function/table/pmatrix.rb +1 -1
  55. data/lib/plurimath/math/function/table/vmatrix.rb +1 -1
  56. data/lib/plurimath/math/function/table.rb +65 -0
  57. data/lib/plurimath/math/function/td.rb +4 -1
  58. data/lib/plurimath/math/function/text.rb +22 -2
  59. data/lib/plurimath/math/function/tr.rb +13 -0
  60. data/lib/plurimath/math/function/unary_function.rb +5 -1
  61. data/lib/plurimath/math/function/underover.rb +3 -0
  62. data/lib/plurimath/math/function/underset.rb +44 -0
  63. data/lib/plurimath/math/number.rb +10 -1
  64. data/lib/plurimath/math/symbols/bigwedge.rb +4 -0
  65. data/lib/plurimath/math/symbols/cap.rb +0 -4
  66. data/lib/plurimath/math/symbols/clockoint.rb +1 -1
  67. data/lib/plurimath/math/symbols/cntclockoint.rb +1 -1
  68. data/lib/plurimath/math/symbols/coprod.rb +1 -1
  69. data/lib/plurimath/math/symbols/dd.rb +4 -0
  70. data/lib/plurimath/math/symbols/dint.rb +4 -0
  71. data/lib/plurimath/math/symbols/duni.rb +4 -0
  72. data/lib/plurimath/math/symbols/gg.rb +4 -4
  73. data/lib/plurimath/math/symbols/ii.rb +4 -0
  74. data/lib/plurimath/math/symbols/iiiint.rb +1 -1
  75. data/lib/plurimath/math/symbols/iiint.rb +4 -0
  76. data/lib/plurimath/math/symbols/iint.rb +1 -1
  77. data/lib/plurimath/math/symbols/intclockwise.rb +1 -1
  78. data/lib/plurimath/math/symbols/intercal.rb +4 -0
  79. data/lib/plurimath/math/symbols/jj.rb +4 -0
  80. data/lib/plurimath/math/symbols/ll.rb +4 -4
  81. data/lib/plurimath/math/symbols/minus.rb +1 -1
  82. data/lib/plurimath/math/symbols/oiiint.rb +1 -1
  83. data/lib/plurimath/math/symbols/oiint.rb +1 -1
  84. data/lib/plurimath/math/symbols/oint.rb +1 -1
  85. data/lib/plurimath/math/symbols/symbol.rb +12 -4
  86. data/lib/plurimath/math/symbols/upcase_dd.rb +4 -0
  87. data/lib/plurimath/math.rb +2 -0
  88. data/lib/plurimath/mathml/parser.rb +45 -86
  89. data/lib/plurimath/mathml/utility/empty_defined_methods.rb +477 -0
  90. data/lib/plurimath/mathml/utility/formula_transformation.rb +472 -0
  91. data/lib/plurimath/mathml/utility.rb +363 -0
  92. data/lib/plurimath/mathml.rb +1 -0
  93. data/lib/plurimath/unicode_math/transform.rb +2 -2
  94. data/lib/plurimath/utility/intent_encoding.rb +21 -21
  95. data/lib/plurimath/utility.rb +5 -23
  96. data/lib/plurimath/version.rb +1 -1
  97. data/lib/plurimath.rb +9 -0
  98. data/plurimath.gemspec +4 -2
  99. metadata +38 -5
  100. data/lib/plurimath/mathml/transform.rb +0 -411
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "ternary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Fenced < TernaryFunction
10
+ include Mathml::Utility
11
+
9
12
  attr_accessor :options
10
13
 
11
14
  def initialize(
@@ -39,6 +42,7 @@ module Plurimath
39
42
  intent,
40
43
  func_name: :interval_fence,
41
44
  intent_name: intent_value(mrow_value, options: options),
45
+ options: intent_names,
42
46
  )
43
47
  end
44
48
 
@@ -145,8 +149,231 @@ module Plurimath
145
149
  "#{parameter_one.to_unicodemath(options: options)}#{fenced_value}#{parameter_three.to_unicodemath(options: options)}"
146
150
  end
147
151
 
152
+ def intent_names
153
+ {
154
+ open_closed_interval: "open-closed-interval",
155
+ closed_open_interval: "closed-open-interval",
156
+ binomial_coefficient: "binomial-coefficient",
157
+ closed_interval: "closed-interval",
158
+ open_interval: "open-interval",
159
+ fenced: ":fenced",
160
+ }
161
+ end
162
+
163
+ def separators=(value)
164
+ return if value.nil?
165
+
166
+ @options[:separators] = value
167
+ end
168
+
169
+ def content=(value)
170
+ if parens_nil?
171
+ @parameter_one = Math::Symbols::Paren::Lround.new
172
+ @parameter_three = Math::Symbols::Paren::Rround.new
173
+ end
174
+ end
175
+
176
+ def open=(value)
177
+ return unless value
178
+
179
+ @parameter_one = validate_symbols(value)
180
+ end
181
+
182
+ def close=(value)
183
+ return unless value
184
+
185
+ @parameter_three = validate_symbols(value)
186
+ end
187
+
188
+ def element_order=(value)
189
+ @parameter_two = validated_order(value)
190
+ end
191
+
192
+ def mi_value=(value)
193
+ return if value.nil? || value.empty?
194
+
195
+ update(
196
+ replace_order_with_value(
197
+ @parameter_two,
198
+ Array(validate_symbols(value)),
199
+ "mi"
200
+ )
201
+ )
202
+ end
203
+
204
+ def mn_value=(value)
205
+ return if value.nil? || value.empty?
206
+
207
+ update(
208
+ replace_order_with_value(
209
+ @parameter_two,
210
+ Array(validate_symbols(value)),
211
+ "mn"
212
+ )
213
+ )
214
+ end
215
+
216
+ def mtext_value=(value)
217
+ return if value.nil? || value.empty?
218
+
219
+ update(
220
+ replace_order_with_value(
221
+ @parameter_two,
222
+ Array(validate_symbols(value)),
223
+ "mtext"
224
+ )
225
+ )
226
+ end
227
+
228
+ def mo_value=(value)
229
+ return if value.nil? || value.empty?
230
+
231
+ update(
232
+ replace_order_with_value(
233
+ @parameter_two,
234
+ Array(validate_symbols(value)),
235
+ "mo"
236
+ )
237
+ )
238
+ end
239
+
240
+ def mstyle_value=(value)
241
+ return if value.empty?
242
+
243
+ update(
244
+ replace_order_with_value(
245
+ @parameter_two,
246
+ Array(value),
247
+ "mstyle"
248
+ )
249
+ )
250
+ end
251
+
252
+ def munderover_value=(value)
253
+ update_temp_order(value, "munderover")
254
+ end
255
+
256
+ def msub_value=(value)
257
+ update_temp_order(value, "msub")
258
+ end
259
+
260
+ def msup_value=(value)
261
+ update_temp_order(value, "msup")
262
+ end
263
+
264
+ def mover_value=(value)
265
+ update_temp_order(value, "mover")
266
+ end
267
+
268
+ def munder_value=(value)
269
+ update_temp_order(value, "munder")
270
+ end
271
+
272
+ def msubsup_value=(value)
273
+ update_temp_order(value, "msubsup")
274
+ end
275
+
276
+ def mfrac_value=(value)
277
+ update_temp_order(value, "mfrac")
278
+ end
279
+
280
+ def msqrt_value=(value)
281
+ update_temp_order(value, "msqrt")
282
+ end
283
+
284
+ def mfenced_value=(value)
285
+ update_temp_order(value, "mfenced")
286
+ end
287
+
288
+ def mtable_value=(value)
289
+ return if value.nil? || value.empty?
290
+
291
+ update(
292
+ replace_order_with_value(
293
+ Array(@parameter_two),
294
+ update_temp_mathml_values(value),
295
+ "mtable"
296
+ )
297
+ )
298
+ end
299
+
300
+ def mrow_value=(value)
301
+ return if value.nil? || value.empty?
302
+
303
+ update(
304
+ replace_order_with_value(
305
+ Array(@parameter_two),
306
+ update_temp_mathml_values(
307
+ Array(filter_values(value, array_to_instance: true))
308
+ ),
309
+ "mrow"
310
+ )
311
+ )
312
+ end
313
+
314
+ def mspace_value=(value)
315
+ return if value.nil? || value.empty?
316
+
317
+ if value.first.linebreak
318
+ linebreak = Math::Function::Linebreak.new(
319
+ nil,
320
+ { linebreak: value.first.linebreak }
321
+ )
322
+
323
+ update(
324
+ replace_order_with_value(
325
+ Array(@parameter_two),
326
+ [linebreak],
327
+ "mspace"
328
+ )
329
+ )
330
+ else
331
+ @parameter_two&.delete("mspace")
332
+ end
333
+ end
334
+
335
+ def mpadded_value=(value)
336
+ update_temp_order(value, "mpadded")
337
+ end
338
+
339
+ def mfraction_value=(value)
340
+ update_temp_order(value, "mfraction")
341
+ end
342
+
343
+ def mmultiscripts_value=(value)
344
+ update_temp_order(value, "mmultiscripts")
345
+ end
346
+
347
+ def mphantom_value=(value)
348
+ update_temp_order(value, "mphantom")
349
+ end
350
+
148
351
  protected
149
352
 
353
+ def update_temp_order(value, order_name)
354
+ return if value.nil? || value.empty?
355
+
356
+ update(
357
+ replace_order_with_value(
358
+ Array(@parameter_two),
359
+ update_temp_mathml_values(value),
360
+ order_name
361
+ )
362
+ )
363
+ end
364
+
365
+ def remove_order(order)
366
+ @parameter_two.delete_if { |val| val.is_a?(String) && val == order }
367
+ end
368
+
369
+ def insert(values)
370
+ update(Array(@parameter_two) + values)
371
+ end
372
+
373
+ def update(object)
374
+ @parameter_two = Array(object)
375
+ end
376
+
150
377
  def open_paren(dpr, options:)
151
378
  first_value = symbol_or_paren(parameter_one, lang: :omml, options: options)
152
379
  return dpr if first_value.nil?
@@ -253,11 +480,11 @@ module Plurimath
253
480
  end
254
481
 
255
482
  def intent_value(value, options:)
256
- return "binomial-coefficient" if binomial_coefficient?(value)
483
+ return :binomial_coefficient if binomial_coefficient?(value)
257
484
 
258
485
  open_paren = symbol_or_paren(parameter_one, lang: :latex, options: options)
259
486
  close_paren = symbol_or_paren(parameter_three, lang: :latex, options: options)
260
- return "fenced" unless interval_intent?(value, open_paren, close_paren)
487
+ return :fenced unless interval_intent?(value, open_paren, close_paren)
261
488
 
262
489
  interval_intent(value, open_paren, close_paren)
263
490
  end
@@ -270,15 +497,15 @@ module Plurimath
270
497
  def interval_intent(value, open_paren, close_paren)
271
498
  case open_paren
272
499
  when "("
273
- 'open-closed-interval' if close_paren == ']'
500
+ :open_closed_interval if close_paren == ']'
274
501
  when "["
275
- return 'closed-interval' if close_paren == ']'
502
+ return :closed_interval if close_paren == ']'
276
503
 
277
- 'closed-open-interval' if (close_paren == '[' || close_paren == ')')
504
+ :closed_open_interval if (close_paren == '[' || close_paren == ')')
278
505
  when "]"
279
- return 'open-closed-interval' if close_paren == ']'
506
+ return :open_closed_interval if close_paren == ']'
280
507
 
281
- 'open-interval' if close_paren == '['
508
+ :open_interval if close_paren == '['
282
509
  end
283
510
  end
284
511
 
@@ -347,6 +574,10 @@ module Plurimath
347
574
  node["intent"]&.start_with?(":partial-derivative") &&
348
575
  !node.locate("*/@arg").include?("f")
349
576
  end
577
+
578
+ def parens_nil?
579
+ @parameter_one.nil? && @parameter_three.nil?
580
+ end
350
581
  end
351
582
  end
352
583
  end
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "binary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Frac < BinaryFunction
10
+ include Mathml::Utility
11
+
9
12
  attr_accessor :options
13
+
10
14
  FUNCTION = {
11
15
  name: "fraction",
12
16
  first_value: "numerator",
@@ -41,7 +45,7 @@ module Plurimath
41
45
  frac_tag.set_attr(self.options.reject { |opt| opt == :choose }) if tag_name == "mfrac" && self.options
42
46
  Utility.update_nodes(frac_tag, mathml_value)
43
47
  update_derivative(frac_tag, mathml_value[0], mathml_value[1]) if intent
44
- intentify(frac_tag, intent, func_name: :frac)
48
+ intentify(frac_tag, intent, func_name: :frac, options: intent_names)
45
49
  end
46
50
 
47
51
  def to_latex(options:)
@@ -98,6 +102,13 @@ module Plurimath
98
102
  "#{first_value}⒞#{second_value}"
99
103
  end
100
104
 
105
+ def intent_names
106
+ {
107
+ derivative: ":derivative",
108
+ partial_derivative: ":partial-derivative",
109
+ }
110
+ end
111
+
101
112
  protected
102
113
 
103
114
  def fpr_element
@@ -36,7 +36,7 @@ module Plurimath
36
36
  parameter_two&.to_mathml_without_math_tag(intent, options: options),
37
37
  ],
38
38
  )
39
- intentify(inf_tag, intent, func_name: :function, intent_name: :function)
39
+ intentify(inf_tag, intent, func_name: :function, intent_name: intent_names[:name])
40
40
  end
41
41
 
42
42
  def to_omml_without_math_tag(display_style, options:)
@@ -57,6 +57,10 @@ module Plurimath
57
57
  "inf#{sub_value(options: options)}#{sup_value(options: options)}"
58
58
  end
59
59
 
60
+ def intent_names
61
+ { name: ":function" }
62
+ end
63
+
60
64
  protected
61
65
 
62
66
  def sup_value(options:)
@@ -62,7 +62,7 @@ module Plurimath
62
62
  wrap_mrow(parameter_three&.to_mathml_without_math_tag(intent, options: options), intent),
63
63
  ].flatten.compact,
64
64
  )
65
- intentify(mrow, intent, func_name: :naryand, intent_name: :integral)
65
+ intentify(mrow, intent, func_name: :naryand, intent_name: intent_names[:name])
66
66
  end
67
67
 
68
68
  def to_omml_without_math_tag(display_style, options:)
@@ -116,6 +116,10 @@ module Plurimath
116
116
  true
117
117
  end
118
118
 
119
+ def intent_names
120
+ { name: ":integral" }
121
+ end
122
+
119
123
  protected
120
124
 
121
125
  def sup_value(options:)
@@ -17,15 +17,19 @@ module Plurimath
17
17
  "ⓘ#{first_value}"
18
18
  end
19
19
 
20
+ def intent_names
21
+ { name: ":derivative" }
22
+ end
23
+
20
24
  private
21
25
 
22
26
  def encoded_intent(tag)
23
- if parameter_two.value == ":derivative" && encodable?
27
+ if parameter_two.value == intent_names[:name] && encodable?
24
28
  field = parameter_one.value
25
29
  unicode = encode(field[0].parameter_one.value)
26
30
  unfenced_str = fence_value(tag.nodes[1].nodes[1..-2]) if tag.nodes[1]["intent"] == ":fenced"
27
31
  fenced_str = "(#{unfenced_str})" unless unfenced_str.empty?
28
- ":derivative(1,#{unicode}#{fenced_str},#{unfenced_str})"
32
+ "#{intent_names[:name]}(1,#{unicode}#{fenced_str},#{unfenced_str})"
29
33
  else
30
34
  Utility.html_entity_to_unicode(parameter_two.value)
31
35
  end
@@ -42,7 +42,7 @@ module Plurimath
42
42
  parameter_two&.to_mathml_without_math_tag(intent, options: options),
43
43
  ],
44
44
  )
45
- intentify(lim_tag, intent, func_name: :function, intent_name: :function)
45
+ intentify(lim_tag, intent, func_name: :function, intent_name: intent_names[:name])
46
46
  end
47
47
 
48
48
  def to_omml_without_math_tag(display_style, options:)
@@ -64,6 +64,10 @@ module Plurimath
64
64
  self.parameter_two = nil
65
65
  end
66
66
  end
67
+
68
+ def intent_names
69
+ { name: ":function" }
70
+ end
67
71
  end
68
72
  end
69
73
  end
@@ -17,7 +17,7 @@ module Plurimath
17
17
  def ==(object)
18
18
  object.class == self.class &&
19
19
  object.parameter_one == parameter_one &&
20
- object.linebreak == linebreak
20
+ object.linebreak? == linebreak?
21
21
  end
22
22
 
23
23
  def to_asciimath(options:)
@@ -91,7 +91,7 @@ module Plurimath
91
91
  true
92
92
  end
93
93
 
94
- def linebreak
94
+ def linebreak?
95
95
  true
96
96
  end
97
97
  end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "unary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Longdiv < UnaryFunction
10
+ include Mathml::Utility
11
+
9
12
  def to_asciimath(options:)
10
13
  asciimath_value(options: options)
11
14
  end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "binary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Menclose < BinaryFunction
10
+ include Mathml::Utility
11
+
9
12
  FUNCTION = {
10
13
  name: "enclosure",
11
14
  first_value: "enclosure type",
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "unary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Merror < UnaryFunction
9
- def to_asciimath(**);end
10
+ include Mathml::Utility
10
11
 
11
- def to_latex(**);end
12
+ def to_asciimath(**); end
13
+
14
+ def to_latex(**); end
12
15
 
13
16
  def to_mathml_without_math_tag(intent, options:)
14
17
  merror = Utility.ox_element("merror")
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "unary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Mglyph < UnaryFunction
10
+ include Mathml::Utility
11
+
9
12
  def initialize(parameter_one = {})
10
13
  super(parameter_one)
11
14
  end
@@ -34,8 +37,32 @@ module Plurimath
34
37
  parameter_one[:alt] if parameter_one
35
38
  end
36
39
 
40
+ def alt; end
41
+
42
+ def src; end
43
+
44
+ def index; end
45
+
46
+ def src=(value)
47
+ set_option(:src, value)
48
+ end
49
+
50
+ def alt=(value)
51
+ set_option(:alt, value)
52
+ end
53
+
54
+ def index=(value)
55
+ set_option(:index, value)
56
+ end
57
+
37
58
  protected
38
59
 
60
+ def set_option(option, value)
61
+ return if value.nil?
62
+
63
+ parameter_one[option] = value
64
+ end
65
+
39
66
  def glyph_user_index(index)
40
67
  return "" unless index > 0
41
68
 
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "binary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Mlabeledtr < BinaryFunction
10
+ include Mathml::Utility
11
+
9
12
  def to_mathml_without_math_tag(intent, options:)
10
13
  table = ox_element("mtable")
11
14
  mlabeledtr = ox_element(class_name)
@@ -18,6 +21,22 @@ module Plurimath
18
21
  "#{parameter_one&.to_unicodemath(options: options)}##{parameter_two&.value}"
19
22
  end
20
23
 
24
+ def id=(value)
25
+ return if value.nil?
26
+
27
+ @parameter_two = Text.new(value)
28
+ end
29
+
30
+ def mtd_value=(value)
31
+ return if value.nil? || value.empty?
32
+
33
+ self.parameter_one = replace_order_with_value(
34
+ clear_temp_order,
35
+ update_temp_mathml_values(value),
36
+ "mtd"
37
+ )
38
+ end
39
+
21
40
  protected
22
41
 
23
42
  def labeledtr_td(tr, value)
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "unary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Mpadded < UnaryFunction
10
+ include Mathml::Utility
11
+
9
12
  attr_accessor :options
13
+
10
14
  ZERO_TAGS = {
11
15
  height: "zeroAsc",
12
16
  depth: "zeroDesc",
@@ -58,11 +62,34 @@ module Plurimath
58
62
  end
59
63
  end
60
64
 
65
+ def voffset; end
66
+
67
+ def voffset=(value); end
68
+
69
+ def height=(value)
70
+ set_option(:height, value)
71
+ end
72
+
73
+ def depth=(value)
74
+ set_option(:depth, value)
75
+ end
76
+
77
+ def width=(value)
78
+ set_option(:width, value)
79
+ end
80
+
61
81
  protected
62
82
 
83
+ def set_option(option, value)
84
+ return if value.nil?
85
+
86
+ @options ||= {}
87
+ @options[option] = value
88
+ end
89
+
63
90
  def phant_pr
64
91
  attributes = { "m:val": "on" }
65
- options.map do |atr, value|
92
+ options&.map do |atr, value|
66
93
  ox_element(ZERO_TAGS[atr], attributes: attributes) if attr_value_zero?(value)
67
94
  end
68
95
  end