deplate 0.7.3
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.
- data/AUTHORS.TXT +26 -0
- data/CHANGES.TXT +177 -0
- data/LICENSE.TXT +340 -0
- data/NEWS.TXT +29 -0
- data/README.TXT +86 -0
- data/TODO.TXT +202 -0
- data/VERSION.TXT +1 -0
- data/bin/deplate +3 -0
- data/bin/deplate.bat +2 -0
- data/etc/deplate.ini +361 -0
- data/lib/deplate.rb +31 -0
- data/lib/deplate/abstract-class.rb +30 -0
- data/lib/deplate/builtin.rb +11 -0
- data/lib/deplate/cache.rb +59 -0
- data/lib/deplate/commands.rb +693 -0
- data/lib/deplate/common.rb +335 -0
- data/lib/deplate/converter.rb +99 -0
- data/lib/deplate/core.rb +2705 -0
- data/lib/deplate/css/article.css +545 -0
- data/lib/deplate/css/deplate.css +699 -0
- data/lib/deplate/css/heading-navbar.css +29 -0
- data/lib/deplate/css/layout-deplate-print.css +540 -0
- data/lib/deplate/css/layout-deplate.css +764 -0
- data/lib/deplate/css/sans-serif.css +160 -0
- data/lib/deplate/css/serif-e.css +170 -0
- data/lib/deplate/css/serif-rel.css +121 -0
- data/lib/deplate/css/serif.css +190 -0
- data/lib/deplate/css/slides.css +11 -0
- data/lib/deplate/css/tabbar-left.css +91 -0
- data/lib/deplate/css/tabbar-right-ie.css +14 -0
- data/lib/deplate/css/tabbar-right.css +118 -0
- data/lib/deplate/css/tabbar-top.css +64 -0
- data/lib/deplate/css/tabbar.css +81 -0
- data/lib/deplate/css/text-sans-serif.css +154 -0
- data/lib/deplate/css/text-serif.css +175 -0
- data/lib/deplate/define.rb +439 -0
- data/lib/deplate/docbook.rb +738 -0
- data/lib/deplate/elements.rb +1355 -0
- data/lib/deplate/etc.rb +199 -0
- data/lib/deplate/external.rb +135 -0
- data/lib/deplate/fmt/dbk-article-4.1.2.rb +21 -0
- data/lib/deplate/fmt/dbk-article.rb +46 -0
- data/lib/deplate/fmt/dbk-book.rb +46 -0
- data/lib/deplate/fmt/dbk-ref.rb +105 -0
- data/lib/deplate/fmt/dbk-slides.rb +47 -0
- data/lib/deplate/fmt/dbk-snippet.rb +21 -0
- data/lib/deplate/fmt/html-snippet.rb +21 -0
- data/lib/deplate/fmt/html.rb +1696 -0
- data/lib/deplate/fmt/htmlsite.rb +419 -0
- data/lib/deplate/fmt/htmlslides.rb +21 -0
- data/lib/deplate/fmt/htmlwebsite.rb +70 -0
- data/lib/deplate/fmt/latex-snippet.rb +22 -0
- data/lib/deplate/fmt/latex.rb +1242 -0
- data/lib/deplate/fmt/php.rb +19 -0
- data/lib/deplate/fmt/phpsite.rb +19 -0
- data/lib/deplate/fmt/plain.rb +598 -0
- data/lib/deplate/fmt/template.rb +34 -0
- data/lib/deplate/fmt/xhtml10t.rb +41 -0
- data/lib/deplate/formatter-snippet.rb +17 -0
- data/lib/deplate/formatter.rb +1210 -0
- data/lib/deplate/input.rb +492 -0
- data/lib/deplate/input/deplate-headings.rb +48 -0
- data/lib/deplate/input/deplate-restricted.rb +70 -0
- data/lib/deplate/input/deplate.rb +28 -0
- data/lib/deplate/input/rdoc.rb +277 -0
- data/lib/deplate/input/template.rb +29 -0
- data/lib/deplate/lib/latex/highlight-extra.sty +15 -0
- data/lib/deplate/lib/latex/highlight-typical.sty +15 -0
- data/lib/deplate/lib/tabmenu.js +146 -0
- data/lib/deplate/locale/de.latin1 +708 -0
- data/lib/deplate/locale/ru.koi8-r +48 -0
- data/lib/deplate/locale/zh_cn.gb2312 +35 -0
- data/lib/deplate/macros.rb +639 -0
- data/lib/deplate/messages.rb +120 -0
- data/lib/deplate/metadata.rb +77 -0
- data/lib/deplate/metadata/marshal.rb +24 -0
- data/lib/deplate/metadata/xml.rb +42 -0
- data/lib/deplate/metadata/yaml.rb +26 -0
- data/lib/deplate/mod/anyword.rb +56 -0
- data/lib/deplate/mod/babelfish.rb +27 -0
- data/lib/deplate/mod/code-gvim.rb +52 -0
- data/lib/deplate/mod/code-highlight.rb +91 -0
- data/lib/deplate/mod/colored-log.rb +17 -0
- data/lib/deplate/mod/de.rb +19 -0
- data/lib/deplate/mod/en.rb +17 -0
- data/lib/deplate/mod/endnotes.rb +60 -0
- data/lib/deplate/mod/fr.rb +46 -0
- data/lib/deplate/mod/html-asciimath.rb +40 -0
- data/lib/deplate/mod/html-deplate-button.rb +15 -0
- data/lib/deplate/mod/html-headings-navbar.rb +39 -0
- data/lib/deplate/mod/html-obfuscate-email.rb +47 -0
- data/lib/deplate/mod/html-sidebar.rb +232 -0
- data/lib/deplate/mod/htmlslides-navbar-fh.rb +32 -0
- data/lib/deplate/mod/iconv.rb +35 -0
- data/lib/deplate/mod/imgurl.rb +30 -0
- data/lib/deplate/mod/inlatex-compound.rb +69 -0
- data/lib/deplate/mod/koma.rb +109 -0
- data/lib/deplate/mod/latex-emph-table-head.rb +38 -0
- data/lib/deplate/mod/latex-styles.rb +461 -0
- data/lib/deplate/mod/latex-verbatim-small.rb +29 -0
- data/lib/deplate/mod/makefile.rb +194 -0
- data/lib/deplate/mod/mark-external-urls.rb +38 -0
- data/lib/deplate/mod/markup-1-warn.rb +37 -0
- data/lib/deplate/mod/markup-1.rb +41 -0
- data/lib/deplate/mod/navbar-png.rb +33 -0
- data/lib/deplate/mod/noindent.rb +32 -0
- data/lib/deplate/mod/numpara.rb +40 -0
- data/lib/deplate/mod/particle-math.rb +34 -0
- data/lib/deplate/mod/php-extra.rb +44 -0
- data/lib/deplate/mod/pstoedit.rb +71 -0
- data/lib/deplate/mod/recode.rb +57 -0
- data/lib/deplate/mod/ru_koi8-r.rb +20 -0
- data/lib/deplate/mod/smiley.rb +50 -0
- data/lib/deplate/mod/soffice.rb +23 -0
- data/lib/deplate/mod/symbols-latin1.rb +58 -0
- data/lib/deplate/mod/symbols-od-utf-8.rb +16 -0
- data/lib/deplate/mod/symbols-plain.rb +58 -0
- data/lib/deplate/mod/symbols-sgml.rb +97 -0
- data/lib/deplate/mod/symbols-utf-8.rb +81 -0
- data/lib/deplate/mod/symbols-xml.rb +34 -0
- data/lib/deplate/mod/syntax-region-alt.rb +37 -0
- data/lib/deplate/mod/utf8.rb +49 -0
- data/lib/deplate/mod/validate-html.rb +35 -0
- data/lib/deplate/mod/xmlrpc.rb +233 -0
- data/lib/deplate/mod/zh-cn-autospace.rb +108 -0
- data/lib/deplate/mod/zh-cn.rb +59 -0
- data/lib/deplate/once-method.rb +44 -0
- data/lib/deplate/output.rb +249 -0
- data/lib/deplate/particles.rb +815 -0
- data/lib/deplate/regions.rb +1076 -0
- data/lib/deplate/structured.rb +763 -0
- data/lib/deplate/template.rb +430 -0
- data/lib/deplate/templates/html-doc.html +28 -0
- data/lib/deplate/templates/html-left-tabbar-js.html +37 -0
- data/lib/deplate/templates/html-left-tabbar.html +31 -0
- data/lib/deplate/templates/html-tabbar-right-table.html +43 -0
- data/lib/deplate/templates/html-tabbar-right.html +23 -0
- data/lib/deplate/templates/html-tabbar-top.html +43 -0
- data/lib/deplate/templates/html-tabbar.html +31 -0
- data/lib/deplate/wiki-markup.rb +117 -0
- data/lib/deplate/xml.rb +109 -0
- data/lib/deplate/zh-cn.rb +59 -0
- data/lib/ps2ppm.rb +239 -0
- data/man/man1/deplate.1 +692 -0
- metadata +210 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
# input.rb
|
|
2
|
+
# @Author: Thomas Link (samul AT web.de)
|
|
3
|
+
# @Website: http://deplate.sf.net/
|
|
4
|
+
# @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
|
|
5
|
+
# @Created: 10-M�r-2005.
|
|
6
|
+
# @Last Change: 01-Nov-2005.
|
|
7
|
+
# @Revision: 0.294
|
|
8
|
+
#
|
|
9
|
+
# = Description
|
|
10
|
+
# = Usage
|
|
11
|
+
# = TODO
|
|
12
|
+
# = CHANGES
|
|
13
|
+
|
|
14
|
+
# Input:
|
|
15
|
+
class Deplate::Input
|
|
16
|
+
class << self
|
|
17
|
+
attr_reader :myname
|
|
18
|
+
|
|
19
|
+
def myname=(value)
|
|
20
|
+
@myname = value
|
|
21
|
+
klass = self
|
|
22
|
+
Deplate::Core.class_eval do
|
|
23
|
+
declare_input_format(klass)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
self.myname = 'deplate'
|
|
29
|
+
|
|
30
|
+
attr_reader :elements, :commands, :regions, :macros
|
|
31
|
+
attr_reader :paragraph_class, :comment_class, :command_class
|
|
32
|
+
attr_reader :particles, :rx_particles, :particles_ext, :rx_particles_ext
|
|
33
|
+
|
|
34
|
+
@@custom_particles = {}
|
|
35
|
+
|
|
36
|
+
def initialize(deplate, args)
|
|
37
|
+
@deplate = deplate
|
|
38
|
+
@options = deplate.options
|
|
39
|
+
@args = args
|
|
40
|
+
@elements = (args[:elements] || Deplate::Element.elements)
|
|
41
|
+
@commands = (args[:commands] || Deplate::Command.commands)
|
|
42
|
+
@regions = (args[:regions ] || Deplate::Region.regions)
|
|
43
|
+
@macros = (args[:macros] || Deplate::Macro.macros)
|
|
44
|
+
@paragraph_class = args[:paragraph_class] || Deplate::Element::Paragraph
|
|
45
|
+
@comment_class = args[:comment_class] || Deplate::Element::Comment
|
|
46
|
+
@command_class = args[:command_class] || Deplate::Element::Command
|
|
47
|
+
@allow_onthefly_particles = args[:onthefly_particles] || true
|
|
48
|
+
initialize_particles
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize_particles(alt=false, args=@args)
|
|
52
|
+
always = args[:always]
|
|
53
|
+
if always or @allow_onthefly_particles or !@rx_particles
|
|
54
|
+
@particles_custom ||= args[:particles]
|
|
55
|
+
if @particles_custom
|
|
56
|
+
@particles = args[:particles].dup
|
|
57
|
+
else
|
|
58
|
+
@particles = Deplate::Particle.particles.dup
|
|
59
|
+
end
|
|
60
|
+
for p in @options.disabled_particles
|
|
61
|
+
disable_particle_class(p)
|
|
62
|
+
end
|
|
63
|
+
initialize_rx(:standard)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if always or !defined?(@particles_ext) or (@allow_onthefly_particles and alt)
|
|
67
|
+
@particles_ext_custom ||= args[:particles_ext]
|
|
68
|
+
if @particles_ext_custom
|
|
69
|
+
@particles_ext = args[:particles_ext].dup
|
|
70
|
+
else
|
|
71
|
+
@particles_ext = Deplate::Particle.particles_ext.dup
|
|
72
|
+
end
|
|
73
|
+
initialize_rx(:extended)
|
|
74
|
+
else
|
|
75
|
+
@particles_all = @particles
|
|
76
|
+
@rx_particles_all = @rx_particles
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def initialize_rx(what=:both)
|
|
81
|
+
case what
|
|
82
|
+
when :extended, :both
|
|
83
|
+
if @particles_ext
|
|
84
|
+
@particles_all = @particles + @particles_ext
|
|
85
|
+
else
|
|
86
|
+
@particles_all = @particles
|
|
87
|
+
end
|
|
88
|
+
@rx_particles_all = get_rx_particles(@particles_all)
|
|
89
|
+
else
|
|
90
|
+
@rx_particles = get_rx_particles(@particles)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def register_particle(particle, args={})
|
|
95
|
+
arr = args[:extended] ? @particles_ext : @particles
|
|
96
|
+
id = args[:id] || particle.name
|
|
97
|
+
catch(:cont) do
|
|
98
|
+
old = @@custom_particles[id]
|
|
99
|
+
if old
|
|
100
|
+
idx = arr.index(old)
|
|
101
|
+
if idx
|
|
102
|
+
arr[idx] = particle
|
|
103
|
+
throw :cont
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
arr << particle
|
|
107
|
+
end
|
|
108
|
+
@@custom_particles[id] = particle
|
|
109
|
+
initialize_rx(:both)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def get_rx_particles(particles)
|
|
113
|
+
return Regexp.new(particles.collect {|e| e.rx.source[1..-1]}.join("|"))
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def get_particles(what, alt=true)
|
|
117
|
+
if alt
|
|
118
|
+
p = @particles_all
|
|
119
|
+
r = @rx_particles_all
|
|
120
|
+
else
|
|
121
|
+
p = @particles
|
|
122
|
+
r = @rx_particles
|
|
123
|
+
end
|
|
124
|
+
case what
|
|
125
|
+
when :rx
|
|
126
|
+
return r
|
|
127
|
+
when :particles
|
|
128
|
+
return p
|
|
129
|
+
else
|
|
130
|
+
return r, p
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def disable_particle_class(particle)
|
|
135
|
+
@particles.delete(particle)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# This is the general function for including text from whatever source
|
|
139
|
+
# that follows the enumeration interface. In general, the more
|
|
140
|
+
# specialized methods from Deplate::Core should be used to call this.
|
|
141
|
+
def include_enum(enum, acc_array, linenumber)
|
|
142
|
+
accum = []
|
|
143
|
+
for line in enum
|
|
144
|
+
linenumber += 1
|
|
145
|
+
line.chomp!
|
|
146
|
+
unless accum.empty?
|
|
147
|
+
line.gsub!(/^\s+/, "")
|
|
148
|
+
end
|
|
149
|
+
use_line_continuation = acc_array.last ? acc_array.last.line_cont : true
|
|
150
|
+
if comment_class.match(line)
|
|
151
|
+
next
|
|
152
|
+
elsif use_line_continuation and line =~ /(^|[^\\])\\$/
|
|
153
|
+
accum << line[0..-2]
|
|
154
|
+
else
|
|
155
|
+
accum << line
|
|
156
|
+
handle_line(acc_array, accum.join, linenumber)
|
|
157
|
+
accum = []
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
handle_line(acc_array, nil, linenumber)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def handle_line(array, line, lineNumber=-1)
|
|
164
|
+
last = array.last
|
|
165
|
+
if line
|
|
166
|
+
src = Deplate::Source.new(@deplate.current_source, @deplate.current_source_stats,
|
|
167
|
+
lineNumber, nil)
|
|
168
|
+
if (tic = @deplate.variables['embeddedTextRx'])
|
|
169
|
+
# If +embeddedTextRx+ is set, the actual text is hidden in
|
|
170
|
+
# comments or similar. Other text is printed as
|
|
171
|
+
# verbatim.
|
|
172
|
+
ec = @deplate.variables['embeddedVerbatim'] || 'Verbatim'
|
|
173
|
+
rx = /^#{tic}/
|
|
174
|
+
if line =~ rx
|
|
175
|
+
if $1
|
|
176
|
+
line = $1
|
|
177
|
+
else
|
|
178
|
+
line.sub!(rx, '')
|
|
179
|
+
end
|
|
180
|
+
if last.kind_of?(Deplate::Element::Region) and last.name == ec and !last.finished?
|
|
181
|
+
last = finish_last(array, last, lineNumber)
|
|
182
|
+
end
|
|
183
|
+
else
|
|
184
|
+
if !@deplate.switches.last
|
|
185
|
+
if last.kind_of?(Deplate::Element::Region) and last.name == ec
|
|
186
|
+
last << line
|
|
187
|
+
elsif line =~ /\S/
|
|
188
|
+
unless last.finished?
|
|
189
|
+
last = finish_last(array, last, lineNumber)
|
|
190
|
+
end
|
|
191
|
+
m = Deplate::Element::Region.pseudo_match(:args => '')
|
|
192
|
+
Deplate::Element::Region.do_accumulate(src, array, @deplate, '', m, ec)
|
|
193
|
+
array.last << line
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
return
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
if last and !last.finished? and last.endRx
|
|
200
|
+
# last is a region
|
|
201
|
+
if line =~ last.endRx
|
|
202
|
+
last = finish_last(array, last, lineNumber)
|
|
203
|
+
else
|
|
204
|
+
last << line
|
|
205
|
+
end
|
|
206
|
+
else
|
|
207
|
+
# last is something else
|
|
208
|
+
e, m = match_elements(line)
|
|
209
|
+
if last
|
|
210
|
+
# so, there is a element in the queue
|
|
211
|
+
if e == comment_class
|
|
212
|
+
c = nil
|
|
213
|
+
elsif last.finished?
|
|
214
|
+
# last is finished, so we start a new element
|
|
215
|
+
c = e || paragraph_class
|
|
216
|
+
elsif e
|
|
217
|
+
unless e.is_volatile?(m)
|
|
218
|
+
last = finish_last(array, last, lineNumber - 1)
|
|
219
|
+
end
|
|
220
|
+
c = e
|
|
221
|
+
elsif last.to_be_continued?(line)
|
|
222
|
+
# this line is something else, so we ask last if it wants
|
|
223
|
+
# to be continued
|
|
224
|
+
if @options.keep_whitespace or last.keep_whitespace
|
|
225
|
+
last << line
|
|
226
|
+
else
|
|
227
|
+
last << line.strip
|
|
228
|
+
end
|
|
229
|
+
c = nil
|
|
230
|
+
else
|
|
231
|
+
# last doesn't want this line, so we start a new element
|
|
232
|
+
last = finish_last(array, last, lineNumber - 1)
|
|
233
|
+
c = paragraph_class
|
|
234
|
+
end
|
|
235
|
+
else
|
|
236
|
+
# as there is no last element, we start a new one in any
|
|
237
|
+
# case
|
|
238
|
+
c = e || paragraph_class
|
|
239
|
+
end
|
|
240
|
+
if c and (c == command_class or !@deplate.switches.last)
|
|
241
|
+
c.do_accumulate(src, array, @deplate, line, m)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
elsif last and !last.finished?
|
|
245
|
+
last = finish_last(array, last, lineNumber)
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
private :handle_line
|
|
249
|
+
|
|
250
|
+
def finish_last(array, last, lineNumber=-1)
|
|
251
|
+
last.source.end = lineNumber if lineNumber > 0
|
|
252
|
+
finished_element = last.finish
|
|
253
|
+
array.pop
|
|
254
|
+
if finished_element.kind_of?(Array)
|
|
255
|
+
for e in finished_element
|
|
256
|
+
handle_finished_element(array, e)
|
|
257
|
+
end
|
|
258
|
+
else
|
|
259
|
+
handle_finished_element(array, finished_element)
|
|
260
|
+
end
|
|
261
|
+
array.last
|
|
262
|
+
end
|
|
263
|
+
private :finish_last
|
|
264
|
+
|
|
265
|
+
def handle_finished_element(array, element)
|
|
266
|
+
unless element.nil? or element.drop?
|
|
267
|
+
pred = array.last
|
|
268
|
+
unless pred and pred.unify(element)
|
|
269
|
+
if !@deplate.labels_floating.empty? and element.can_be_labelled
|
|
270
|
+
element.put_label(@deplate.labels_floating)
|
|
271
|
+
@deplate.labels_floating = []
|
|
272
|
+
end
|
|
273
|
+
array << element
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
private :handle_finished_element
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
### Elements
|
|
281
|
+
|
|
282
|
+
# Test for all elements except Paragraph. It's a real Paragraph if there
|
|
283
|
+
# is undefined text and the previous element wasn't a "multiliner"
|
|
284
|
+
def match_elements(line)
|
|
285
|
+
@elements.each do |e|
|
|
286
|
+
m = e.match(line)
|
|
287
|
+
if m
|
|
288
|
+
return [e, m]
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
return [nil, @paragraph_class.match(line)]
|
|
292
|
+
end
|
|
293
|
+
private :match_elements
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
### Particles
|
|
297
|
+
|
|
298
|
+
# This is the method that does the actual parsing of elements into
|
|
299
|
+
# particles. It takes a regular expression made up of all known particles
|
|
300
|
+
# and matches the text against it. It splits the text into a prelude, a
|
|
301
|
+
# match, and the rest. The the prelude is turned into an instance of
|
|
302
|
+
# Deplate::Particle::Text, the match into a matching particle. The rest is
|
|
303
|
+
# matched against the grand regular expression again.
|
|
304
|
+
#
|
|
305
|
+
# This approach provides for easy runtime modifications of the
|
|
306
|
+
# lexer/parser, which wouldn't be possible, I assume, if I had used rexml
|
|
307
|
+
# or similar ... I assume.
|
|
308
|
+
#
|
|
309
|
+
# Anyway, you should call this method directly unless you have to, but use
|
|
310
|
+
# the more specialized ones.
|
|
311
|
+
def parse_using(container, text, rx, particles, alt=true)
|
|
312
|
+
rest = text
|
|
313
|
+
rt = []
|
|
314
|
+
last = ""
|
|
315
|
+
src = container ? container.source : nil
|
|
316
|
+
while !rest.empty?
|
|
317
|
+
begin
|
|
318
|
+
mx = rx.match(rest)
|
|
319
|
+
rescue RegexpError => e
|
|
320
|
+
if rest.size > 60
|
|
321
|
+
sample = "%s ..." % rest[0..60]
|
|
322
|
+
else
|
|
323
|
+
sample = rest
|
|
324
|
+
end
|
|
325
|
+
log_error(container, ["Regexp error when parsing", sample], :error, src)
|
|
326
|
+
rescue Exception => e
|
|
327
|
+
puts e.backtrace[0..10].join("\n")
|
|
328
|
+
raise e
|
|
329
|
+
end
|
|
330
|
+
if mx
|
|
331
|
+
rest = mx.post_match
|
|
332
|
+
catch(:ok) do
|
|
333
|
+
particles.each do |e|
|
|
334
|
+
m = e.match(mx[0])
|
|
335
|
+
if m
|
|
336
|
+
pre = mx.pre_match
|
|
337
|
+
unless pre.empty?
|
|
338
|
+
rt << Deplate::Particle::Text.new(@deplate, container, rt, mx.pre_match, alt, last)
|
|
339
|
+
end
|
|
340
|
+
txt = last + mx.pre_match
|
|
341
|
+
# begin
|
|
342
|
+
rt << e.new(@deplate, container, rt, m, alt, txt, rest)
|
|
343
|
+
# rescue Exception => exc
|
|
344
|
+
# puts "Internal error when initializing %s: %s" % [e.name, txt]
|
|
345
|
+
# raise exc
|
|
346
|
+
# end
|
|
347
|
+
throw :ok
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
txt = mx.pre_match + mx[0]
|
|
351
|
+
rt << Deplate::Particle::Text.new(@deplate, container, rt, txt, alt, last, rest)
|
|
352
|
+
end
|
|
353
|
+
last = mx[0]
|
|
354
|
+
else
|
|
355
|
+
rt << Deplate::Particle::Text.new(@deplate, container, rt, rest, alt, last, "")
|
|
356
|
+
break
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
return rt
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def parse_with_particles(container, text, particles, alt=true)
|
|
363
|
+
parse_using(container, text, get_particles(:rx, alt), particles, alt)
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def parse_with_source(source, text, alt=true)
|
|
367
|
+
container = Deplate::PseudoContainer.new(@deplate, :source => source)
|
|
368
|
+
parse(container, text, alt)
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def parse(container, text, alt=true, excluded=[])
|
|
372
|
+
rx, particles = get_particles(:both, alt)
|
|
373
|
+
for p in excluded
|
|
374
|
+
particles.delete(p)
|
|
375
|
+
end
|
|
376
|
+
parse_using(container, text, rx, particles, alt)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
### Arguments
|
|
380
|
+
# @@rxsrc_args = %{(\\w+?)(!|=("(\\\\"|[^"])*"|(\\\\=|.)+?))(\\s*$|(?= \w+(!|=)))}
|
|
381
|
+
# @@rxsrc_args = %{(\\w+?)(!|=((\\\\=|.)+?))(\\s*$|(?= \w+(!|=)))}
|
|
382
|
+
# @@rxsrc_argval = %{("(\\\\"|[^"])*?"|(\\\\=|\\\\:|\\\\!|[^=!]+)+?)}
|
|
383
|
+
# @@rxsrc_argval = %{(\\\\=|\\\\:|[^=:]*)+?}
|
|
384
|
+
# @@rxsrc_argval = %{("(\\\\"|[^"])*?"|(\\\\ |\\\\=|\\\\:|\\\\!|[%s]+)+?)}
|
|
385
|
+
@@rxsrc_argval = %{("(\\\\"|[^"])*"|\\([^)]+\\)|\\\\.|[%s"]+)+?}
|
|
386
|
+
# @@rxsrc_argval = %{("(\\\\"|[^"])*"|\\\\.|[%s"]+)+?}
|
|
387
|
+
@@rxsrc_key = %{[@\\w]+(\\[\\S*?\\])?}
|
|
388
|
+
@@rxsrc_args1 = %{(#{@@rxsrc_key})(!|=(#{@@rxsrc_argval}))\\s*} % "^=!:"
|
|
389
|
+
@@rxsrc_args2 = %{(#{@@rxsrc_key})(!|=(#{@@rxsrc_argval}))\\s*} % "^=!"
|
|
390
|
+
@@rx_args = /^\s*(#{@@rxsrc_args2})(\s*$|(?=\s+#{@@rxsrc_key}(!|=)))/
|
|
391
|
+
@@rx_argstext = /^\s*((#{@@rxsrc_args1})*?)(:\s*(.+))?$/
|
|
392
|
+
|
|
393
|
+
def parse_args(argText, container=nil, firstPass=true, parseText=false)
|
|
394
|
+
if argText
|
|
395
|
+
if firstPass
|
|
396
|
+
m = @@rx_argstext.match(argText)
|
|
397
|
+
else
|
|
398
|
+
m = [nil, argText]
|
|
399
|
+
end
|
|
400
|
+
accum = {}
|
|
401
|
+
if m
|
|
402
|
+
args = m[1]
|
|
403
|
+
text = m[10]
|
|
404
|
+
while !args.empty?
|
|
405
|
+
m = @@rx_args.match(args)
|
|
406
|
+
if m
|
|
407
|
+
key = m[2]
|
|
408
|
+
if key =~ /^no[A-Z]/
|
|
409
|
+
key_alt = key[2..2].downcase + key[3..-1]
|
|
410
|
+
accum[key_alt] = false
|
|
411
|
+
val = true
|
|
412
|
+
end
|
|
413
|
+
if m[4] == "!"
|
|
414
|
+
val = true
|
|
415
|
+
elsif m[5] == 'true'
|
|
416
|
+
val = true
|
|
417
|
+
elsif m[5] == 'false'
|
|
418
|
+
val = false
|
|
419
|
+
else
|
|
420
|
+
valm = /^"(.*?)"$/.match(m[5])
|
|
421
|
+
if valm
|
|
422
|
+
val = valm[1]
|
|
423
|
+
else
|
|
424
|
+
val = m[5].strip
|
|
425
|
+
end
|
|
426
|
+
val = Deplate::Core.remove_backslashes(val)
|
|
427
|
+
end
|
|
428
|
+
accum[key] = val
|
|
429
|
+
args = m.post_match
|
|
430
|
+
if args.empty?
|
|
431
|
+
break
|
|
432
|
+
end
|
|
433
|
+
else
|
|
434
|
+
log_error(@container, ["Argument parse error", args, argText])
|
|
435
|
+
break
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
if parseText
|
|
439
|
+
if text
|
|
440
|
+
parsed = parse(container, text)
|
|
441
|
+
else
|
|
442
|
+
parsed = []
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
else
|
|
446
|
+
text = nil
|
|
447
|
+
parsed = nil
|
|
448
|
+
end
|
|
449
|
+
id = accum['id']
|
|
450
|
+
if id
|
|
451
|
+
accum['@id'] = id
|
|
452
|
+
accum['id'] = @deplate.formatter.encode_id(id)
|
|
453
|
+
end
|
|
454
|
+
fmt = accum["fmt"]
|
|
455
|
+
accum.delete("fmt") if fmt
|
|
456
|
+
ifOpt = accum["if"]
|
|
457
|
+
if ifOpt
|
|
458
|
+
accum.delete("if")
|
|
459
|
+
ifOpt = Deplate::Element::Command.check_switch(@deplate, ifOpt)
|
|
460
|
+
else
|
|
461
|
+
ifOpt = true
|
|
462
|
+
end
|
|
463
|
+
nofmt = accum["nofmt"]
|
|
464
|
+
accum.delete("nofmt") if nofmt
|
|
465
|
+
nofmt ||= accum["noFmt"]
|
|
466
|
+
accum.delete("noFmt") if nofmt
|
|
467
|
+
if (!firstPass or (ifOpt and
|
|
468
|
+
(!fmt || @deplate.formatter.matches?(fmt)) and
|
|
469
|
+
(!nofmt || !(@deplate.formatter.matches?(nofmt)))))
|
|
470
|
+
if parseText
|
|
471
|
+
return [accum, text, parsed]
|
|
472
|
+
else
|
|
473
|
+
return [accum, text || ""]
|
|
474
|
+
end
|
|
475
|
+
else
|
|
476
|
+
raise Deplate::DontFormatException
|
|
477
|
+
end
|
|
478
|
+
else
|
|
479
|
+
return nil
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
private
|
|
484
|
+
def log_error(container, text)
|
|
485
|
+
(container || @deplate).log(text, :error)
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
# class Deplate::Core
|
|
490
|
+
# declare_input_format(Deplate::Input)
|
|
491
|
+
# end
|
|
492
|
+
|