plurimath 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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?
|