texml 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/texml +24 -6
- data/lib/texml.rb +29 -44
- metadata +21 -6
data/bin/texml
CHANGED
@@ -1,12 +1,30 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require '
|
3
|
-
require 'texml'
|
2
|
+
require 'optparse'
|
4
3
|
|
5
|
-
xml = ARGF.read
|
6
4
|
begin
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
require 'rubygems'
|
6
|
+
require 'texml'
|
7
|
+
rescue LoadError
|
8
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'texml.rb')
|
9
|
+
end
|
10
|
+
|
11
|
+
opts = OptionParser.new do |opts|
|
12
|
+
opts.banner = "texml: a TeXML to TeX converter"
|
13
|
+
opts.define_head "Usage: texml [options] <path>"
|
14
|
+
opts.separator ""
|
15
|
+
opts.separator "Options:"
|
16
|
+
|
17
|
+
opts.on("-h", "--help", "Show this message") do
|
18
|
+
puts opts
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
end
|
22
|
+
opts.parse!
|
23
|
+
|
24
|
+
path = ARGV.shift
|
25
|
+
if path.to_s.strip.empty?
|
26
|
+
puts opts
|
10
27
|
exit 1
|
11
28
|
end
|
12
29
|
|
30
|
+
print TeXML.convert(IO.read(path))
|
data/lib/texml.rb
CHANGED
@@ -1,23 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Version: 0.4
|
5
|
-
# Web page: http://github.com/pcdavid/ruby-texml
|
6
|
-
# Depends on: xmlparser (available on RAA)
|
7
|
-
# License: WTFPL: http://sam.zoy.org/wtfpl/COPYING
|
8
|
-
|
9
|
-
# Based of Douglas Lovell's paper:
|
10
|
-
# "TeXML: Typesetting with TeX", Douglas Lovell, IBM Research
|
11
|
-
# in TUGboat, Volume 20 (1999), No. 3
|
12
|
-
#
|
13
|
-
# Original implementation in Java by D. Lovell, available on IBM
|
14
|
-
# alphaWorks: http://www.alphaworks.ibm.com/tech/texml
|
15
|
-
#
|
16
|
-
# Usage: % texml.rb < input.xml > output.tex
|
17
|
-
|
18
|
-
require "xmltreebuilder"
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'nokogiri'
|
19
4
|
|
20
5
|
module TeXML
|
6
|
+
# Converts a TeXML document, passed as a raw XML string, into the
|
7
|
+
# corresponding (La)TeX document.
|
8
|
+
def TeXML.convert(xml)
|
9
|
+
document = Nokogiri::XML(xml)
|
10
|
+
TeXML::Node.create(document.root).to_tex
|
11
|
+
end
|
21
12
|
|
22
13
|
# Escaping sequences for LaTeX special characters
|
23
14
|
SPECIAL_CHAR_ESCAPES = {
|
@@ -36,14 +27,6 @@ module TeXML
|
|
36
27
|
'\\'[0] => '$\\backslash${}'#'
|
37
28
|
}
|
38
29
|
|
39
|
-
# Converts a TeXML document, passed as a raw XML string, into the
|
40
|
-
# corresponding (La)TeX document.
|
41
|
-
def TeXML.convert(xml)
|
42
|
-
builder = XML::SimpleTreeBuilder.new
|
43
|
-
tree = builder.parse(xml)
|
44
|
-
TeXML::Node.create(tree.documentElement).to_tex
|
45
|
-
end
|
46
|
-
|
47
30
|
# Given a raw string, returns a copy with all (La)TeX special
|
48
31
|
# characters properly quoted.
|
49
32
|
def TeXML.quote(str)
|
@@ -63,10 +46,12 @@ module TeXML
|
|
63
46
|
# Creates a node handler object appropriate for the specified XML
|
64
47
|
# node, based on the name of the node (uses information from
|
65
48
|
# NODE_HANDLERS).
|
66
|
-
def Node.create(
|
67
|
-
|
49
|
+
def Node.create(node)
|
50
|
+
kind = node.name
|
51
|
+
kind = '#text' if kind == 'text'
|
52
|
+
handlerClass = NODE_HANDLERS[kind]
|
68
53
|
if !handlerClass.nil?
|
69
|
-
handlerClass.new(
|
54
|
+
handlerClass.new(node)
|
70
55
|
else
|
71
56
|
nil
|
72
57
|
end
|
@@ -81,8 +66,8 @@ module TeXML
|
|
81
66
|
# of the children.
|
82
67
|
def childrenValue(*childTypes)
|
83
68
|
tex = ''
|
84
|
-
@node.
|
85
|
-
if childTypes.include?(kid.
|
69
|
+
@node.children.each do |kid|
|
70
|
+
if childTypes.include?(kid.name) || (kid.text? && childTypes.include?('#text'))
|
86
71
|
node = Node.create(kid)
|
87
72
|
tex << node.to_tex unless node.nil?
|
88
73
|
end
|
@@ -103,9 +88,9 @@ module TeXML
|
|
103
88
|
NODE_HANDLERS['cmd'] = CmdNode
|
104
89
|
|
105
90
|
def to_tex
|
106
|
-
name = @node
|
107
|
-
nl_before = (@node
|
108
|
-
nl_after = (@node
|
91
|
+
name = @node['name']
|
92
|
+
nl_before = (@node['nl1'] == '1') ? "\n" : ''
|
93
|
+
nl_after = (@node['nl2'] == '1') ? "\n" : ''
|
109
94
|
return nl_before + "\\#{name}" + childrenValue('opt') + childrenValue('parm') + ' ' + nl_after
|
110
95
|
end
|
111
96
|
end
|
@@ -114,10 +99,10 @@ module TeXML
|
|
114
99
|
NODE_HANDLERS['env'] = EnvNode
|
115
100
|
|
116
101
|
def to_tex
|
117
|
-
name = @node
|
118
|
-
start = @node
|
102
|
+
name = @node['name']
|
103
|
+
start = @node['begin']
|
119
104
|
start = 'begin' if start == ''
|
120
|
-
stop = @node
|
105
|
+
stop = @node['end']
|
121
106
|
stop = 'end' if stop == ''
|
122
107
|
return "\\#{start}{#{name}}\n" +
|
123
108
|
childrenValue('cmd', 'env', 'ctrl', 'spec', '#text') +
|
@@ -145,9 +130,9 @@ module TeXML
|
|
145
130
|
NODE_HANDLERS['ctrl'] = CtrlNode
|
146
131
|
|
147
132
|
def to_tex
|
148
|
-
ch = @node
|
133
|
+
ch = @node['ch']
|
149
134
|
unless ch.nil?
|
150
|
-
return ch & 0x9F # Control version of ch
|
135
|
+
return ch[0] & 0x9F # Control version of ch
|
151
136
|
else
|
152
137
|
nil
|
153
138
|
end
|
@@ -179,7 +164,7 @@ module TeXML
|
|
179
164
|
}
|
180
165
|
|
181
166
|
def to_tex
|
182
|
-
cat = @node
|
167
|
+
cat = @node['cat']
|
183
168
|
return (SPECIAL_MAP[cat] or '')
|
184
169
|
end
|
185
170
|
end
|
@@ -188,11 +173,11 @@ module TeXML
|
|
188
173
|
NODE_HANDLERS['#text'] = TextNode
|
189
174
|
|
190
175
|
def to_tex
|
191
|
-
parent = @node.
|
192
|
-
if parent.
|
193
|
-
return @node.
|
176
|
+
parent = @node.parent
|
177
|
+
if parent.name == 'env' && parent['name'] == 'verbatim'
|
178
|
+
return @node.to_s
|
194
179
|
else
|
195
|
-
return TeXML.quote(@node.
|
180
|
+
return TeXML.quote(@node.to_s)
|
196
181
|
end
|
197
182
|
end
|
198
183
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: texml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 5
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Pierre-Charles David
|
@@ -15,10 +15,25 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-14 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: nokogiri
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 4
|
33
|
+
- 1
|
34
|
+
version: 1.4.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
22
37
|
description: "This program converts an XML document conforming to the TeXML syntax into the corresponding (La)TeX document, ready to be typeset. It is based on Douglas Lovell's paper: \"TeXML: Typesetting with TeX\", Douglas Lovell, IBM Research in TUGboat, Volume 20 (1999), No. 3"
|
23
38
|
email: pcdavid@gmail.com
|
24
39
|
executables:
|