plurimath 0.3.8 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/lib/plurimath/asciimath/transform.rb +17 -0
  3. data/lib/plurimath/math/core.rb +20 -4
  4. data/lib/plurimath/math/formula.rb +42 -25
  5. data/lib/plurimath/math/function/abs.rb +2 -2
  6. data/lib/plurimath/math/function/bar.rb +43 -12
  7. data/lib/plurimath/math/function/base.rb +3 -3
  8. data/lib/plurimath/math/function/binary_function.rb +21 -5
  9. data/lib/plurimath/math/function/cancel.rb +2 -2
  10. data/lib/plurimath/math/function/ceil.rb +7 -2
  11. data/lib/plurimath/math/function/color.rb +2 -2
  12. data/lib/plurimath/math/function/ddot.rb +10 -12
  13. data/lib/plurimath/math/function/deg.rb +2 -2
  14. data/lib/plurimath/math/function/det.rb +2 -2
  15. data/lib/plurimath/math/function/dim.rb +2 -2
  16. data/lib/plurimath/math/function/dot.rb +21 -4
  17. data/lib/plurimath/math/function/exp.rb +2 -2
  18. data/lib/plurimath/math/function/fenced.rb +2 -1
  19. data/lib/plurimath/math/function/floor.rb +2 -2
  20. data/lib/plurimath/math/function/font_style/bold-fraktur.rb +17 -0
  21. data/lib/plurimath/math/function/font_style/bold-italic.rb +17 -0
  22. data/lib/plurimath/math/function/font_style/bold-sans-serif.rb +17 -0
  23. data/lib/plurimath/math/function/font_style/bold-script.rb +17 -0
  24. data/lib/plurimath/math/function/font_style/bold.rb +4 -0
  25. data/lib/plurimath/math/function/font_style/double_struck.rb +4 -0
  26. data/lib/plurimath/math/function/font_style/fraktur.rb +4 -0
  27. data/lib/plurimath/math/function/font_style/italic.rb +4 -0
  28. data/lib/plurimath/math/function/font_style/monospace.rb +4 -0
  29. data/lib/plurimath/math/function/font_style/normal.rb +4 -0
  30. data/lib/plurimath/math/function/font_style/sans-serif-bold-italic.rb +17 -0
  31. data/lib/plurimath/math/function/font_style/sans-serif-italic.rb +17 -0
  32. data/lib/plurimath/math/function/font_style/sans-serif.rb +4 -0
  33. data/lib/plurimath/math/function/font_style/script.rb +4 -0
  34. data/lib/plurimath/math/function/font_style.rb +22 -4
  35. data/lib/plurimath/math/function/frac.rb +3 -3
  36. data/lib/plurimath/math/function/gcd.rb +2 -2
  37. data/lib/plurimath/math/function/glb.rb +2 -2
  38. data/lib/plurimath/math/function/hat.rb +37 -11
  39. data/lib/plurimath/math/function/hom.rb +2 -2
  40. data/lib/plurimath/math/function/inf.rb +3 -9
  41. data/lib/plurimath/math/function/int.rb +4 -4
  42. data/lib/plurimath/math/function/ker.rb +2 -2
  43. data/lib/plurimath/math/function/lcm.rb +2 -2
  44. data/lib/plurimath/math/function/left.rb +1 -1
  45. data/lib/plurimath/math/function/lg.rb +2 -2
  46. data/lib/plurimath/math/function/lim.rb +2 -8
  47. data/lib/plurimath/math/function/liminf.rb +2 -2
  48. data/lib/plurimath/math/function/limits.rb +4 -4
  49. data/lib/plurimath/math/function/limsup.rb +2 -2
  50. data/lib/plurimath/math/function/ln.rb +2 -2
  51. data/lib/plurimath/math/function/log.rb +5 -3
  52. data/lib/plurimath/math/function/longdiv.rb +2 -2
  53. data/lib/plurimath/math/function/lub.rb +2 -2
  54. data/lib/plurimath/math/function/max.rb +2 -2
  55. data/lib/plurimath/math/function/mbox.rb +2 -2
  56. data/lib/plurimath/math/function/menclose.rb +2 -2
  57. data/lib/plurimath/math/function/merror.rb +1 -1
  58. data/lib/plurimath/math/function/min.rb +2 -2
  59. data/lib/plurimath/math/function/mod.rb +3 -3
  60. data/lib/plurimath/math/function/msgroup.rb +2 -2
  61. data/lib/plurimath/math/function/msline.rb +2 -2
  62. data/lib/plurimath/math/function/multiscript.rb +4 -4
  63. data/lib/plurimath/math/function/norm.rb +2 -2
  64. data/lib/plurimath/math/function/obrace.rb +35 -28
  65. data/lib/plurimath/math/function/oint.rb +15 -16
  66. data/lib/plurimath/math/function/over.rb +3 -3
  67. data/lib/plurimath/math/function/overset.rb +8 -3
  68. data/lib/plurimath/math/function/power.rb +3 -3
  69. data/lib/plurimath/math/function/power_base.rb +10 -8
  70. data/lib/plurimath/math/function/prod.rb +8 -4
  71. data/lib/plurimath/math/function/right.rb +1 -1
  72. data/lib/plurimath/math/function/root.rb +3 -3
  73. data/lib/plurimath/math/function/rule.rb +1 -1
  74. data/lib/plurimath/math/function/scarries.rb +2 -2
  75. data/lib/plurimath/math/function/semantics.rb +2 -2
  76. data/lib/plurimath/math/function/sqrt.rb +2 -2
  77. data/lib/plurimath/math/function/stackrel.rb +3 -3
  78. data/lib/plurimath/math/function/substack.rb +3 -3
  79. data/lib/plurimath/math/function/sum.rb +22 -19
  80. data/lib/plurimath/math/function/sup.rb +2 -2
  81. data/lib/plurimath/math/function/table.rb +7 -11
  82. data/lib/plurimath/math/function/td.rb +2 -2
  83. data/lib/plurimath/math/function/ternary_function.rb +11 -0
  84. data/lib/plurimath/math/function/text.rb +6 -5
  85. data/lib/plurimath/math/function/tilde.rb +22 -4
  86. data/lib/plurimath/math/function/tr.rb +2 -2
  87. data/lib/plurimath/math/function/ubrace.rb +27 -23
  88. data/lib/plurimath/math/function/ul.rb +50 -20
  89. data/lib/plurimath/math/function/unary_function.rb +7 -5
  90. data/lib/plurimath/math/function/underover.rb +10 -8
  91. data/lib/plurimath/math/function/underset.rb +8 -3
  92. data/lib/plurimath/math/function/vec.rb +20 -5
  93. data/lib/plurimath/math/number.rb +6 -2
  94. data/lib/plurimath/math/symbol.rb +14 -2
  95. data/lib/plurimath/math.rb +4 -1
  96. data/lib/plurimath/mathml/constants.rb +9 -1
  97. data/lib/plurimath/mathml/parser.rb +4 -2
  98. data/lib/plurimath/mathml/transform.rb +51 -22
  99. data/lib/plurimath/omml/parser.rb +24 -1
  100. data/lib/plurimath/omml/transform.rb +43 -36
  101. data/lib/plurimath/utility.rb +114 -9
  102. data/lib/plurimath/version.rb +1 -1
  103. metadata +8 -2
@@ -6,6 +6,12 @@ module Plurimath
6
6
  class Parser
7
7
  attr_accessor :text
8
8
 
9
+ CUSTOMIZABLE_TAGS = %w[
10
+ eqArr
11
+ mr
12
+ r
13
+ ].freeze
14
+
9
15
  def initialize(text)
10
16
  @text = text
11
17
  end
@@ -33,17 +39,34 @@ module Plurimath
33
39
  },
34
40
  }
35
41
  else
36
- organize_table_td(node) if %w[mr eqArr].include?(node.name)
42
+ customize_tags(node) if CUSTOMIZABLE_TAGS.include?(node.name)
37
43
  { node.name => parse_nodes(node.nodes) }
38
44
  end
39
45
  end
40
46
  end
41
47
 
48
+ def customize_tags(node)
49
+ case node.name
50
+ when "r"
51
+ organize_fonts(node)
52
+ when "mr", "eqArr"
53
+ organize_table_td(node)
54
+ end
55
+ end
56
+
42
57
  def organize_table_td(node)
43
58
  node.locate("e/?").each do |child_node|
44
59
  child_node.name = "mtd" if child_node.name == "r"
45
60
  end
46
61
  end
62
+
63
+ def organize_fonts(node)
64
+ attrs_arr = { val: [] }
65
+ node.locate("rPr/?").each do |child|
66
+ attrs_arr[:val] << child.attributes["val"]
67
+ end
68
+ node.attributes.merge! attrs_arr
69
+ end
47
70
  end
48
71
  end
49
72
  end
@@ -10,10 +10,11 @@ module Plurimath
10
10
  rule(e: sequence(:e)) { e.flatten.compact }
11
11
 
12
12
  rule(val: simple(:val)) { val }
13
+ rule(scr: simple(:scr)) { scr }
14
+ rule(sty: simple(:sty)) { sty }
13
15
  rule(dPr: subtree(:dpr)) { dpr }
14
16
  rule(num: subtree(:num)) { num }
15
17
  rule(den: subtree(:den)) { den }
16
- rule(rPr: subtree(:rPr)) { nil }
17
18
  rule(fPr: subtree(:fPr)) { nil }
18
19
  rule(mpr: subtree(:mpr)) { nil }
19
20
  rule(mPr: subtree(:mPr)) { nil }
@@ -66,12 +67,17 @@ module Plurimath
66
67
  end
67
68
 
68
69
  rule(r: subtree(:r)) do
69
- if r.flatten.compact.empty?
70
+ flatten_row = r&.flatten&.compact
71
+ if flatten_row.empty?
70
72
  nil
71
- else
72
- Math::Formula.new(
73
- r.flatten.compact,
73
+ elsif flatten_row.length > 1 && !flatten_row.first.is_a?(Math::Core)
74
+ font = flatten_row.shift
75
+ font.new(
76
+ Utility.filter_values(flatten_row),
77
+ Utility::OMML_FONTS.invert[font].to_s,
74
78
  )
79
+ else
80
+ Utility.filter_values(flatten_row)
75
81
  end
76
82
  end
77
83
 
@@ -85,15 +91,15 @@ module Plurimath
85
91
  if t.empty?
86
92
  Math::Function::Text.new
87
93
  else
88
- t&.compact&.empty? ? [nil] : Utility.text_classes(t)
94
+ t&.compact&.empty? ? [nil] : Utility.mathml_unary_classes(t, omml: true)
89
95
  end
90
96
  end
91
97
 
92
98
  rule(d: subtree(:data)) do
93
- fenced = data.flatten.compact
94
- open_paren = fenced.shift if fenced.first.class_name == "symbol"
95
- close_paren = fenced.shift if fenced.first.class_name == "symbol"
96
- fenced_value = fenced
99
+ fenced = data.flatten
100
+ open_paren = fenced.shift if fenced&.first&.class_name == "symbol"
101
+ close_paren = fenced.shift if fenced&.first&.class_name == "symbol"
102
+ fenced_value = fenced.compact
97
103
  Math::Function::Fenced.new(
98
104
  open_paren,
99
105
  fenced_value,
@@ -111,6 +117,12 @@ module Plurimath
111
117
  Math::Function::Tr.new(row)
112
118
  end
113
119
 
120
+ rule(rPr: subtree(:rpr)) do
121
+ if rpr.is_a?(Array)
122
+ Utility::OMML_FONTS[rpr.join("-").to_sym]
123
+ end
124
+ end
125
+
114
126
  rule(lim: sequence(:lim)) do
115
127
  if lim.any?(String)
116
128
  Utility.text_classes(lim)
@@ -122,23 +134,18 @@ module Plurimath
122
134
  rule(acc: subtree(:acc)) do
123
135
  acc_value = acc.flatten.compact
124
136
  chr = Utility.find_pos_chr(acc_value, :chr)
125
- chr_value = chr ? chr[:chr] : "^"
126
- Math::Function::Overset.new(
127
- Math::Symbol.new(chr_value),
128
- Utility.filter_values(acc.last),
129
- )
137
+ chr_value = chr ? chr[:chr] : Math::Function::Hat.new
138
+ index = acc_value.index { |d| d[:chr] }
139
+ acc_value[index] = chr_value
140
+ Utility.binary_function_classes(acc_value)
141
+ acc_value.first.parameter_two = { accent: true }
142
+ acc_value.first
130
143
  end
131
144
 
132
145
  rule(func: subtree(:func)) do
133
- func_name = func.flatten.compact
134
- class_object = Utility.find_class_name(func_name.first)
135
- if class_object
136
- class_object.new(func_name.last)
137
- else
138
- Math::Formula.new(
139
- func_name,
140
- )
141
- end
146
+ Utility.filter_values(
147
+ Utility.populate_function_classes(func),
148
+ )
142
149
  end
143
150
 
144
151
  rule(nary: subtree(:nary)) do
@@ -168,11 +175,12 @@ module Plurimath
168
175
  end
169
176
 
170
177
  rule(sSubSup: subtree(:sSubSup)) do
178
+ function_classes = [Math::Formula, Math::Function::FontStyle]
171
179
  subsup = sSubSup.flatten.compact
172
180
  subsup.each_with_index do |object, ind|
173
181
  subsup[ind] = Utility.mathml_unary_classes([object]) if object.is_a?(String)
174
182
  end
175
- if subsup[0].is_a?(Math::Formula) && Utility.valid_class(subsup[0])
183
+ if Utility.valid_class(subsup[0])
176
184
  Utility.get_class(
177
185
  subsup[0].extract_class_from_text,
178
186
  ).new(
@@ -217,8 +225,8 @@ module Plurimath
217
225
  )
218
226
  end
219
227
 
220
- rule(limUpp: subtree(:limUpp)) do
221
- lim_values = limUpp.flatten.compact
228
+ rule(limUpp: subtree(:lim)) do
229
+ lim_values = lim.flatten.compact
222
230
  first_value = lim_values[0]
223
231
  Math::Function::Overset.new(
224
232
  first_value,
@@ -227,9 +235,13 @@ module Plurimath
227
235
  end
228
236
 
229
237
  rule(limLow: subtree(:lim)) do
238
+ flatten_lim = lim.flatten.compact
239
+ second_value = Utility.filter_values(lim[2])
240
+ unicode = Mathml::Constants::UNICODE_SYMBOLS.invert[second_value.class_name]
241
+ second_value = unicode ? Math::Symbol.new(unicode.to_s) : second_value
230
242
  Math::Function::Underset.new(
231
243
  Utility.filter_values(lim[1]),
232
- Utility.filter_values(lim[2]),
244
+ second_value,
233
245
  )
234
246
  end
235
247
 
@@ -241,14 +253,9 @@ module Plurimath
241
253
  end
242
254
 
243
255
  rule(bar: subtree(:bar)) do
244
- barpr = bar&.flatten&.compact
245
- pospr = Utility.find_pos_chr(bar.first, :pos)
246
- class_name = if pospr&.value?("top")
247
- Math::Function::Bar
248
- else
249
- Math::Function::Ul
250
- end
251
- class_name.new(barpr.last)
256
+ flatten_bar = bar.flatten.compact
257
+ attrs = { accent: false }
258
+ Math::Function::Bar.new(flatten_bar.last, attrs)
252
259
  end
253
260
 
254
261
  rule(sPre: subtree(:spre)) do
@@ -72,6 +72,22 @@ module Plurimath
72
72
  max
73
73
  min
74
74
  ].freeze
75
+ OMML_FONTS = {
76
+ "sans-serif-bi": Math::Function::FontStyle::SansSerifBoldItalic,
77
+ "sans-serif-i": Math::Function::FontStyle::SansSerifItalic,
78
+ "sans-serif-b": Math::Function::FontStyle::BoldSansSerif,
79
+ "double-struck": Math::Function::FontStyle::DoubleStruck,
80
+ "sans-serif-p": Math::Function::FontStyle::SansSerif,
81
+ "fraktur-p": Math::Function::FontStyle::Fraktur,
82
+ "fraktur-b": Math::Function::FontStyle::BoldFraktur,
83
+ "script-b": Math::Function::FontStyle::BoldScript,
84
+ "monospace": Math::Function::FontStyle::Monospace,
85
+ "script-p": Math::Function::FontStyle::Script,
86
+ "bi": Math::Function::FontStyle::BoldItalic,
87
+ "p": Math::Function::FontStyle::Normal,
88
+ "i": Math::Function::FontStyle::Italic,
89
+ "b": Math::Function::FontStyle::Bold,
90
+ }.freeze
75
91
 
76
92
  class << self
77
93
  def organize_table(array, column_align: nil, options: nil)
@@ -271,7 +287,7 @@ module Plurimath
271
287
  td_object
272
288
  end
273
289
 
274
- def mathml_unary_classes(text_array)
290
+ def mathml_unary_classes(text_array, omml: false)
275
291
  return [] if text_array.empty?
276
292
 
277
293
  compacted = text_array.compact
@@ -290,7 +306,7 @@ module Plurimath
290
306
  elsif classes.any?(string&.strip)
291
307
  get_class(string.strip).new
292
308
  else
293
- Math::Symbol.new(unicode)
309
+ omml ? text_classes(string) : Math::Symbol.new(unicode)
294
310
  end
295
311
  end
296
312
 
@@ -326,16 +342,35 @@ module Plurimath
326
342
  attrs.nil? ? array_value : join_attr_value(attrs, array_value)
327
343
  elsif attrs.nil?
328
344
  value
329
- elsif attrs.is_a?(Math::Function::Menclose)
345
+ elsif attrs.is_a?(String) && ["solid", "none"].include?(attrs.split.first.downcase)
346
+ table_separator(attrs.split, value)
347
+ elsif attrs.is_a?(Hash) && (attrs.key?(:accent) || attrs.key?(:accentunder))
348
+ attr_is_accent(attrs, value)
349
+ elsif attrs.is_a?(Math::Core)
350
+ attr_is_function(attrs, value)
351
+ end
352
+ end
353
+
354
+ def attr_is_accent(attrs, value)
355
+ value.last.parameter_one = value.shift if value.length > 1
356
+ if value.last.is_a?(Math::Function::BinaryFunction)
357
+ value.last.parameter_two = attrs.transform_values { |v| YAML.load(v) }
358
+ end
359
+ value
360
+ end
361
+
362
+ def attr_is_function(attrs, value)
363
+ case attrs
364
+ when Math::Function::Menclose
330
365
  attrs.parameter_two = filter_values(value)
331
366
  attrs
332
- elsif attrs.is_a?(Math::Function::Fenced)
367
+ when Math::Function::Fenced
333
368
  attrs.parameter_two = value.compact
334
369
  attrs
335
- elsif attrs.is_a?(Math::Function::FontStyle)
370
+ when Math::Function::FontStyle
336
371
  attrs.parameter_one = filter_values(value)
337
372
  attrs
338
- elsif attrs.is_a?(Math::Function::Color)
373
+ when Math::Function::Color
339
374
  color_value = filter_values(value)
340
375
  if attrs.parameter_two
341
376
  attrs.parameter_two.parameter_one = color_value
@@ -343,8 +378,6 @@ module Plurimath
343
378
  attrs.parameter_two = color_value
344
379
  end
345
380
  attrs
346
- elsif ["solid", "none"].include?(attrs.split.first.downcase)
347
- table_separator(attrs.split, value)
348
381
  end
349
382
  end
350
383
 
@@ -426,7 +459,79 @@ module Plurimath
426
459
 
427
460
  def valid_class(object)
428
461
  text = object.extract_class_from_text
429
- Asciimath::Constants::SUB_SUP_CLASSES.include?(text)
462
+ (object.extractable? && Asciimath::Constants::SUB_SUP_CLASSES.include?(text)) ||
463
+ Latex::Constants::SYMBOLS[text.to_sym] == :power_base
464
+ end
465
+
466
+ def mrow_left_right(mrow = [])
467
+ object = mrow.first
468
+ !(
469
+ (
470
+ (
471
+ object.is_a?(Math::Function::TernaryFunction) && object.any_value_exist?
472
+ ) &&
473
+ mrow.length <= 2
474
+ ) ||
475
+ object.is_a?(Math::Function::UnaryFunction) && mrow.length == 1
476
+ )
477
+ end
478
+
479
+ def populate_function_classes(mrow = [])
480
+ flatten_mrow = mrow.flatten.compact
481
+ unary_function_classes(flatten_mrow)
482
+ binary_function_classes(flatten_mrow)
483
+ ternary_function_classes(flatten_mrow)
484
+ flatten_mrow
485
+ end
486
+
487
+ def binary_function_classes(mrow, under: false)
488
+ binary_class = Math::Function::BinaryFunction
489
+ mrow.each_with_index do |object, ind|
490
+ mrow[ind] = mathml_unary_classes([object]) if object.is_a?(String)
491
+ object = mrow[ind]
492
+ next unless object.is_a?(binary_class)
493
+
494
+ if object.is_a?(Math::Function::Mod)
495
+ next unless mrow.length >= 1
496
+
497
+ object.parameter_one = mrow.delete_at(ind - 1) unless ind == 0
498
+ object.parameter_two = mrow.delete_at(ind)
499
+ elsif Mathml::Constants::UNICODE_SYMBOLS.invert[object.class_name] && mrow.length > 1
500
+ next if object.parameter_one || mrow.length > 2
501
+ next object.parameter_one = mrow.delete_at(ind - 1) if under && ind <= 1
502
+
503
+ object.parameter_one = mrow.delete_at(ind + 1)
504
+ end
505
+ end
506
+ end
507
+
508
+ def unary_function_classes(mrow)
509
+ unary_class = Math::Function::UnaryFunction
510
+ if mrow.any?(String) || mrow.any?(unary_class)
511
+ mrow.each_with_index do |object, ind|
512
+ mrow[ind] = mathml_unary_classes([object]) if object.is_a?(String)
513
+ next unless object.is_a?(unary_class)
514
+ next if object.is_a?(Math::Function::Text)
515
+ next if object.parameter_one || mrow[ind + 1].nil?
516
+
517
+ object.parameter_one = mrow.delete_at(ind + 1)
518
+ end
519
+ end
520
+ end
521
+
522
+ def ternary_function_classes(mrow)
523
+ ternary_class = Math::Function::TernaryFunction
524
+ if mrow.any?(ternary_class) && mrow.length > 1
525
+ mrow.each_with_index do |object, ind|
526
+ if object.is_a?(ternary_class)
527
+ next if [Math::Function::Fenced, Math::Function::Multiscript].include?(object.class)
528
+ next unless object.parameter_one || object.parameter_two
529
+ next if object.parameter_three
530
+
531
+ object.parameter_three = filter_values(mrow.delete_at(ind + 1))
532
+ end
533
+ end
534
+ end
430
535
  end
431
536
  end
432
537
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Plurimath
4
- VERSION = "0.3.8"
4
+ VERSION = "0.4.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plurimath
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-03 00:00:00.000000000 Z
11
+ date: 2023-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -104,12 +104,18 @@ files:
104
104
  - lib/plurimath/math/function/fenced.rb
105
105
  - lib/plurimath/math/function/floor.rb
106
106
  - lib/plurimath/math/function/font_style.rb
107
+ - lib/plurimath/math/function/font_style/bold-fraktur.rb
108
+ - lib/plurimath/math/function/font_style/bold-italic.rb
109
+ - lib/plurimath/math/function/font_style/bold-sans-serif.rb
110
+ - lib/plurimath/math/function/font_style/bold-script.rb
107
111
  - lib/plurimath/math/function/font_style/bold.rb
108
112
  - lib/plurimath/math/function/font_style/double_struck.rb
109
113
  - lib/plurimath/math/function/font_style/fraktur.rb
110
114
  - lib/plurimath/math/function/font_style/italic.rb
111
115
  - lib/plurimath/math/function/font_style/monospace.rb
112
116
  - lib/plurimath/math/function/font_style/normal.rb
117
+ - lib/plurimath/math/function/font_style/sans-serif-bold-italic.rb
118
+ - lib/plurimath/math/function/font_style/sans-serif-italic.rb
113
119
  - lib/plurimath/math/function/font_style/sans-serif.rb
114
120
  - lib/plurimath/math/function/font_style/script.rb
115
121
  - lib/plurimath/math/function/frac.rb