mathml 0.8.1 → 0.10.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.
@@ -0,0 +1,14 @@
1
+ require "math_ml"
2
+
3
+ describe MathML do
4
+ it "should not raise error when math_ml.rb is required twice" do
5
+ if require("lib/math_ml")
6
+ lambda{MathML::LaTeX::Parser.new}.should_not raise_error
7
+ end
8
+ end
9
+
10
+ it ".pcstring" do
11
+ MathML.pcstring('<>&"\'').to_s.should == "&lt;&gt;&amp;&quot;&apos;"
12
+ MathML.pcstring('<tag>&amp;"\'</tag>', true).to_s.should == '<tag>&amp;"\'</tag>'
13
+ end
14
+ end
@@ -0,0 +1,38 @@
1
+ require "rspec"
2
+ module MathML
3
+ module Spec
4
+ module Util
5
+ def raise_parse_error(message, done, rest)
6
+ RSpec::Matchers::Matcher.new(:raise_parse_error) do
7
+ match do |given|
8
+ begin
9
+ given.call
10
+ @error = nil
11
+ rescue Exception
12
+ @error = $!
13
+ end
14
+ @error.is_a?(MathML::LaTeX::ParseError) &&
15
+ [@error.message, @error.done, @error.rest] == [message, done, rest]
16
+ end
17
+ end
18
+ end
19
+
20
+ def new_parser
21
+ MathML::LaTeX::Parser.new
22
+ end
23
+
24
+ def math_ml(src, display_style=false, parser=nil)
25
+ parser ||= @parser || new_parser
26
+ parser.parse(src, display_style)
27
+ end
28
+
29
+ def strip_math_ml(math_ml)
30
+ math_ml.to_s.gsub(/>\s*/, ">").gsub(/\s*</, "<")[/\A<math [^>]*>(.*)<\/math>\Z/m, 1]
31
+ end
32
+
33
+ def smml(src, display_style=false, parser=nil)
34
+ strip_math_ml(math_ml(src, display_style, parser))
35
+ end
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mathml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ hash: 53
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 10
9
+ - 1
10
+ version: 0.10.1
5
11
  platform: ruby
6
12
  authors:
7
13
  - KURODA Hiraku
@@ -9,79 +15,90 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2008-03-24 00:00:00 +09:00
13
- default_executable:
18
+ date: 2011-07-19 00:00:00 Z
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: eimxml
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
19
25
  requirements:
20
26
  - - ">="
21
27
  - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
22
31
  version: "0"
23
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
24
34
  description:
25
35
  email: hiraku@hinet.mydns.jp
26
36
  executables: []
27
37
 
28
38
  extensions: []
29
39
 
30
- extra_rdoc_files:
31
- - README
40
+ extra_rdoc_files: []
41
+
32
42
  files:
33
- - lib
43
+ - Rakefile.utirake
44
+ - Rakefile
34
45
  - lib/math_ml.rb
35
- - lib/math_ml
36
46
  - lib/math_ml/string.rb
37
47
  - lib/math_ml/util.rb
38
- - README
39
- - symbols
40
- - symbols/fetch_symbol_test.rb
41
- - symbols/list.txt
42
- - symbols/fetch_symbol.rb
43
- - Rakefile
44
- - test
45
- - test/util_test.rb
46
- - test/math_ml_test_util_test.rb
47
- - test/math_ml_test.rb
48
- - test/math_ml_test_util.rb
49
- - test/string_test.rb
50
- has_rdoc: true
48
+ - lib/math_ml/symbol/entity_reference.rb
49
+ - lib/math_ml/symbol/utf8.rb
50
+ - lib/math_ml/symbol/character_reference.rb
51
+ - lib/math_ml/latex/builtin/symbol.rb
52
+ - lib/math_ml/latex/builtin.rb
53
+ - lib/math_ml/latex.rb
54
+ - lib/math_ml/element.rb
55
+ - spec/util.rb
56
+ - spec/math_ml_spec.rb
57
+ - spec/math_ml/element_spec.rb
58
+ - spec/math_ml/string_spec.rb
59
+ - spec/math_ml/latex/scanner_spec.rb
60
+ - spec/math_ml/latex/parser_spec.rb
61
+ - spec/math_ml/latex/macro_spec.rb
62
+ - spec/math_ml/util_spec.rb
51
63
  homepage: http://mathml.rubyforge.org/
52
- post_install_message:
53
- rdoc_options:
54
- - -S
55
- - -w
56
- - "3"
57
- - -c
58
- - UTF-8
59
- - -m
60
- - README
64
+ licenses: []
65
+
66
+ post_install_message: |-
67
+ ************************************************************
68
+ [DEPRECATION]
69
+ "mathml" gem is deprecated.
70
+ Please use "math_ml" gem instead.
71
+ ************************************************************
72
+ rdoc_options: []
73
+
61
74
  require_paths:
62
75
  - lib
63
76
  required_ruby_version: !ruby/object:Gem::Requirement
77
+ none: false
64
78
  requirements:
65
79
  - - ">="
66
80
  - !ruby/object:Gem::Version
81
+ hash: 3
82
+ segments:
83
+ - 0
67
84
  version: "0"
68
- version:
69
85
  required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
70
87
  requirements:
71
- - - ">="
88
+ - - ">"
72
89
  - !ruby/object:Gem::Version
73
- version: "0"
74
- version:
90
+ hash: 25
91
+ segments:
92
+ - 1
93
+ - 3
94
+ - 1
95
+ version: 1.3.1
75
96
  requirements: []
76
97
 
77
98
  rubyforge_project: mathml
78
- rubygems_version: 1.0.1
99
+ rubygems_version: 1.8.5
79
100
  signing_key:
80
- specification_version: 2
101
+ specification_version: 3
81
102
  summary: MathML Library
82
- test_files:
83
- - test/util_test.rb
84
- - test/math_ml_test_util_test.rb
85
- - test/math_ml_test.rb
86
- - test/math_ml_test_util.rb
87
- - test/string_test.rb
103
+ test_files: []
104
+
data/README DELETED
@@ -1,58 +0,0 @@
1
- = MathML Library
2
- :lang:ja
3
- 本ライブラリは、LaTeXの記法にしたがって記述された数式をMathMLに変換する処理を提供します。
4
-
5
- :lang:en
6
- This library provide converter from LaTeX mathematical expressions to MathML.
7
-
8
- :lang:
9
- = URLs
10
- * Documents(Japanese)[http://mathml.rubyforge.org/ja/]
11
- * Documents(Englise)[http://mathml.rubyforge.org/en/]
12
- * MercurialRepository[https://hg.hinet.mydns.jp/math_ml/]
13
-
14
- = Example
15
- :lang:ja
16
- 例えば MathML::String による Stringクラスの拡張を使えば、次のようにして変換処理を呼び出すことが出来ます。
17
-
18
- :lang:en
19
- For example, using extension of String class by MathML::String, you can use converter like bellow.
20
-
21
- :lang:
22
- #!/usr/bin/ruby
23
- # require "rubygems"
24
- require "math_ml/string"
25
- puts 'x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}'.to_mathml
26
-
27
- :lang:ja
28
- このスクリプトの出力は次のようになります。
29
-
30
- :lang:en
31
- Output of this script is bellow.
32
-
33
- :lang:
34
- <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'>
35
- <mi>x</mi>
36
- <mo>=</mo>
37
- <mfrac>
38
- <mrow>
39
- <mo>-</mo>
40
- <mi>b</mi>
41
- <mo>&pm;</mo>
42
- <msqrt><mrow>
43
- <msup>
44
- <mi>b</mi>
45
- <mn>2</mn>
46
- </msup>
47
- <mo>-</mo>
48
- <mn>4</mn>
49
- <mi>a</mi>
50
- <mi>c</mi>
51
- </mrow></msqrt>
52
- </mrow>
53
- <mrow>
54
- <mn>2</mn>
55
- <mi>a</mi>
56
- </mrow>
57
- </mfrac>
58
- </math>
@@ -1,446 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- $:.unshift("../")
4
- require "cgi"
5
- require "math_ml"
6
-
7
- include MathML::LaTeX
8
-
9
- BEC = /\\.|[^\\\n]/ # Back slash Escaped Character
10
- TEXMF_DIR = "/usr/share/texmf-tetex"
11
-
12
- def brace_nest(s)
13
- nest=0
14
- s.gsub(/(\{|\})/) do
15
- case $1
16
- when "{"
17
- nest+=1
18
- "{#{nest}."
19
- when "}"
20
- nest-=1
21
- "}#{nest+1}."
22
- end
23
- end
24
- end
25
-
26
- def load_style(name)
27
- r = IO.read("#{TEXMF_DIR}/tex/latex/#{name}").gsub(/^\%.*\n/, "").gsub(/^(#{BEC}*?)\%.*$/){$1}
28
- end
29
-
30
- def parse_DeclareMath(f, delims, robust_as_math = false)
31
- r = Hash.new
32
-
33
- f=f.gsub(/[a-zA-Z]\\Declare/, "")
34
- f.scan(/\\DeclareMathSymbol|\\DeclareRobustCommand/) do
35
- remain = Scanner.new($')
36
- com = remain.scan_block ? remain[1] : remain.scan_command
37
- next unless com=~/\A\\/
38
- remain.scan_option
39
- body = remain.scan_block ? remain[1] : remain.scan_any
40
- case body
41
- when /nomath/, /not@math/
42
- next
43
- when /\\mathord/, /\\mathalpha/, /\\mathbin/, /\\mathrel/, /\\mathpunct/
44
- r[com] = :subsup
45
- when /\\mathop/
46
- r[com] = :underover
47
- else
48
- r[com] = robust_as_math ? :subsup : body
49
- end
50
- end
51
-
52
- f.scan(/\\DeclareMathDelimiter\{(\\.+?)\}\s*\{(\\.+?)\}/m) do |m|
53
- case m[1]
54
- when "\\mathopen", "\\mathclose", "\\mathord", "\\mathrel"
55
- r[m[0]] = :subsup
56
- else
57
- raise "#{m[0]} : #{m[1]}"
58
- end
59
- delims << m[0]
60
- end
61
-
62
- f.scan(/\\let(\\.+?)=?(\\.*)/) do |m|
63
- r[m[0]] = m[1] unless r.include?(m[0]) # excepting "\let\com\undefined" or like it.
64
- end
65
-
66
- r
67
- end
68
-
69
- def trace_list(com, h, d)
70
- s = h[com]
71
- mmode = (s=~/\\ifmmode/ || s=~/mathinner/)
72
- if s.is_a?(String)
73
- sc = Scanner.new(s.dup.gsub(/[{}]/, ""))
74
- until sc.eos?
75
- b = sc.scan_any
76
- s.slice!(0, b.size)
77
- next unless h.include?(b)
78
- trace_list(b, h, d)
79
- h[com] = h[b] if h[com].is_a?(String)
80
- unless d.include?(com)
81
- d << com if d.include?(b)
82
- end
83
- end
84
- end
85
- if h[com].is_a?(String)
86
- if mmode
87
- h[com] = :subsup
88
- else
89
- h.delete(com)
90
- end
91
- end
92
- end
93
-
94
- def fetch_symbol(delims=[])
95
- r = {}
96
-
97
- f = load_style("base/latex.ltx")
98
- r.merge!(parse_DeclareMath(f, delims))
99
- f.scan(/^\\def(\\[a-zA-Z]+?)\{\\mathop(\W.*)$/) do |s|
100
- if s[1]=~/\\nolimits/
101
- r[s[0]] = :subsup
102
- else
103
- r[s[0]] = :underover
104
- end
105
- end
106
- f.scan(/\\chardef(\\.)=\`\1/) do |m|
107
- r[m[0]] = :subsup
108
- end
109
-
110
- f = load_style("base/latexsym.sty")
111
- r.merge!(parse_DeclareMath(f, delims))
112
-
113
- f = load_style("base/fontmath.ltx")
114
- r.merge!(parse_DeclareMath(f, delims, true))
115
- brace_nest(f).scan(/\\def(\\.+?)\{1\.(.*?)\}1\./m) do |m|
116
- if m[0]=~/@|#/
117
- elsif m[1]=~/\A\$/
118
- else
119
- r[m[0]] = :subsup
120
- end
121
- end
122
- f.scan(/\\def(\\[^\{]+?)(\\.+)/) do |m|
123
- raise StandardError.new("Uncaught commands")
124
- end
125
-
126
- f = load_style("amsfonts/amssymb.sty")
127
- r.merge!(parse_DeclareMath(f, delims))
128
-
129
- f = load_style("amsfonts/amsfonts.sty")
130
- r.merge!(parse_DeclareMath(f, delims))
131
-
132
- r.each_key do |k|
133
- r.delete(k) if k=~/@/
134
- end
135
-
136
- r.each_key do |k|
137
- trace_list(k, r, delims) if r[k].is_a?(String)
138
- end
139
- r
140
- end
141
-
142
- def sort_symbol_list_in(file, h)
143
- r = Array.new
144
- f = load_style(file)
145
- f.scan(/\\[a-zA-Z@\#]+|\\./) do |m|
146
- if h[m]
147
- r << m
148
- h.delete(m)
149
- end
150
- end
151
- r
152
- end
153
-
154
- def sorted_symbol_list(h)
155
- h = h.dup
156
- r = Array.new
157
- r.concat(sort_symbol_list_in("base/latex.ltx", h))
158
- r.concat(sort_symbol_list_in("base/fontmath.ltx", h))
159
- r.concat(sort_symbol_list_in("amsfonts/amssymb.sty", h))
160
- r.concat(sort_symbol_list_in("amsfonts/amsfonts.sty", h))
161
- r
162
- end
163
-
164
- def load_preput_list(list)
165
- r = {}
166
- list.each do |l|
167
- next if l=~/\A\s*\#/
168
- com, type, str = l.chomp.split(nil, 3)
169
- r[com] = [type.to_sym, str]
170
- end
171
- r
172
- end
173
-
174
- def output_list(h, preput=nil)
175
- p = preput ? load_preput_list(preput) : {}
176
- sorted_symbol_list(h).each do |k|
177
- data = p.include?(k) ? p[k][1] : ""
178
- # puts "#{k} #{h[k]} #{data}"
179
- end
180
-
181
- $stderr.puts "### Update"
182
- sorted_symbol_list(h).each do |k|
183
- $stderr.puts k unless p.include?(k)
184
- end
185
-
186
- $stderr.puts "### Conflict"
187
- sorted_symbol_list(h).each do |k|
188
- next unless p.include?(k)
189
- $stderr.puts k unless p[k][0]==h[k]
190
- end
191
-
192
- $stderr.puts "### Missing"
193
- p.each_key do |k|
194
- $stderr.puts k unless h.include?(k)
195
- end
196
- end
197
-
198
- def output_latex(h)
199
- puts <<'EOT'
200
- \documentclass{article}
201
- \usepackage{amssymb}
202
- \newcommand{\bslash}{\texttt{\symbol{92}}}
203
- \setlength{\oddsidemargin}{-1cm}
204
- \setlength{\evensidemargin}{-1cm}
205
- \begin{document}
206
- EOT
207
- col = 4
208
- row=18
209
- l = sorted_symbol_list(h)
210
- (0 ... l.size).step(col*row) do |t|
211
- puts '\begin{tabular}{|'+"c|"*col+'}\hline'
212
- (0 ... col*row).step(col) do |r|
213
- next unless l[t+r]
214
- (0 ... col).each do |c|
215
- i = t+r+c
216
- com = l[i].to_s.gsub(/\\/, "\\bslash ").gsub(/([\$\{\}\#\%\&_])/){"\\#$1"}.
217
- gsub(/\|/, "\\texttt|")
218
- tex = l[i].to_s.dup
219
- if l[i]
220
- case h[l[i]]
221
- when :subsup
222
- tex << "_{sub}^{sup}"
223
- when :underover
224
- tex << "_{under}^{over}"
225
- else
226
- raise StandardError
227
- end
228
- end
229
- tex = "$\\displaystyle#{tex}$"
230
- str = (l[i] ? <<EOT : "")
231
- \\begin{tabular}{c}
232
- #{t+r+c} #{com} \\\\
233
- #{tex}
234
- \\end{tabular}
235
- EOT
236
- print str+(c==(col-1) ? " \\\\ \\hline\n" : " & ")
237
- end
238
- end
239
- puts "\\end{tabular}\n\n"
240
- end
241
- puts '\end{document}'
242
- end
243
-
244
- def parse_list(list)
245
- a = []
246
- h = {}
247
- list.each do |l|
248
- next if l =~ /^\s*\#/
249
- com, type, str = l.chomp.split(nil, 3)
250
-
251
- case type
252
- when "subsup"
253
- type = :s
254
- when "underover"
255
- type = :u
256
- else
257
- raise l
258
- end
259
-
260
- str.slice!(/\s*\#.*$/)
261
- el = nil
262
- cl = nil
263
- s = nil
264
- case str
265
- when /^([oinI])([\-\:=])(.*)$/
266
- el = $1
267
- cl = $2
268
- s = $3
269
- when "v"
270
- when ""
271
- cl = true
272
- else
273
- raise l
274
- end
275
- a << com
276
- case cl
277
- when "-"
278
- h[com] = [type, el.to_sym, s ? s : ""]
279
- when ":"
280
- h[com] = [type, el.to_sym, s.to_s.length>0 ? s.to_sym : nil]
281
- when "="
282
- s = "0"+s if s=~/^x/
283
- h[com] = [type, el.to_sym, s.to_i(0)]
284
- when true
285
- h[com] = [type, nil, nil]
286
- when nil
287
- h[com] = nil
288
- else
289
- raise l
290
- end
291
- h[com].pop while h[com] && h[com].last==nil
292
- end
293
- [a, h]
294
- end
295
-
296
- def to_mathml(com, data)
297
- com = com[/^\\(.*)$/, 1]
298
- unless data
299
- ""
300
- else
301
- data[1] = :o unless data[1]
302
- p=""
303
- case data[1]
304
- when :i
305
- p = " mathvariant='normal'" unless data[2] && data[2].is_a?(String)
306
- when :I
307
- data[1] = :i
308
- end
309
-
310
- case data[2]
311
- when String
312
- if data[2].length>0
313
- s = data[2]
314
- else
315
- s = com
316
- end
317
- when Symbol
318
- s = "&#{data[2].to_s};"
319
- when Integer
320
- s = "&\#x#{data[2].to_s(16)};"
321
- when nil
322
- s = "&#{com};"
323
- else
324
- raise data[2]
325
- end
326
-
327
- e = "m#{data[1].to_s}"
328
- "<#{e}#{p}>#{s}</#{e}>"
329
- end
330
- end
331
-
332
- def output_xhtml(list)
333
- a, h = parse_list(list)
334
- puts <<EOT
335
- <?xml version='1.0'?>
336
- <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN' 'http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd'>
337
- <html xmlns='http://www.w3.org/1999/xhtml'>
338
- <body>
339
- <ul>
340
- EOT
341
- a.each do |k|
342
- raise k unless h.include?(k)
343
- e = to_mathml(k, h[k])
344
- e = nil unless e.length>0
345
- mml = e ? "<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'>#{e}</math>" : ""
346
- puts "<li>#{CGI.escapeHTML(k)} : #{mml}</li>"
347
- end
348
- puts <<EOT
349
- </ul></body></html>
350
- EOT
351
- end
352
-
353
- def output_hiki(h)
354
- col = 5
355
- row=20
356
- l = sorted_symbol_list(h)
357
- (0 ... l.size).step(col*row) do |t|
358
- (0 ... col*row).step(col) do |r|
359
- next unless l[t+r]
360
- print "||"
361
- (0 ... col).each do |c|
362
- i = t+r+c
363
- com = l[i].to_s.gsub(/\\/){"\\\\"}.gsub(/\$/){%[\\$]}.gsub(/([\{\}])/){"\\\\#$1"}
364
- tex = l[i].to_s.dup
365
- if l[i]
366
- case h[l[i]]
367
- when :subsup
368
- tex << "_{sub}^{sup}"
369
- when :underover
370
- tex << "_{under}^{over}"
371
- else
372
- raise StandardError
373
- end
374
- end
375
- print " #{com} $$#{tex}$$ ||"
376
- end
377
- puts ""
378
- end
379
- end
380
- end
381
-
382
- def gen_rb(list)
383
- a, h = parse_list(list)
384
- r = "SymbolCommands={\n"
385
- a.each do |k|
386
- d = h[k]
387
- unless d
388
- v = "nil"
389
- else
390
- v = "[:#{d[0].to_s}"
391
- unless d[1]
392
- v << "]"
393
- else
394
- v << ",:#{d[1].to_s}"
395
- unless d[2]
396
- v << "]"
397
- else
398
- case d[2]
399
- when String
400
- v << %[,"#{d[2].gsub(/\\/){"\\\\"}}"]
401
- when Symbol
402
- v << ",:#{d[2].to_s}"
403
- when Fixnum
404
- v << ",0x#{d[2].to_s(16)}"
405
- else
406
- raise [k, d]
407
- end
408
- v << "]"
409
- end
410
- end
411
- end
412
- r << %["#{k[/^\\(.*)/, 1].gsub(/\\/){"\\\\"}}"=>#{v},\n]
413
- end
414
- r << "}\n"
415
- end
416
-
417
- def output_delims
418
- d = []
419
- fetch_symbol(d)
420
- puts "Delimiters=["
421
- d.each do |i|
422
- puts %["#{i.gsub(/\\/){""}}",]
423
- end
424
- puts "]"
425
- end
426
-
427
- def read_list
428
- IO.read($*[1] || "list.txt")
429
- end
430
- if (File.expand_path(__FILE__)==File.expand_path($0)) && $*[0]
431
- case $*[0]
432
- when "list"
433
- preput = $*[1] ? IO.read($*[1]) : nil
434
- output_list(fetch_symbol, preput)
435
- when "latex"
436
- output_latex(fetch_symbol)
437
- when "xhtml"
438
- output_xhtml(read_list)
439
- when "hiki"
440
- output_hiki(fetch_symbol)
441
- when "delims"
442
- output_delims
443
- when "rb"
444
- puts gen_rb(read_list)
445
- end
446
- end