latexmath 0.1.0 → 0.1.5
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/.editorconfig +14 -0
- data/.github/workflows/test.yml +80 -0
- data/.gitignore +11 -0
- data/.rubocop.yml +129 -0
- data/Gemfile +6 -3
- data/Gemfile.lock +44 -3
- data/README.adoc +28 -0
- data/Rakefile +93 -4
- data/bin/console +3 -3
- data/exe/latexmath +8 -0
- data/latexmath.gemspec +17 -14
- data/lib/latexmath.rb +76 -10
- data/lib/latexmath/aggregator.rb +351 -0
- data/lib/latexmath/constants/symbols.rb +3936 -0
- data/lib/latexmath/converter.rb +424 -0
- data/lib/latexmath/equation.rb +3 -30
- data/lib/latexmath/ext.rb +9 -0
- data/lib/latexmath/symbol.rb +21 -0
- data/lib/latexmath/tokenizer.rb +82 -0
- data/lib/latexmath/version.rb +1 -1
- data/lib/latexmath/xml/builder.rb +4 -0
- data/lib/latexmath/xml/element.rb +25 -0
- data/lib/unimathsymbols.js.erb +4 -0
- data/lib/unimathsymbols.txt +2864 -0
- data/opal/latexmath-opal.rb +40 -0
- data/opal/ox.rb +64 -0
- data/opal/pseudoenumerator.rb +19 -0
- metadata +74 -17
- data/.travis.yml +0 -6
- data/README.md +0 -40
- data/lib/latexmath/latexml_requirement.rb +0 -84
- data/lib/latexmath/requirement.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3dd210bb97aa808bf1bee45d595148730fd1e324917a7fe402c05dcda243357e
|
4
|
+
data.tar.gz: 2bf325bde0a31dee92da668bd985d11cbc43424aeb1a3e94397ffbe7b6803a95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0ee9acb802192c32b47f22a8563964efd6640d8d606cd622e9f152dd46fd4f1fbe7d2c017aa8f1cc0e769e3b69d20b3e111946be67faed4420f45a519078053
|
7
|
+
data.tar.gz: e3cf465915d734f68290aecb7d9b1c9747b9b8202b5c673536899f97356e0fef341428950c31782b228209e4ea4eeb06cb5e87a2b925478a3e05fbee4261f6b9
|
data/.editorconfig
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
build:
|
10
|
+
name: Run specs on ${{ matrix.os }} ruby ${{ matrix.ruby }}
|
11
|
+
runs-on: ${{ matrix.os }}
|
12
|
+
continue-on-error: ${{ matrix.experimental }}
|
13
|
+
strategy:
|
14
|
+
fail-fast: false
|
15
|
+
matrix:
|
16
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
17
|
+
ruby: ['2.6', '2.5', '2.4']
|
18
|
+
experimental: [false]
|
19
|
+
include:
|
20
|
+
- ruby: '2.7'
|
21
|
+
os: ubuntu-latest
|
22
|
+
experimental: true
|
23
|
+
- ruby: '2.7'
|
24
|
+
os: macos-latest
|
25
|
+
experimental: true
|
26
|
+
- ruby: '2.7'
|
27
|
+
os: windows-latest
|
28
|
+
experimental: true
|
29
|
+
|
30
|
+
steps:
|
31
|
+
- name: Use Ruby
|
32
|
+
uses: actions/setup-ruby@v1
|
33
|
+
with:
|
34
|
+
ruby-version: ${{ matrix.ruby }}
|
35
|
+
|
36
|
+
- uses: actions/checkout@master
|
37
|
+
|
38
|
+
- name: Install gems
|
39
|
+
run: |
|
40
|
+
gem install bundler -v "~> 2"
|
41
|
+
bundle install --jobs 4 --retry 5
|
42
|
+
|
43
|
+
- name: Install LaTeXML on Ubuntu
|
44
|
+
if: matrix.os == 'ubuntu-latest'
|
45
|
+
run: |
|
46
|
+
sudo snap install latexml --edge
|
47
|
+
echo "::add-path::/snap/bin"
|
48
|
+
|
49
|
+
- name: Install LaTeXML on macOS
|
50
|
+
if: matrix.os == 'macos-latest'
|
51
|
+
run: |
|
52
|
+
brew install libxml2 cpanminus
|
53
|
+
env PATH=$(brew --prefix libxml2)/bin:$PATH \
|
54
|
+
cpanm --notest XML::LibXSLT@1.96 git://github.com/brucemiller/LaTeXML.git@9a0e7dc5
|
55
|
+
|
56
|
+
- name: Install LaTeXML on Windows
|
57
|
+
if: matrix.os == 'windows-latest'
|
58
|
+
shell: cmd
|
59
|
+
run: |
|
60
|
+
cinst -y latexml
|
61
|
+
refreshenv
|
62
|
+
set PATH=C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;%PATH%
|
63
|
+
where latexmlmath
|
64
|
+
|
65
|
+
- name: Run RSpecs
|
66
|
+
if: matrix.os == 'ubuntu-latest'
|
67
|
+
run: |
|
68
|
+
bundle exec rake
|
69
|
+
|
70
|
+
- name: Run RSpecs
|
71
|
+
if: matrix.os == 'macos-latest'
|
72
|
+
run: |
|
73
|
+
env PATH=$(brew --prefix perl)/bin:$PATH bundle exec rake
|
74
|
+
|
75
|
+
- name: Run specs
|
76
|
+
if: matrix.os == 'windows-latest'
|
77
|
+
shell: pwsh
|
78
|
+
run: |
|
79
|
+
$env:Path = "C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;$env:Path"
|
80
|
+
bundle exec rake
|
data/.gitignore
CHANGED
@@ -7,5 +7,16 @@
|
|
7
7
|
/spec/reports/
|
8
8
|
/tmp/
|
9
9
|
|
10
|
+
# ignore generated file via Rakefile
|
11
|
+
#/lib/latexmath/constants/symbols.rb
|
12
|
+
|
10
13
|
# rspec failure tracking
|
11
14
|
.rspec_status
|
15
|
+
|
16
|
+
# ignore byebug history
|
17
|
+
.byebug_history
|
18
|
+
|
19
|
+
# ignore MacOS system file
|
20
|
+
.DS_Store
|
21
|
+
|
22
|
+
/dist/
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
Layout/EndAlignment:
|
2
|
+
Exclude:
|
3
|
+
- 'lib/latexmath/converter.rb'
|
4
|
+
- 'lib/latexmath/tokenizer.rb'
|
5
|
+
|
6
|
+
# Offense count: 1
|
7
|
+
# Configuration parameters: AllowSafeAssignment.
|
8
|
+
Lint/AssignmentInCondition:
|
9
|
+
Exclude:
|
10
|
+
- 'lib/latexmath/tokenizer.rb'
|
11
|
+
|
12
|
+
# Offense count: 2
|
13
|
+
Lint/ImplicitStringConcatenation:
|
14
|
+
Exclude:
|
15
|
+
- 'spec/tokenizer_spec.rb'
|
16
|
+
|
17
|
+
# Offense count: 1
|
18
|
+
# Configuration parameters: AllowKeywordBlockArguments.
|
19
|
+
Lint/UnderscorePrefixedVariableName:
|
20
|
+
Exclude:
|
21
|
+
- 'lib/latexmath/converter.rb'
|
22
|
+
|
23
|
+
# Offense count: 2
|
24
|
+
Lint/UselessAssignment:
|
25
|
+
Exclude:
|
26
|
+
- 'lib/latexmath/converter.rb'
|
27
|
+
|
28
|
+
# Offense count: 7
|
29
|
+
# Configuration parameters: IgnoredMethods.
|
30
|
+
Metrics/AbcSize:
|
31
|
+
Max: 32
|
32
|
+
|
33
|
+
# Offense count: 1
|
34
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
|
35
|
+
# ExcludedMethods: refine
|
36
|
+
Metrics/BlockLength:
|
37
|
+
Max: 35
|
38
|
+
|
39
|
+
# Offense count: 1
|
40
|
+
# Configuration parameters: CountBlocks.
|
41
|
+
Metrics/BlockNesting:
|
42
|
+
Max: 4
|
43
|
+
|
44
|
+
# Offense count: 1
|
45
|
+
# Configuration parameters: CountComments, CountAsOne.
|
46
|
+
Metrics/ClassLength:
|
47
|
+
Max: 157
|
48
|
+
|
49
|
+
# Offense count: 6
|
50
|
+
# Configuration parameters: IgnoredMethods.
|
51
|
+
Metrics/CyclomaticComplexity:
|
52
|
+
Max: 13
|
53
|
+
|
54
|
+
# Offense count: 9
|
55
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
|
56
|
+
Metrics/MethodLength:
|
57
|
+
Max: 39
|
58
|
+
|
59
|
+
# Offense count: 6
|
60
|
+
# Configuration parameters: IgnoredMethods.
|
61
|
+
Metrics/PerceivedComplexity:
|
62
|
+
Max: 14
|
63
|
+
|
64
|
+
# Offense count: 1
|
65
|
+
Naming/ConstantName:
|
66
|
+
Exclude:
|
67
|
+
- 'lib/latexmath.rb'
|
68
|
+
|
69
|
+
# Offense count: 2
|
70
|
+
# Cop supports --auto-correct.
|
71
|
+
# Configuration parameters: AutoCorrect, EnforcedStyle.
|
72
|
+
# SupportedStyles: nested, compact
|
73
|
+
Style/ClassAndModuleChildren:
|
74
|
+
Exclude:
|
75
|
+
- 'lib/latexmath/xml/builder.rb'
|
76
|
+
- 'lib/latexmath/xml/element.rb'
|
77
|
+
|
78
|
+
# Offense count: 7
|
79
|
+
Style/Documentation:
|
80
|
+
Exclude:
|
81
|
+
- 'spec/**/*'
|
82
|
+
- 'test/**/*'
|
83
|
+
- 'lib/latexmath.rb'
|
84
|
+
- 'lib/latexmath/aggregator.rb'
|
85
|
+
- 'lib/latexmath/converter.rb'
|
86
|
+
- 'lib/latexmath/equation.rb'
|
87
|
+
- 'lib/latexmath/tokenizer.rb'
|
88
|
+
|
89
|
+
# Offense count: 18
|
90
|
+
# Cop supports --auto-correct.
|
91
|
+
# Configuration parameters: EnforcedStyle.
|
92
|
+
# SupportedStyles: always, always_true, never
|
93
|
+
Style/FrozenStringLiteralComment:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
# Offense count: 2
|
97
|
+
# Configuration parameters: MinBodyLength.
|
98
|
+
Style/GuardClause:
|
99
|
+
Exclude:
|
100
|
+
- 'lib/latexmath/aggregator.rb'
|
101
|
+
|
102
|
+
# Offense count: 5
|
103
|
+
Style/IdenticalConditionalBranches:
|
104
|
+
Exclude:
|
105
|
+
- 'lib/latexmath/converter.rb'
|
106
|
+
|
107
|
+
# Offense count: 1
|
108
|
+
# Cop supports --auto-correct.
|
109
|
+
Style/LineEndConcatenation:
|
110
|
+
Exclude:
|
111
|
+
- 'spec/tokenizer_spec.rb'
|
112
|
+
|
113
|
+
# Offense count: 5
|
114
|
+
# Cop supports --auto-correct.
|
115
|
+
# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
|
116
|
+
# SupportedStyles: predicate, comparison
|
117
|
+
Style/NumericPredicate:
|
118
|
+
Exclude:
|
119
|
+
- 'spec/**/*'
|
120
|
+
- 'lib/latexmath/aggregator.rb'
|
121
|
+
- 'lib/latexmath/converter.rb'
|
122
|
+
|
123
|
+
# Offense count: 2
|
124
|
+
# Cop supports --auto-correct.
|
125
|
+
Style/ZeroLengthPredicate:
|
126
|
+
Exclude:
|
127
|
+
- 'lib/latexmath/converter.rb'
|
128
|
+
|
129
|
+
|
data/Gemfile
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in latexmath.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
gem
|
7
|
-
gem
|
6
|
+
gem 'byebug'
|
7
|
+
gem 'pry'
|
8
|
+
gem 'rake', '~> 12.0'
|
9
|
+
gem 'rspec', '~> 3.0'
|
10
|
+
gem 'rubocop'
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
latexmath (0.1.
|
4
|
+
latexmath (0.1.5)
|
5
5
|
htmlentities (~> 4.3)
|
6
|
-
|
6
|
+
ox (~> 2.13)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
+
ast (2.4.1)
|
12
|
+
byebug (11.1.3)
|
13
|
+
coderay (1.1.3)
|
11
14
|
diff-lcs (1.4.4)
|
15
|
+
equivalent-xml (0.6.0)
|
16
|
+
nokogiri (>= 1.4.3)
|
17
|
+
execjs (2.7.0)
|
12
18
|
htmlentities (4.3.4)
|
19
|
+
method_source (1.0.0)
|
20
|
+
mini_portile2 (2.4.0)
|
21
|
+
nokogiri (1.10.10)
|
22
|
+
mini_portile2 (~> 2.4.0)
|
23
|
+
opal (1.0.3)
|
24
|
+
ast (>= 2.3.0)
|
25
|
+
parser (~> 2.6)
|
26
|
+
ox (2.13.3)
|
27
|
+
parallel (1.19.2)
|
28
|
+
parser (2.7.1.4)
|
29
|
+
ast (~> 2.4.1)
|
30
|
+
pry (0.13.1)
|
31
|
+
coderay (~> 1.1)
|
32
|
+
method_source (~> 1.0)
|
33
|
+
rainbow (3.0.0)
|
13
34
|
rake (12.3.3)
|
35
|
+
regexp_parser (1.7.1)
|
36
|
+
rexml (3.2.4)
|
14
37
|
rspec (3.9.0)
|
15
38
|
rspec-core (~> 3.9.0)
|
16
39
|
rspec-expectations (~> 3.9.0)
|
@@ -24,15 +47,33 @@ GEM
|
|
24
47
|
diff-lcs (>= 1.2.0, < 2.0)
|
25
48
|
rspec-support (~> 3.9.0)
|
26
49
|
rspec-support (3.9.3)
|
27
|
-
|
50
|
+
rubocop (0.90.0)
|
51
|
+
parallel (~> 1.10)
|
52
|
+
parser (>= 2.7.1.1)
|
53
|
+
rainbow (>= 2.2.2, < 4.0)
|
54
|
+
regexp_parser (>= 1.7)
|
55
|
+
rexml
|
56
|
+
rubocop-ast (>= 0.3.0, < 1.0)
|
57
|
+
ruby-progressbar (~> 1.7)
|
58
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
59
|
+
rubocop-ast (0.3.0)
|
60
|
+
parser (>= 2.7.1.4)
|
61
|
+
ruby-progressbar (1.10.1)
|
62
|
+
unicode-display_width (1.7.0)
|
28
63
|
|
29
64
|
PLATFORMS
|
30
65
|
ruby
|
31
66
|
|
32
67
|
DEPENDENCIES
|
68
|
+
byebug
|
69
|
+
equivalent-xml
|
70
|
+
execjs
|
33
71
|
latexmath!
|
72
|
+
opal
|
73
|
+
pry
|
34
74
|
rake (~> 12.0)
|
35
75
|
rspec (~> 3.0)
|
76
|
+
rubocop
|
36
77
|
|
37
78
|
BUNDLED WITH
|
38
79
|
2.1.4
|
data/README.adoc
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
= latexmath
|
2
|
+
|
3
|
+
image:https://img.shields.io/gem/v/latexmath.svg["Gem Version", link="https://rubygems.org/gems/latexmath"]
|
4
|
+
image:https://github.com/metanorma/latexmath/workflows/test/badge.svg["Build Status", link="https://github.com/metanorma/latexmath/actions?workflow=test"]
|
5
|
+
image:https://codeclimate.com/github/metanorma/latexmath/badges/gpa.svg["Code Climate", link="https://codeclimate.com/github/metanorma/latexmath"]
|
6
|
+
image:https://img.shields.io/github/issues-pr-raw/metanorma/latexmath.svg["Pull Requests", link="https://github.com/metanorma/latexmath/pulls"]
|
7
|
+
image:https://img.shields.io/github/commits-since/metanorma/latexmath/latest.svg["Commits since latest",link="https://github.com/metanorma/latexmath/releases"]
|
8
|
+
|
9
|
+
== Purpose
|
10
|
+
|
11
|
+
Ruby gem to translate LaTeX math into MathML.
|
12
|
+
The MathML is supposed to be compliant with output of LaTeXML.
|
13
|
+
|
14
|
+
It also works in reverse by translating MathML into LaTeX code.
|
15
|
+
|
16
|
+
The LaTeX math syntax supports `amsmath`, `array`, `split` and `pmatrix` packages.
|
17
|
+
|
18
|
+
NOTE: Bolding, symbols like `\backepsilon`, equation alignment, are all supported.
|
19
|
+
|
20
|
+
== Usage
|
21
|
+
|
22
|
+
[source,ruby]
|
23
|
+
-------------
|
24
|
+
require "latexmath"
|
25
|
+
|
26
|
+
latex = "$$f_i = \sum_{j=1}^2 s_{ij} n_j \quad {\rm for} \quad i = 1,2$$"
|
27
|
+
mathml = Latexmath.parse(latex).to_mathml
|
28
|
+
-------------
|
data/Rakefile
CHANGED
@@ -1,6 +1,95 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
4
4
|
RSpec::Core::RakeTask.new(:spec)
|
5
5
|
|
6
|
-
task
|
6
|
+
task 'build-opal' do
|
7
|
+
require 'opal'
|
8
|
+
require 'erb'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
b = Opal::Builder.new
|
12
|
+
|
13
|
+
b.append_paths __dir__ + '/lib'
|
14
|
+
b.append_paths __dir__ + '/opal'
|
15
|
+
b.use_gem 'htmlentities'
|
16
|
+
|
17
|
+
build = b.build('latexmath-opal').to_s
|
18
|
+
# This is a hack intended for ExecJS to work properly.
|
19
|
+
build = build.gsub('Object freezing is not supported by Opal', '')
|
20
|
+
|
21
|
+
FileUtils.mkdir_p 'dist'
|
22
|
+
File.write('dist/latexmath.js', build)
|
23
|
+
end
|
24
|
+
|
25
|
+
task 'spec-opal' => 'build-opal' do
|
26
|
+
ENV['TEST_OPAL'] = '1'
|
27
|
+
Rake::Task['spec'].execute
|
28
|
+
ENV.delete 'TEST_OPAL'
|
29
|
+
end
|
30
|
+
|
31
|
+
def read_symbols(input)
|
32
|
+
@symbols = {}
|
33
|
+
File.readlines(input).each do |line|
|
34
|
+
next if line.start_with?('#')
|
35
|
+
|
36
|
+
columns = line.chop.split('^')
|
37
|
+
_unicode = columns[0]
|
38
|
+
latex = columns[2]
|
39
|
+
unicode_math = columns[3]
|
40
|
+
|
41
|
+
@symbols[latex] = _unicode if latex && !@symbols.include?(latex)
|
42
|
+
@symbols[unicode_math] = _unicode if unicode_math && !@symbols.include?(unicode_math)
|
43
|
+
|
44
|
+
matches = columns[-1].match(/=\s+(\\[^,^ ]+),?/)
|
45
|
+
if matches
|
46
|
+
@symbols[matches[1]] = _unicode unless @symbols[matches[1]]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@symbols
|
50
|
+
end
|
51
|
+
|
52
|
+
directory 'lib/latexmath/constants'
|
53
|
+
file 'lib/latexmath/constants/symbols.rb' => [
|
54
|
+
'lib/latexmath/constants',
|
55
|
+
'lib/unimathsymbols.txt'
|
56
|
+
] do |file|
|
57
|
+
symbols = read_symbols(file.prerequisites.last)
|
58
|
+
|
59
|
+
File.open(file.name, "w+") do |f|
|
60
|
+
f.puts <<~HERE
|
61
|
+
module Latexmath
|
62
|
+
module Constants
|
63
|
+
SYMBOLS = {
|
64
|
+
HERE
|
65
|
+
|
66
|
+
@symbols.each_pair do |k,v|
|
67
|
+
f.puts(" '#{k.to_s}' => '#{v}',")
|
68
|
+
end
|
69
|
+
|
70
|
+
f.puts <<~HERE
|
71
|
+
}.freeze
|
72
|
+
end
|
73
|
+
end
|
74
|
+
HERE
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Rake::Task['build'].enhance ['lib/latexmath/constants/symbols.rb']
|
79
|
+
Rake::Task[:spec].enhance ['lib/latexmath/constants/symbols.rb']
|
80
|
+
|
81
|
+
desc 'Generate and write MathML fixtures'
|
82
|
+
task 'create-mathml-fixtures' do
|
83
|
+
require_relative 'lib/latexmath'
|
84
|
+
records = Dir.glob('spec/fixtures/*/*.tex')
|
85
|
+
|
86
|
+
records.each do |file|
|
87
|
+
tex = File.read("./#{file}")
|
88
|
+
tokens = Latexmath::Tokenizer.new(tex).tokenize
|
89
|
+
aggr = Latexmath::Aggregator.new(tokens).aggregate
|
90
|
+
|
91
|
+
File.write("./#{file.chomp('.tex')}.html", Latexmath::Converter.new(aggr).convert)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
task default: [:spec, 'spec-opal']
|