plurimath 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +8 -11
- data/.gitignore +1 -0
- data/AsciiMath-Supported-Data.adoc +280 -0
- data/Gemfile +1 -0
- data/Latex-Supported-Data.adoc +1872 -0
- data/MathML-Supported-Data.adoc +270 -0
- data/README.adoc +94 -0
- data/lib/plurimath/asciimath/constants.rb +215 -222
- data/lib/plurimath/asciimath/parse.rb +45 -11
- data/lib/plurimath/asciimath/parser.rb +4 -3
- data/lib/plurimath/asciimath/transform.rb +222 -131
- data/lib/plurimath/asciimath.rb +1 -1
- data/lib/plurimath/html/constants.rb +50 -0
- data/lib/plurimath/html/parse.rb +149 -0
- data/lib/plurimath/html/parser.rb +26 -0
- data/lib/plurimath/html/transform.rb +363 -0
- data/lib/plurimath/html.rb +1 -1
- data/lib/plurimath/latex/constants.rb +1885 -1858
- data/lib/plurimath/latex/parse.rb +127 -34
- data/lib/plurimath/latex/parser.rb +5 -4
- data/lib/plurimath/latex/transform.rb +324 -164
- data/lib/plurimath/math/formula.rb +9 -1
- data/lib/plurimath/math/function/bar.rb +1 -1
- data/lib/plurimath/math/function/base.rb +7 -1
- data/lib/plurimath/math/function/binary_function.rb +10 -5
- data/lib/plurimath/math/function/color.rb +4 -4
- data/lib/plurimath/math/function/fenced.rb +7 -2
- data/lib/plurimath/math/function/font_style/bold.rb +18 -0
- data/lib/plurimath/math/function/font_style/double_struck.rb +18 -0
- data/lib/plurimath/math/function/font_style/fraktur.rb +18 -0
- data/lib/plurimath/math/function/font_style/monospace.rb +18 -0
- data/lib/plurimath/math/function/font_style/sans-serif.rb +18 -0
- data/lib/plurimath/math/function/font_style/script.rb +18 -0
- data/lib/plurimath/math/function/font_style.rb +2 -22
- data/lib/plurimath/math/function/frac.rb +4 -4
- data/lib/plurimath/math/function/inf.rb +0 -1
- data/lib/plurimath/math/function/left.rb +3 -6
- data/lib/plurimath/math/function/limits.rb +0 -1
- data/lib/plurimath/math/function/log.rb +6 -0
- data/lib/plurimath/math/function/mod.rb +6 -0
- data/lib/plurimath/math/function/multiscript.rb +11 -0
- data/lib/plurimath/math/function/norm.rb +2 -1
- data/lib/plurimath/math/function/over.rb +29 -0
- data/lib/plurimath/math/function/overset.rb +2 -2
- data/lib/plurimath/math/function/power.rb +7 -1
- data/lib/plurimath/math/function/power_base.rb +14 -7
- data/lib/plurimath/math/function/prod.rb +6 -0
- data/lib/plurimath/math/function/right.rb +24 -0
- data/lib/plurimath/math/function/root.rb +5 -4
- data/lib/plurimath/math/function/sqrt.rb +1 -1
- data/lib/plurimath/math/function/substack.rb +0 -1
- data/lib/plurimath/math/function/sum.rb +6 -0
- data/lib/plurimath/math/function/table/align.rb +24 -0
- data/lib/plurimath/math/function/table/array.rb +25 -0
- data/lib/plurimath/math/function/table/bmatrix.rb +26 -0
- data/lib/plurimath/math/function/table/matrix.rb +24 -0
- data/lib/plurimath/math/function/table/multline.rb +24 -0
- data/lib/plurimath/math/function/table/pmatrix.rb +24 -0
- data/lib/plurimath/math/function/table/split.rb +24 -0
- data/lib/plurimath/math/function/table/vmatrix.rb +25 -0
- data/lib/plurimath/math/function/table.rb +17 -5
- data/lib/plurimath/math/function/td.rb +6 -1
- data/lib/plurimath/math/function/ternary_function.rb +16 -6
- data/lib/plurimath/math/function/text.rb +19 -7
- data/lib/plurimath/math/function/tr.rb +6 -1
- data/lib/plurimath/math/function/unary_function.rb +5 -0
- data/lib/plurimath/math/function/vec.rb +4 -0
- data/lib/plurimath/math/function.rb +13 -2
- data/lib/plurimath/math/number.rb +8 -0
- data/lib/plurimath/math/symbol.rb +12 -3
- data/lib/plurimath/math.rb +9 -4
- data/lib/plurimath/mathml/constants.rb +2 -34
- data/lib/plurimath/mathml/parse.rb +7 -2
- data/lib/plurimath/mathml/parser.rb +2 -1
- data/lib/plurimath/mathml/transform.rb +73 -68
- data/lib/plurimath/mathml.rb +1 -1
- data/lib/plurimath/omml/constants.rb +154 -0
- data/lib/plurimath/omml/parser.rb +22 -0
- data/lib/plurimath/omml/transform.rb +216 -0
- data/lib/plurimath/omml.rb +1 -1
- data/lib/plurimath/unitsml.rb +4 -0
- data/lib/plurimath/utility.rb +73 -0
- data/lib/plurimath/version.rb +1 -1
- data/plurimath.gemspec +1 -0
- metadata +49 -7
- data/README.md +0 -40
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../table"
|
4
|
+
|
5
|
+
module Plurimath
|
6
|
+
module Math
|
7
|
+
module Function
|
8
|
+
class Table
|
9
|
+
class Pmatrix < Table
|
10
|
+
def initialize(parameter_one,
|
11
|
+
parameter_two = "(",
|
12
|
+
parameter_three = ")")
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_latex
|
17
|
+
first_value = parameter_one&.map(&:to_latex)&.join("\\\\")
|
18
|
+
"\\begin{pmatrix}#{first_value}\\end{pmatrix}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../table"
|
4
|
+
|
5
|
+
module Plurimath
|
6
|
+
module Math
|
7
|
+
module Function
|
8
|
+
class Table
|
9
|
+
class Split < Table
|
10
|
+
def initialize(parameter_one,
|
11
|
+
parameter_two = "[",
|
12
|
+
parameter_three = "]")
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_latex
|
17
|
+
first_value = parameter_one&.map(&:to_latex)&.join("\\\\")
|
18
|
+
"\\begin{split}#{first_value}\\end{split}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../table"
|
4
|
+
|
5
|
+
module Plurimath
|
6
|
+
module Math
|
7
|
+
module Function
|
8
|
+
class Table
|
9
|
+
class Vmatrix < Table
|
10
|
+
def initialize(parameter_one,
|
11
|
+
parameter_two = "|",
|
12
|
+
parameter_three = "|")
|
13
|
+
parameter_three = nil if parameter_two == "norm["
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_latex
|
18
|
+
first_value = parameter_one&.map(&:to_latex)&.join("\\\\")
|
19
|
+
"\\begin{vmatrix}#{first_value}\\end{vmatrix}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -6,6 +6,12 @@ module Plurimath
|
|
6
6
|
module Math
|
7
7
|
module Function
|
8
8
|
class Table < TernaryFunction
|
9
|
+
def initialize(parameter_one = nil,
|
10
|
+
parameter_two = nil,
|
11
|
+
parameter_three = nil)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
9
15
|
def to_asciimath
|
10
16
|
first_value = parameter_one.map(&:to_asciimath).join(",")
|
11
17
|
second_value = parameter_two.nil? ? "[" : parameter_two
|
@@ -15,7 +21,8 @@ module Plurimath
|
|
15
21
|
|
16
22
|
def to_mathml_without_math_tag
|
17
23
|
table_value = parameter_one.map(&:to_mathml_without_math_tag).join
|
18
|
-
|
24
|
+
parenthesis = Latex::Constants::PARENTHESIS
|
25
|
+
if parenthesis.key?(parameter_two) || parameter_two == "|"
|
19
26
|
"<mfenced open='#{parameter_two}' close='#{parameter_three}'>"\
|
20
27
|
"<mtable>#{table_value}</mtable></mfenced>"
|
21
28
|
elsif parameter_two == "norm["
|
@@ -28,13 +35,18 @@ module Plurimath
|
|
28
35
|
def to_latex
|
29
36
|
first_value = parameter_one&.map(&:to_latex)&.join("\\\\")
|
30
37
|
environment = latex_environment
|
31
|
-
|
32
|
-
"\\begin{#{environment}}#{divider}#{first_value}\\end{#{environment}}"
|
38
|
+
"\\begin{#{environment}}#{first_value}\\end{#{environment}}"
|
33
39
|
end
|
34
40
|
|
35
41
|
def latex_environment
|
36
|
-
matrices_hash = Latex::Constants::
|
37
|
-
|
42
|
+
matrices_hash = Latex::Constants::MATRICES
|
43
|
+
matric_value = matrices_hash.value?(parameter_two)
|
44
|
+
matrices_hash.invert[parameter_two] if matric_value
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_html
|
48
|
+
first_value = parameter_one.map(&:to_html).join
|
49
|
+
"<table>#{first_value}</table>"
|
38
50
|
end
|
39
51
|
end
|
40
52
|
end
|
@@ -10,7 +10,7 @@ module Plurimath
|
|
10
10
|
if parameter_one.length > 1
|
11
11
|
"[#{parameter_one.map(&:to_asciimath).join(',')}]"
|
12
12
|
else
|
13
|
-
|
13
|
+
parameter_one.map(&:to_asciimath).join(",")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -21,6 +21,11 @@ module Plurimath
|
|
21
21
|
def to_latex
|
22
22
|
parameter_one.map(&:to_latex).join
|
23
23
|
end
|
24
|
+
|
25
|
+
def to_html
|
26
|
+
first_value = parameter_one.map(&:to_html).join
|
27
|
+
"<td>#{first_value}</td>"
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -6,14 +6,16 @@ module Plurimath
|
|
6
6
|
class TernaryFunction
|
7
7
|
attr_accessor :parameter_one, :parameter_two, :parameter_three
|
8
8
|
|
9
|
-
def initialize(parameter_one = nil,
|
9
|
+
def initialize(parameter_one = nil,
|
10
|
+
parameter_two = nil,
|
11
|
+
parameter_three = nil)
|
10
12
|
@parameter_one = parameter_one
|
11
13
|
@parameter_two = parameter_two
|
12
14
|
@parameter_three = parameter_three
|
13
15
|
end
|
14
16
|
|
15
17
|
def to_asciimath
|
16
|
-
first_value = parameter_one
|
18
|
+
first_value = parameter_one&.to_asciimath
|
17
19
|
second_value = "_(#{parameter_two.to_asciimath})" if parameter_two
|
18
20
|
third_value = "^(#{parameter_three.to_asciimath})" if parameter_three
|
19
21
|
"#{first_value}#{second_value}#{third_value}"
|
@@ -27,10 +29,18 @@ module Plurimath
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def to_mathml_without_math_tag
|
30
|
-
first_value = parameter_one
|
31
|
-
second_value = parameter_two
|
32
|
-
third_value = parameter_three
|
33
|
-
"
|
32
|
+
first_value = parameter_one&.to_mathml_without_math_tag
|
33
|
+
second_value = parameter_two&.to_mathml_without_math_tag
|
34
|
+
third_value = parameter_three&.to_mathml_without_math_tag
|
35
|
+
body_value = "#{first_value}#{second_value}#{third_value}"
|
36
|
+
"<m#{class_name}>#{body_value}</m#{class_name}>"
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_html
|
40
|
+
first_value = "<i>#{parameter_one.to_html}</i>" if parameter_one
|
41
|
+
second_value = "<i>#{parameter_two.to_html}</i>" if parameter_two
|
42
|
+
third_value = "<i>#{parameter_three.to_html}</i>" if parameter_three
|
43
|
+
first_value + second_value + third_value
|
34
44
|
end
|
35
45
|
|
36
46
|
def class_name
|
@@ -7,15 +7,11 @@ module Plurimath
|
|
7
7
|
module Function
|
8
8
|
class Text < UnaryFunction
|
9
9
|
def to_asciimath
|
10
|
-
"\"#{parameter_one}\""
|
10
|
+
"\"#{parse_text('asciimath') || parameter_one}\""
|
11
11
|
end
|
12
12
|
|
13
13
|
def to_mathml_without_math_tag
|
14
|
-
|
15
|
-
parameter_one.gsub!(regex_exp) do |_text|
|
16
|
-
symbol_value(Regexp.last_match[:unicode]).to_s
|
17
|
-
end
|
18
|
-
"<mtext>#{parameter_one}</mtext>"
|
14
|
+
"<mtext>#{parse_text('mathml') || parameter_one}</mtext>"
|
19
15
|
end
|
20
16
|
|
21
17
|
def symbol_value(unicode)
|
@@ -24,7 +20,23 @@ module Plurimath
|
|
24
20
|
end
|
25
21
|
|
26
22
|
def to_latex
|
27
|
-
parameter_one
|
23
|
+
parse_text("latex") || parameter_one
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_html
|
27
|
+
parse_text("html") || parameter_one
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse_text(lang)
|
31
|
+
regex = %r{\\mbox\{(?<mbox>.{1,})\}|unicode\[:(?<unicode>\w{1,})\]}
|
32
|
+
parameter_one.gsub!(regex) do |_text|
|
33
|
+
last_match = Regexp.last_match
|
34
|
+
if ["mathml", "html"].include?(lang)
|
35
|
+
symbol_value(last_match[:unicode]) || last_match[:mbox]
|
36
|
+
else
|
37
|
+
last_match[:unicode] || last_match[:mbox]
|
38
|
+
end
|
39
|
+
end
|
28
40
|
end
|
29
41
|
end
|
30
42
|
end
|
@@ -16,9 +16,14 @@ module Plurimath
|
|
16
16
|
|
17
17
|
def to_latex
|
18
18
|
parameter_one.reject do |td|
|
19
|
-
td if td.is_a?(Symbol) && td.value == "|"
|
19
|
+
td if td.is_a?(Math::Symbol) && td.value == "|"
|
20
20
|
end.map(&:to_latex).join("&")
|
21
21
|
end
|
22
|
+
|
23
|
+
def to_html
|
24
|
+
first_value = parameter_one.map(&:to_html).join
|
25
|
+
"<tr>#{first_value}</tr>"
|
26
|
+
end
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
@@ -32,6 +32,11 @@ module Plurimath
|
|
32
32
|
"\\#{class_name}#{first_value}"
|
33
33
|
end
|
34
34
|
|
35
|
+
def to_html
|
36
|
+
first_value = "<i>#{parameter_one.to_html}</i>" if parameter_one
|
37
|
+
"<i>#{class_name}</i>#{first_value}"
|
38
|
+
end
|
39
|
+
|
35
40
|
def class_name
|
36
41
|
self.class.name.split("::").last.downcase
|
37
42
|
end
|
@@ -1,3 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Plurimath
|
2
|
+
module Math
|
3
|
+
module Function
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Include the first level files before the next
|
9
|
+
(
|
10
|
+
Dir.glob(File.join(__dir__, "function", "*.rb")) +
|
11
|
+
Dir.glob(File.join(__dir__, "function", "*", "*.rb"))
|
12
|
+
).each do |file|
|
13
|
+
require file
|
3
14
|
end
|
@@ -14,7 +14,8 @@ module Plurimath
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_asciimath
|
17
|
-
value
|
17
|
+
symbol = Asciimath::Constants::SYMBOLS.invert[value.to_sym].to_s
|
18
|
+
symbol.empty? ? value : symbol
|
18
19
|
end
|
19
20
|
|
20
21
|
def to_mathml_without_math_tag
|
@@ -26,8 +27,16 @@ module Plurimath
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def to_latex
|
29
|
-
symbols = Latex::Constants::SYMBOLS
|
30
|
-
symbols.
|
30
|
+
symbols = Latex::Constants::SYMBOLS.invert
|
31
|
+
symbols.key?(value) ? "\\#{symbols[value]}" : value
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_html
|
35
|
+
value
|
36
|
+
end
|
37
|
+
|
38
|
+
def class_name
|
39
|
+
self.class.name.split("::").last.downcase
|
31
40
|
end
|
32
41
|
end
|
33
42
|
end
|
data/lib/plurimath/math.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "ox"
|
3
4
|
require_relative "unicode"
|
4
5
|
require_relative "asciimath"
|
5
6
|
require_relative "omml"
|
@@ -14,17 +15,21 @@ require_relative "math/symbol"
|
|
14
15
|
require_relative "asciimath/parser"
|
15
16
|
require_relative "mathml/parser"
|
16
17
|
require_relative "latex/parser"
|
18
|
+
require_relative "html/parser"
|
19
|
+
require_relative "omml/parser"
|
20
|
+
require_relative "utility"
|
17
21
|
module Plurimath
|
18
22
|
module Math
|
19
23
|
class Error < StandardError; end
|
20
24
|
|
21
25
|
VALID_TYPES = {
|
22
|
-
unicode: Unicode,
|
23
|
-
asciimath: Asciimath,
|
24
26
|
omml: Omml,
|
25
|
-
mathml: Mathml,
|
26
27
|
html: Html,
|
27
28
|
latex: Latex,
|
29
|
+
mathml: Mathml,
|
30
|
+
unitsml: Unitsml,
|
31
|
+
unicode: Unicode,
|
32
|
+
asciimath: Asciimath,
|
28
33
|
}.freeze
|
29
34
|
|
30
35
|
def parse(text, type)
|
@@ -42,7 +47,7 @@ module Plurimath
|
|
42
47
|
end
|
43
48
|
|
44
49
|
def valid_type?(type)
|
45
|
-
(type.is_a?(Symbol) || type.is_a?(String)) &&
|
50
|
+
(type.is_a?(::Symbol) || type.is_a?(String)) &&
|
46
51
|
VALID_TYPES.key?(type.to_sym)
|
47
52
|
end
|
48
53
|
|
@@ -283,45 +283,13 @@ module Plurimath
|
|
283
283
|
log
|
284
284
|
].freeze
|
285
285
|
FONT_CLASSES = %i[
|
286
|
-
|
286
|
+
double-struck
|
287
287
|
sans-serif
|
288
288
|
monospace
|
289
|
+
fraktur
|
289
290
|
script
|
290
|
-
double-struck
|
291
291
|
bold
|
292
292
|
].freeze
|
293
|
-
FONT_TYPES = {
|
294
|
-
:bb=>"bold",
|
295
|
-
:fr=>"fraktur",
|
296
|
-
:cc=>"script",
|
297
|
-
:sf=>"sans-serif",
|
298
|
-
:tt=>"monospace",
|
299
|
-
:mbf=>"bold",
|
300
|
-
:mit=>"italic",
|
301
|
-
:mtt=>"monospace",
|
302
|
-
:Bbb=>"double-struck",
|
303
|
-
:bbb=>"double-struck",
|
304
|
-
:mscr=>"mathbb",
|
305
|
-
:mfrak=>"fraktur",
|
306
|
-
:msans=>"sans-serif",
|
307
|
-
:mbfit=>"bold italic",
|
308
|
-
:mathbf=>"bold",
|
309
|
-
:mathit=>"italic",
|
310
|
-
:mathds=>"mathbb",
|
311
|
-
:mathrm=>"mathrm",
|
312
|
-
:mathtt=>"monospace",
|
313
|
-
:mathsf=>"sans-serif",
|
314
|
-
:mathbb=>"double-struck",
|
315
|
-
:mbfsans=>"bold sans-serif",
|
316
|
-
:mathcal=>"script",
|
317
|
-
:mathbold=>"bold",
|
318
|
-
:mathfrak=>"fraktur",
|
319
|
-
:mathbfit=>"bold italic",
|
320
|
-
:mathsfbf=>"sans-serif bold",
|
321
|
-
:mathsfit=>"sans-serif italic",
|
322
|
-
:mbfitsans=>"bold italic sans-serif",
|
323
|
-
:mathsfbfit=>"sans-serif bold italic",
|
324
|
-
}.freeze
|
325
293
|
end
|
326
294
|
end
|
327
295
|
end
|
@@ -13,13 +13,18 @@ module Plurimath
|
|
13
13
|
str("")
|
14
14
|
end
|
15
15
|
|
16
|
-
rule(:tag)
|
16
|
+
rule(:tag) do
|
17
|
+
(parse_tag(:open) >> iteration.as(:iteration) >> parse_tag(:close)).as(:tag) |
|
18
|
+
parse_text_tag.as(:tag)
|
19
|
+
end
|
17
20
|
|
18
21
|
rule(:sequence) { (tag >> sequence.as(:sequence)) | tag }
|
19
22
|
|
20
23
|
rule(:iteration) { (sequence >> iteration.as(:iteration)) | parse_record }
|
21
24
|
|
22
|
-
rule(:expression)
|
25
|
+
rule(:expression) do
|
26
|
+
parse_tag(:open) >> iteration.as(:iteration) >> parse_tag(:close)
|
27
|
+
end
|
23
28
|
|
24
29
|
root :expression
|
25
30
|
|
@@ -9,11 +9,12 @@ module Plurimath
|
|
9
9
|
attr_accessor :text
|
10
10
|
|
11
11
|
def initialize(text)
|
12
|
-
@text = text.gsub(
|
12
|
+
@text = text.gsub(/\s/, "")
|
13
13
|
end
|
14
14
|
|
15
15
|
def parse
|
16
16
|
tree_t = Plurimath::Mathml::Parse.new.parse(text)
|
17
|
+
tree_t = JSON.parse(tree_t.to_json, symbolize_names: true)
|
17
18
|
formula = Plurimath::Mathml::Transform.new.apply(tree_t)
|
18
19
|
formula = [formula] unless formula.is_a?(Array) || formula.nil?
|
19
20
|
return if formula.nil?
|