mathml 0.8.1 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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