deplate 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/AUTHORS.TXT +26 -0
  2. data/CHANGES.TXT +177 -0
  3. data/LICENSE.TXT +340 -0
  4. data/NEWS.TXT +29 -0
  5. data/README.TXT +86 -0
  6. data/TODO.TXT +202 -0
  7. data/VERSION.TXT +1 -0
  8. data/bin/deplate +3 -0
  9. data/bin/deplate.bat +2 -0
  10. data/etc/deplate.ini +361 -0
  11. data/lib/deplate.rb +31 -0
  12. data/lib/deplate/abstract-class.rb +30 -0
  13. data/lib/deplate/builtin.rb +11 -0
  14. data/lib/deplate/cache.rb +59 -0
  15. data/lib/deplate/commands.rb +693 -0
  16. data/lib/deplate/common.rb +335 -0
  17. data/lib/deplate/converter.rb +99 -0
  18. data/lib/deplate/core.rb +2705 -0
  19. data/lib/deplate/css/article.css +545 -0
  20. data/lib/deplate/css/deplate.css +699 -0
  21. data/lib/deplate/css/heading-navbar.css +29 -0
  22. data/lib/deplate/css/layout-deplate-print.css +540 -0
  23. data/lib/deplate/css/layout-deplate.css +764 -0
  24. data/lib/deplate/css/sans-serif.css +160 -0
  25. data/lib/deplate/css/serif-e.css +170 -0
  26. data/lib/deplate/css/serif-rel.css +121 -0
  27. data/lib/deplate/css/serif.css +190 -0
  28. data/lib/deplate/css/slides.css +11 -0
  29. data/lib/deplate/css/tabbar-left.css +91 -0
  30. data/lib/deplate/css/tabbar-right-ie.css +14 -0
  31. data/lib/deplate/css/tabbar-right.css +118 -0
  32. data/lib/deplate/css/tabbar-top.css +64 -0
  33. data/lib/deplate/css/tabbar.css +81 -0
  34. data/lib/deplate/css/text-sans-serif.css +154 -0
  35. data/lib/deplate/css/text-serif.css +175 -0
  36. data/lib/deplate/define.rb +439 -0
  37. data/lib/deplate/docbook.rb +738 -0
  38. data/lib/deplate/elements.rb +1355 -0
  39. data/lib/deplate/etc.rb +199 -0
  40. data/lib/deplate/external.rb +135 -0
  41. data/lib/deplate/fmt/dbk-article-4.1.2.rb +21 -0
  42. data/lib/deplate/fmt/dbk-article.rb +46 -0
  43. data/lib/deplate/fmt/dbk-book.rb +46 -0
  44. data/lib/deplate/fmt/dbk-ref.rb +105 -0
  45. data/lib/deplate/fmt/dbk-slides.rb +47 -0
  46. data/lib/deplate/fmt/dbk-snippet.rb +21 -0
  47. data/lib/deplate/fmt/html-snippet.rb +21 -0
  48. data/lib/deplate/fmt/html.rb +1696 -0
  49. data/lib/deplate/fmt/htmlsite.rb +419 -0
  50. data/lib/deplate/fmt/htmlslides.rb +21 -0
  51. data/lib/deplate/fmt/htmlwebsite.rb +70 -0
  52. data/lib/deplate/fmt/latex-snippet.rb +22 -0
  53. data/lib/deplate/fmt/latex.rb +1242 -0
  54. data/lib/deplate/fmt/php.rb +19 -0
  55. data/lib/deplate/fmt/phpsite.rb +19 -0
  56. data/lib/deplate/fmt/plain.rb +598 -0
  57. data/lib/deplate/fmt/template.rb +34 -0
  58. data/lib/deplate/fmt/xhtml10t.rb +41 -0
  59. data/lib/deplate/formatter-snippet.rb +17 -0
  60. data/lib/deplate/formatter.rb +1210 -0
  61. data/lib/deplate/input.rb +492 -0
  62. data/lib/deplate/input/deplate-headings.rb +48 -0
  63. data/lib/deplate/input/deplate-restricted.rb +70 -0
  64. data/lib/deplate/input/deplate.rb +28 -0
  65. data/lib/deplate/input/rdoc.rb +277 -0
  66. data/lib/deplate/input/template.rb +29 -0
  67. data/lib/deplate/lib/latex/highlight-extra.sty +15 -0
  68. data/lib/deplate/lib/latex/highlight-typical.sty +15 -0
  69. data/lib/deplate/lib/tabmenu.js +146 -0
  70. data/lib/deplate/locale/de.latin1 +708 -0
  71. data/lib/deplate/locale/ru.koi8-r +48 -0
  72. data/lib/deplate/locale/zh_cn.gb2312 +35 -0
  73. data/lib/deplate/macros.rb +639 -0
  74. data/lib/deplate/messages.rb +120 -0
  75. data/lib/deplate/metadata.rb +77 -0
  76. data/lib/deplate/metadata/marshal.rb +24 -0
  77. data/lib/deplate/metadata/xml.rb +42 -0
  78. data/lib/deplate/metadata/yaml.rb +26 -0
  79. data/lib/deplate/mod/anyword.rb +56 -0
  80. data/lib/deplate/mod/babelfish.rb +27 -0
  81. data/lib/deplate/mod/code-gvim.rb +52 -0
  82. data/lib/deplate/mod/code-highlight.rb +91 -0
  83. data/lib/deplate/mod/colored-log.rb +17 -0
  84. data/lib/deplate/mod/de.rb +19 -0
  85. data/lib/deplate/mod/en.rb +17 -0
  86. data/lib/deplate/mod/endnotes.rb +60 -0
  87. data/lib/deplate/mod/fr.rb +46 -0
  88. data/lib/deplate/mod/html-asciimath.rb +40 -0
  89. data/lib/deplate/mod/html-deplate-button.rb +15 -0
  90. data/lib/deplate/mod/html-headings-navbar.rb +39 -0
  91. data/lib/deplate/mod/html-obfuscate-email.rb +47 -0
  92. data/lib/deplate/mod/html-sidebar.rb +232 -0
  93. data/lib/deplate/mod/htmlslides-navbar-fh.rb +32 -0
  94. data/lib/deplate/mod/iconv.rb +35 -0
  95. data/lib/deplate/mod/imgurl.rb +30 -0
  96. data/lib/deplate/mod/inlatex-compound.rb +69 -0
  97. data/lib/deplate/mod/koma.rb +109 -0
  98. data/lib/deplate/mod/latex-emph-table-head.rb +38 -0
  99. data/lib/deplate/mod/latex-styles.rb +461 -0
  100. data/lib/deplate/mod/latex-verbatim-small.rb +29 -0
  101. data/lib/deplate/mod/makefile.rb +194 -0
  102. data/lib/deplate/mod/mark-external-urls.rb +38 -0
  103. data/lib/deplate/mod/markup-1-warn.rb +37 -0
  104. data/lib/deplate/mod/markup-1.rb +41 -0
  105. data/lib/deplate/mod/navbar-png.rb +33 -0
  106. data/lib/deplate/mod/noindent.rb +32 -0
  107. data/lib/deplate/mod/numpara.rb +40 -0
  108. data/lib/deplate/mod/particle-math.rb +34 -0
  109. data/lib/deplate/mod/php-extra.rb +44 -0
  110. data/lib/deplate/mod/pstoedit.rb +71 -0
  111. data/lib/deplate/mod/recode.rb +57 -0
  112. data/lib/deplate/mod/ru_koi8-r.rb +20 -0
  113. data/lib/deplate/mod/smiley.rb +50 -0
  114. data/lib/deplate/mod/soffice.rb +23 -0
  115. data/lib/deplate/mod/symbols-latin1.rb +58 -0
  116. data/lib/deplate/mod/symbols-od-utf-8.rb +16 -0
  117. data/lib/deplate/mod/symbols-plain.rb +58 -0
  118. data/lib/deplate/mod/symbols-sgml.rb +97 -0
  119. data/lib/deplate/mod/symbols-utf-8.rb +81 -0
  120. data/lib/deplate/mod/symbols-xml.rb +34 -0
  121. data/lib/deplate/mod/syntax-region-alt.rb +37 -0
  122. data/lib/deplate/mod/utf8.rb +49 -0
  123. data/lib/deplate/mod/validate-html.rb +35 -0
  124. data/lib/deplate/mod/xmlrpc.rb +233 -0
  125. data/lib/deplate/mod/zh-cn-autospace.rb +108 -0
  126. data/lib/deplate/mod/zh-cn.rb +59 -0
  127. data/lib/deplate/once-method.rb +44 -0
  128. data/lib/deplate/output.rb +249 -0
  129. data/lib/deplate/particles.rb +815 -0
  130. data/lib/deplate/regions.rb +1076 -0
  131. data/lib/deplate/structured.rb +763 -0
  132. data/lib/deplate/template.rb +430 -0
  133. data/lib/deplate/templates/html-doc.html +28 -0
  134. data/lib/deplate/templates/html-left-tabbar-js.html +37 -0
  135. data/lib/deplate/templates/html-left-tabbar.html +31 -0
  136. data/lib/deplate/templates/html-tabbar-right-table.html +43 -0
  137. data/lib/deplate/templates/html-tabbar-right.html +23 -0
  138. data/lib/deplate/templates/html-tabbar-top.html +43 -0
  139. data/lib/deplate/templates/html-tabbar.html +31 -0
  140. data/lib/deplate/wiki-markup.rb +117 -0
  141. data/lib/deplate/xml.rb +109 -0
  142. data/lib/deplate/zh-cn.rb +59 -0
  143. data/lib/ps2ppm.rb +239 -0
  144. data/man/man1/deplate.1 +692 -0
  145. metadata +210 -0
@@ -0,0 +1,815 @@
1
+ # particles.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: 24-M�r-2004.
6
+ # @Last Change: 02-Nov-2005.
7
+ # @Revision: 0.1655
8
+
9
+ require "uri"
10
+ require "deplate/common"
11
+
12
+
13
+ # Sub-line level text bits.
14
+ class Deplate::Particle < Deplate::BaseParticle
15
+ # An array of auto-indexed words/strings.
16
+ @@autoindexed = []
17
+ # An array of the default particle classes.
18
+ @@particles = []
19
+ # The regular expression for the default particle classes.
20
+ @@rx = nil
21
+ # Programmatically created particle classes, e.g., indexes,
22
+ # autoindexes etc.
23
+ @@particles_extended = []
24
+ # The rx for @@particles_extended.
25
+ @@rx_extended = nil
26
+
27
+ class << self
28
+ attr :rx
29
+
30
+ def particles
31
+ @@particles
32
+ end
33
+
34
+ def rx_particles
35
+ @@rx
36
+ end
37
+
38
+ def particles_ext
39
+ @@particles_extended
40
+ end
41
+
42
+ def rx_particles_ext
43
+ @@rx_extended
44
+ end
45
+
46
+ def match(text)
47
+ return @rx.match(text)
48
+ end
49
+
50
+ def register_particle(c=self)
51
+ @@particles << c
52
+ end
53
+
54
+ # Create an auto-indexed word. Arguments:
55
+ # deplate:: An instance of Deplate::Core.
56
+ # idx:: An instance of the Deplate::Core::IndexEntry structure.
57
+ def auto_indexing(deplate, idx)
58
+ if idx
59
+ i = idx.name
60
+ w = idx.synonymes
61
+ name = i.gsub(/\W\|s/) do |x|
62
+ x.unpack('H2' * x.size)
63
+ end
64
+ if !w.any? {|x| @@autoindexed.include?(x)}
65
+ @@autoindexed += w
66
+ aname = %{AutoIndex#{name}}
67
+ if self == Deplate::HyperLink
68
+ rx = Regexp.escape(i).gsub(/\\/, "\\\\")
69
+ rx.gsub!(/"/, %{\\\\"})
70
+ body = <<-EOR
71
+ @rx = %r{^\\b#{rx}\\b}
72
+ def setup
73
+ super
74
+ name = match[0]
75
+ @elt = [@name, @dest, @anchor]
76
+ @idx = [deplate.add_index(self, @name)]
77
+ @deplate.register_metadata(@source,
78
+ 'type' => 'index',
79
+ 'name' => @name,
80
+ 'label' => @idx.label,
81
+ )
82
+ end
83
+ EOR
84
+ else
85
+ idxName = Regexp.escape(i)
86
+ rx = w.collect {|i| Regexp.escape(i)}.join("\\b|\\b")
87
+ rx.gsub!(/"/, %{\\\\"})
88
+ body = <<-EOR
89
+ @rx = %r{^\\b#{rx}\\b}
90
+ def setup
91
+ @idx = @deplate.add_index(self, %{#{idxName}}) if @container
92
+ end
93
+ def process
94
+ if @container
95
+ @elt = plain_text(Deplate::Core.remove_backslashes(@match[0])) +
96
+ format_particle(:format_index, self, @idx)
97
+ else
98
+ @elt = ""
99
+ end
100
+ end
101
+ EOR
102
+ end
103
+ cls = Deplate::Cache.particle(deplate, body,
104
+ :register => true,
105
+ :extended => true)
106
+ end
107
+ end
108
+ end
109
+
110
+ def insert_particle_before(klass)
111
+ idx = @@particles.index(klass) || -1
112
+ @@particles.insert(idx, self)
113
+ end
114
+
115
+ end
116
+
117
+ def initialize(deplate, container, context, match, alt, last="", rest="")
118
+ super(deplate, :container => container)
119
+ @level_as_string = container.level_as_string if container
120
+ @context = context
121
+ @match = match
122
+ @last = last
123
+ @rest = rest
124
+ @alt = alt
125
+ setup
126
+ end
127
+
128
+ def setup
129
+ end
130
+
131
+ def process
132
+ end
133
+ end
134
+
135
+
136
+ # A wrapper class for simple particles that require only minimal
137
+ # processing.
138
+ class Deplate::SimpleParticle < Deplate::Particle
139
+ def setup
140
+ @elt = @deplate.parse(@container, get_text, @alt)
141
+ end
142
+ def get_text
143
+ @match[1]
144
+ end
145
+ end
146
+
147
+
148
+ # A pseudo-particle class. Note the following difference: @match holds
149
+ # the plain text as String and not as MatchData.
150
+ class Deplate::Particle::Text < Deplate::Particle
151
+ def process
152
+ @elt = plain_text(@match)
153
+ end
154
+ end
155
+
156
+
157
+ # Match characters escaped with a backslash.
158
+ class Deplate::Particle::Escaped < Deplate::Particle
159
+ register_particle
160
+ set_rx /^\\(.)/
161
+ def process
162
+ @elt = plain_text(@match[1], true)
163
+ end
164
+ end
165
+
166
+
167
+ # Match emphasized text marked as <tt>__text__</tt>.
168
+ class Deplate::Particle::Emphasize < Deplate::SimpleParticle
169
+ register_particle
170
+ set_rx /^__((\\_|.)+?)__/
171
+ def process
172
+ @elt = @deplate.format_particles(@elt)
173
+ @elt = format_particle(:format_emphasize, self, @elt)
174
+ end
175
+ end
176
+
177
+
178
+ # Match code marked as <tt>''text''</tt> (two single quotes).
179
+ class Deplate::Particle::Code < Deplate::Particle
180
+ register_particle
181
+ set_rx(/^''((\\\\|\\'|.)+?)''/)
182
+
183
+ class << self
184
+ # Programmatically markup text as code. Used e.g. for some
185
+ # R-generated tables.
186
+ def markup(text)
187
+ [%{''}, text.gsub("'", "\\\\'"), %{''}].join
188
+ end
189
+ end
190
+
191
+ def process
192
+ text = Deplate::Core.remove_backslashes(get_text)
193
+ @elt = format_particle(:format_code, self, text)
194
+ end
195
+
196
+ def get_text
197
+ @match[1]
198
+ end
199
+ end
200
+
201
+
202
+ # Symbols: <-, ->, <=, =>, <~, ~>, <->, <=>, <~>, !=, ~~, ..., --, ==
203
+ # Markers: +++, ###, ???, !!!
204
+ class Deplate::Particle::Symbol < Deplate::Particle
205
+ register_particle
206
+
207
+ # A hash of symbols and method names for formatting this symbol.
208
+ @@symbols_table = {}
209
+ # An array of symbols in order as they were defined -- as ruby
210
+ # eagerly sorts the keys in the @@symbols_table hash. This is used
211
+ # for building the rx.
212
+ @@symbols_keys = []
213
+
214
+ class << self
215
+ # Add a symbol. If val is nil, a general formatter dependent
216
+ # routine will be used.
217
+ def add_symbol(key, val=nil)
218
+ @@symbols_keys << Regexp.escape(key)
219
+ @@symbols_table[key] = val
220
+ end
221
+
222
+ # Build the rx based on @@symbols_keys.
223
+ def setup_rx
224
+ @rx = Regexp.new(%{^(%s)} % @@symbols_keys.join("|"))
225
+ end
226
+ end
227
+
228
+ for i in [
229
+ ["<->"],
230
+ ["<-" ],
231
+ ["->" ],
232
+ ["<=>"],
233
+ ["<=" ],
234
+ ["=>" ],
235
+ ["<~>"],
236
+ ["<~" ],
237
+ ["~>" ],
238
+ ["!=" ],
239
+ ["~~" ],
240
+ ["..."],
241
+ ["--" ],
242
+ ["==" ],
243
+ ["+++"],
244
+ ["###"],
245
+ ["???"],
246
+ ["!!!"],
247
+ [">>>"],
248
+ ["<<<"],
249
+ ["```", :doublequote_open],
250
+ ["`''", :doublequote_close],
251
+ ["``", :singlequote_open],
252
+ ["`'", :singlequote_close],
253
+ ]
254
+ add_symbol(*i)
255
+ end
256
+ setup_rx
257
+
258
+ def process
259
+ sym = @@symbols_table[@match[1]]
260
+ if sym
261
+ @elt = @deplate.formatter.send(sym, self)
262
+ else
263
+ @elt = format_particle(:format_symbol, self, @match[1])
264
+ end
265
+ end
266
+ end
267
+
268
+
269
+ class Deplate::Particle::DoubleQuote < Deplate::Particle
270
+ register_particle
271
+ set_rx(/^"/)
272
+ def process
273
+ if @last =~ /(^|[\s({\[])$/
274
+ @elt = format_particle(:doublequote_open, self)
275
+ else
276
+ @elt = format_particle(:doublequote_close, self)
277
+ end
278
+ end
279
+ end
280
+
281
+
282
+ class Deplate::Particle::SingleQuote < Deplate::Particle
283
+ register_particle
284
+ set_rx(/^'/)
285
+ def process
286
+ if @last =~ /(^|[\s({\[])$/
287
+ @elt = format_particle(:singlequote_open, self)
288
+ else
289
+ @elt = format_particle(:singlequote_close, self)
290
+ end
291
+ end
292
+ end
293
+
294
+
295
+ # Define interwikis.
296
+ module Deplate::InterWiki
297
+ @@interwikis = {}
298
+ Deplate::InterWikiDef = Struct.new("DeplateInterWikiDef", :id, :url, :sfx)
299
+ class << self
300
+ # Add an interwiki definition. E.g.:
301
+ # Deplate::InterWiki.add("DEPLATE", "http://deplate.sf.net/", ".html")
302
+ def add(id, *args)
303
+ @@interwikis[id] = Deplate::InterWikiDef.new(id, *args)
304
+ end
305
+ end
306
+ end
307
+
308
+
309
+ # This class is meant to be subclassed.
310
+ #
311
+ # The class variables @@uc (upper case letters) and @@lc (lower case
312
+ # letters) define the set of characters allowed in wiki names.
313
+ # International users might want to change the default value in their
314
+ # config.rb file.
315
+ class Deplate::HyperLink < Deplate::Particle
316
+ # @@uc = "A-Z"
317
+ # @@lc = "a-z"
318
+
319
+ # Upper case letters in wiki names.
320
+ @@uc = '[:upper:]'
321
+ # Lower case letters in wiki names.
322
+ @@lc = '[:lower:]'
323
+
324
+ # The name of the interwiki, if any.
325
+ # attr :inter
326
+
327
+ class << self
328
+ # Call this method after changing the markup for hyperlinks, e.g.,
329
+ # by changing the set of allowed characters in wiki names.
330
+ def setup(upper=nil, lower=nil)
331
+ @@uc = upper if upper
332
+ @@lc = lower if lower
333
+ @@ac = "[#{@@uc}#{@@lc}][#{@@uc}#{@@lc}_0-9]+"
334
+ @@bc = "[#{@@uc}#{@@lc}_0-9-][#{@@uc}#{@@lc}_0-9-]+"
335
+ Deplate::HyperLink::Extended.setup
336
+ Deplate::HyperLink::Simple.setup
337
+ end
338
+
339
+ # Concatenate url and anchor, if any.
340
+ def url_anchor(url, anchor)
341
+ dest = [url]
342
+ if anchor and !anchor.empty?
343
+ dest << "#" << anchor
344
+ end
345
+ dest.join
346
+ end
347
+ end
348
+
349
+ include Deplate::InterWiki
350
+
351
+ def get_InterWiki(id)
352
+ d = @@interwikis[id]
353
+ Deplate::Core.log(["Unknown InterWiki name", id], :error, @container.source) unless d
354
+ return d
355
+ end
356
+
357
+ def guess_label(dest, anchor)
358
+ src = @container.source.file
359
+ dest = File.expand_path(dest, src ? File.dirname(src) : nil)
360
+ label = anchor || @deplate.file_label(dest)
361
+ # return @deplate.labels[label]
362
+ return label
363
+ end
364
+
365
+ # guess if a wiki name refers to the file at hand (or its included files) or
366
+ # if it's an external reference/URL.
367
+ #
368
+ # +++ the heuristic is fragile and sometimes gives wrong results
369
+ def complete_wiki_ref(inter, name, dest, anchor)
370
+ sfx = @deplate.variables["suffix"]
371
+ sfx = ".%s" % sfx if sfx
372
+ if dest.empty?
373
+ label = guess_label(dest, anchor)
374
+ if label
375
+ dest = @container.output_file_name(:relative => self)
376
+ return :wiki, name, dest, label
377
+ else
378
+ log(["Wiki reference to unknown anchor", "#{dest}##{anchor}"], :error)
379
+ return nil
380
+ end
381
+ elsif @literal
382
+ return :url, name, dest, anchor
383
+ elsif dest =~ /^#/
384
+ # does it "resemble" an url?
385
+ elsif dest =~ Deplate::HyperLink::Url.rx
386
+ # elsif dest =~ URI::REGEXP::ABS_URI
387
+ if !name or name.empty?
388
+ name = dest
389
+ end
390
+ return :url, name, dest, anchor
391
+ # if its an interwiki name, we rely on the interwiki definition, if
392
+ # provided
393
+ elsif inter
394
+ d = get_InterWiki(inter)
395
+ if d
396
+ return :url, name, d.url + @deplate.file_with_suffix(dest, d.sfx), anchor
397
+ end
398
+ # we then check if the file was included
399
+ elsif @deplate.file_included?(dest, File.dirname(@container.source.file || ""), sfx)
400
+ label = guess_label(@deplate.file_with_suffix(dest, sfx), anchor)
401
+ if label
402
+ dest = @container.output_file_name(:label => label)
403
+ else
404
+ dest = ""
405
+ end
406
+ return :wiki, name, dest, label
407
+ end
408
+ # Fallback heuristic
409
+ src = @container.source.file || ""
410
+ dest_sfx = File.extname(dest)
411
+ dest_abs = File.expand_path(dest, File.basename(src))
412
+ dest_is_dir = (File.exist?(dest_abs) and File.stat(dest_abs).directory?)
413
+ if !dest_is_dir and (dest_sfx == "" or dest_sfx == sfx or dest_sfx == File.extname(src))
414
+ dest1 = @deplate.file_with_suffix(dest, @deplate.options.suffix)
415
+ name = dest1 if !dest_sfx.empty? and (name == dest or name == "")
416
+ return :url, name, dest1, anchor
417
+ else
418
+ return :url, name, dest, anchor
419
+ end
420
+ end
421
+
422
+ def indexing(idx)
423
+ idx = idx.compact
424
+ unless @deplate.variables["indexwiki"] == "no" or idx.empty?
425
+ auto = @deplate.variables["autoindex"]
426
+ for i in idx
427
+ Deplate::Particle.auto_indexing(@deplate, i) if auto
428
+ end
429
+ @idx = idx
430
+ else
431
+ @idx = nil
432
+ end
433
+ end
434
+
435
+ def process
436
+ type, name, dest, anchor = complete_wiki_ref(@inter, *@elt)
437
+ if type
438
+ dest.gsub!(/\\/, "/")
439
+ dest = encode_dest(dest)
440
+ anchor = encode_anchor(anchor)
441
+ if dest =~ Deplate::HyperLink::Url.rx
442
+ if dest =~ /^mailto:/
443
+ @styles << "mailto"
444
+ else
445
+ @styles << "remote"
446
+ end
447
+ end
448
+ case type
449
+ when :wiki
450
+ @elt = format_particle(:format_wiki, self, name, dest, anchor)
451
+ when :url
452
+ @elt = format_particle(:format_url, self, name, dest, anchor)
453
+ end
454
+ if @idx
455
+ @idx.collect! do |idx|
456
+ format_particle(:format_index, self, idx)
457
+ end
458
+ @elt += @idx.join
459
+ end
460
+ end
461
+ end
462
+
463
+ protected
464
+ # Escape special characters from path
465
+ def encode_path(path)
466
+ path = path.split(Regexp.new(Regexp.escape(File::SEPARATOR)))
467
+ hd = path[0] =~ /^[a-zA-Z][:|]$/ ? path.shift : nil
468
+ path = [hd, path.collect {|p| URI.escape(p)}].compact
469
+ File.join(*path)
470
+ end
471
+
472
+ def encode_dest(dest)
473
+ if dest =~ /^~/
474
+ return "file://%s" % File.join(ENV["HOME"], encode_path(dest[1..-1]))
475
+ elsif dest =~ Deplate::HyperLink::Url.rx
476
+ # elsif dest =~ URI::REGEXP::ABS_URI
477
+ # if it looks like an url, we assume that it's already properly encoded
478
+ # or should we do some checks?
479
+ # <+TBD+>
480
+ return dest
481
+ else
482
+ return encode_path(dest)
483
+ # dest = ["file://" + File.expand_path(dest)]
484
+ end
485
+ end
486
+
487
+ def encode_anchor(anchor)
488
+ URI.escape(anchor) if anchor
489
+ end
490
+ end
491
+
492
+
493
+ # Match extended wiki names:
494
+ # [[destination]]
495
+ # [[destination][name]]
496
+ # [[destination#anchor][name]]
497
+ # [[#anchor]]
498
+ # [[#anchor][name]]
499
+ class Deplate::HyperLink::Extended < Deplate::HyperLink
500
+ register_particle
501
+
502
+ class << self
503
+ def setup
504
+ # @rx = /^\[\[([^\]#]*)(#(#{@@bc}))?\](\[(.+?)\])?([-!~*]*)\]/
505
+ @rx = /^\[\[([^\]#]*)(#([^\]]*))?\](\[(.+?)\])?([-!~*]*)\]/
506
+ end
507
+ end
508
+
509
+ def setup
510
+ @inter = nil
511
+ @dest = get_destination || ""
512
+ @anchor = get_anchor
513
+ @name = get_name
514
+ @modifier = get_modifier || ""
515
+ unless @modifier.include?("-")
516
+ if @name
517
+ id = @name
518
+ else
519
+ if !@dest or @dest.empty?
520
+ @name = @anchor
521
+ id = @anchor
522
+ else
523
+ @name = @dest
524
+ id = File.basename(@dest)
525
+ end
526
+ end
527
+ idx = [@deplate.add_index(self, id)]
528
+ else
529
+ idx = []
530
+ end
531
+ @idx = indexing(idx)
532
+ @literal = @modifier.include?("!") # || @dest =~ Deplate::HyperLink::Url.rx
533
+ if @modifier.include?('~') and @dest =~ /^\~/
534
+ @dest = File.expand_path(@dest)
535
+ end
536
+ if @modifier.include?('*')
537
+ @args['target'] = '_blank'
538
+ end
539
+ end
540
+
541
+ def get_destination
542
+ @match[1]
543
+ end
544
+
545
+ def get_anchor
546
+ @match[3]
547
+ end
548
+
549
+ def get_name
550
+ @match[5]
551
+ end
552
+
553
+ def get_modifier
554
+ @match[6]
555
+ end
556
+
557
+ def process
558
+ @name = @deplate.parse_and_format(self, @name, false, [
559
+ Deplate::HyperLink::Extended,
560
+ Deplate::HyperLink::Simple,
561
+ Deplate::HyperLink::Url,
562
+ ])
563
+ @dest = @deplate.parse_and_format(self, @dest, false, [
564
+ Deplate::HyperLink::Extended,
565
+ Deplate::HyperLink::Simple,
566
+ Deplate::HyperLink::Url,
567
+ ])
568
+ # @name = plain_text(Deplate::Core.remove_backslashes(@name))
569
+ @elt = [@name, @dest, @anchor]
570
+ super
571
+ end
572
+ end
573
+
574
+
575
+ # Match simple wiki names.
576
+ #
577
+ # Simple Deplate Names:
578
+ # DeplateName
579
+ # DeplateName#anchor
580
+ #
581
+ # Quoted Deplate Names:
582
+ # [-name-]
583
+ # [-some name-]#there
584
+ #
585
+ # Interdeplate:
586
+ # OTHERDEPLATE::DeplateName
587
+ # OTHERDEPLATE::DeplateName#there
588
+ # OTHERDEPLATE::[-some name-]
589
+ # OTHERDEPLATE::[-some name-]#there
590
+ class Deplate::HyperLink::Simple < Deplate::HyperLink
591
+ register_particle
592
+
593
+ class << self
594
+ def setup
595
+ # @rx = /^((\b[#{@@uc}]+)::)?(\[-(.*?)-\]|\b[#{@@uc}][#{@@lc}]+([#{@@uc}][#{@@lc}0-9]+)+\b)(#(#{@@ac})\b)?/
596
+ @rx = /^(([#{@@uc}]+)::)?(\[-(.*?)-\]|\b[#{@@uc}][#{@@lc}]+([#{@@uc}][#{@@lc}0-9]+)+\b)(#(#{@@ac}))?/
597
+ # @rx = /^(([#{@@uc}]+)::)?(\[-(.*?)-\]|\b[A-Z][#{@@lc}]+([#{@@uc}][#{@@lc}0-9]+)+)(#(#{@@ac}))?(?!#{@@ac})/
598
+ # @rx = /^(([#{@@uc}]+)::)?(\[-(.*?)-\]|\b[#{@@uc}][#{@@lc}]+([#{@@uc}][#{@@lc}0-9]+)+)(#(#{@@ac}))?(?!(#{@@ac}|$))/
599
+ end
600
+ end
601
+
602
+ def setup
603
+ @inter = get_interwiki
604
+ @dest = get_destination
605
+ @anchor = get_anchor
606
+ @literal = nil
607
+ if @dest.empty?
608
+ @name = "#" + @anchor
609
+ else
610
+ @name = @dest
611
+ end
612
+ idx = [@deplate.add_index(self, @name)]
613
+ @idx = indexing(idx)
614
+ end
615
+
616
+ def get_interwiki
617
+ @match[2]
618
+ end
619
+
620
+ def get_destination
621
+ @match[4] || @match[3]
622
+ end
623
+
624
+ def get_anchor
625
+ @match[7]
626
+ end
627
+
628
+ def process
629
+ # @name = @deplate.parse_and_format(self, @name, false)
630
+ @name = plain_text(Deplate::Core.remove_backslashes(@name))
631
+ @elt = [@name, @dest, @anchor]
632
+ super
633
+ end
634
+ end
635
+
636
+
637
+ # Match URLs.
638
+ class Deplate::HyperLink::Url < Deplate::HyperLink
639
+ register_particle
640
+ # We could also try to use URI::REGEXP::ABS_URI
641
+ # @rx = /^((https?|ftps?|nntp|mailto|mailbox):([#{@@uc}#{@@lc}0-9.:%?=&_~@\/\|-]+?))(#([-#{@@uc}#{@@lc}0-9]*))?([.,;:!?)}\]]*\s|$)/
642
+ set_rx(/^((https?|ftps?|nntp|mailto|mailbox|file):(\S+?)(#([-#{@@uc}#{@@lc}0-9]*))?)(?=[.,;:!?)}\]]+\s|\s|$)/)
643
+
644
+ def setup
645
+ @dest = get_destination
646
+ @name = @dest
647
+ @anchor = get_anchor
648
+ @literal = true
649
+ end
650
+
651
+ def get_destination
652
+ # @match[0]
653
+ @match[1]
654
+ end
655
+
656
+ def get_anchor
657
+ # @match[4]
658
+ m = @match[5]
659
+ if m
660
+ rv = m.split(/#/)[1]
661
+ rv
662
+ else
663
+ nil
664
+ end
665
+ end
666
+
667
+ def process
668
+ @name = plain_text(@name)
669
+ @elt = format_particle(:format_url, self, @name, @dest, @anchor)
670
+ end
671
+ end
672
+
673
+ Deplate::HyperLink.setup
674
+
675
+
676
+ # General macro reader. A macro has the form {NAME ARGS: BODY}. Curly
677
+ # braces in the body part have to be escaped with a backslash. ARGS
678
+ # match a series of:
679
+ # * arg!
680
+ # * noArg!
681
+ # * key=value
682
+ # * key="value"
683
+ # * key=(value)
684
+ class Deplate::Particle::Macro < Deplate::Particle
685
+ register_particle
686
+
687
+ # The macro name.
688
+ attr_reader :macro
689
+
690
+ class << self
691
+ # This function builds the rx for the macro reader. The optional
692
+ # argument defines the depth of nested macros for which the
693
+ # regular expression is being built. The default is 5 which should
694
+ # be sufficient due to the primitivity of the macro language.
695
+ def build_rx(depth=5)
696
+ @rx = "\\{(?>\\\\\\{|\\\\\\}|\\\\\\\\|[^{}]+?|#)*\\}"
697
+ @rxr = @rx.gsub("\\", "\\\\\\\\")
698
+ for i in 1..depth
699
+ @rx.gsub!(/#/, @rxr)
700
+ end
701
+ @rx.gsub!(/#/, "[^{}]+?")
702
+ @rx = Regexp.new("^" + @rx)
703
+ end
704
+ end
705
+
706
+ build_rx
707
+
708
+ def setup
709
+ begin
710
+ macro = get_text
711
+ unless macro.empty?
712
+ @macro, args, text = split_name_args(macro)
713
+ if @macro
714
+ @elt = Deplate::Macro.exec(@deplate, @container, @context, @macro, args, @alt, text)
715
+ if @elt
716
+ @args = @elt.args
717
+ else
718
+ args[:match] = @match
719
+ @elt = Deplate::Macro::Unknown.new(@deplate, @container, @context, args, @alt, text)
720
+ end
721
+ @deplate.register_id(@args, @elt)
722
+ else
723
+ Deplate::Core.log(["Malformed macro", @match[0]], :error, @container.source)
724
+ end
725
+ end
726
+ rescue Deplate::DontFormatException
727
+ Deplate::Core.log(["Dropping", @match[0]], nil, @container.source)
728
+ end
729
+ end
730
+
731
+ def get_text
732
+ @match[0][1..-2]
733
+ end
734
+
735
+ def split_name_args(macro)
736
+ m = /^([^a-zA-Z]|[[:alnum:]_]+)(.*)$/.match(macro)
737
+ if m
738
+ macro = m[1]
739
+ if macro =~ /^[^a-zA-Z]/
740
+ text = m[2]
741
+ args = {}
742
+ else
743
+ body = m[2].gsub(/([\\{}])/, '\\\\\\1')
744
+ args, text = @deplate.input.parse_args(m[2], @container)
745
+ end
746
+ [macro, args, text]
747
+ else
748
+ nil
749
+ end
750
+ end
751
+
752
+ def process
753
+ @elt = if @elt then @elt.process else "" end
754
+ end
755
+ end
756
+
757
+
758
+ # Give warnings about misplaced, unbalanced, or not-escaped curly braces.
759
+ class Deplate::Particle::CurlyBrace < Deplate::Particle
760
+ register_particle
761
+ set_rx /^([{}])/
762
+
763
+ def process
764
+ sample_pre = @last[-10..-1]
765
+ sample_post = @rest[0..9]
766
+ Deplate::Core.log(["Curly brace should be preceded by a backslash", "%s>>%s<<%s" % [sample_pre, @match[0], sample_post]], :error, @container.source)
767
+ @elt = plain_text(@match[0], false)
768
+ end
769
+ end
770
+
771
+
772
+ # Match against whitespace. This class is currently only used for
773
+ # template input filter.
774
+ class Deplate::Particle::Whitespace < Deplate::Particle
775
+ set_rx /^\s+/
776
+
777
+ def process
778
+ @elt = @match[0]
779
+ end
780
+ end
781
+
782
+
783
+ # This is a general word class that will some day in the future handle
784
+ # autoidx, index, abbreviation requests.
785
+ # Currently useless.
786
+ class Deplate::Particle::Word < Deplate::Particle
787
+ # register_particle
788
+ set_rx(/^(`?[^[:space:][:punct:]]+)/)
789
+ def process
790
+ word = get_text
791
+ @elt = plain_text(word, false)
792
+ end
793
+ def get_text
794
+ @match[1]
795
+ end
796
+ end
797
+
798
+
799
+ # This class is meant to be subclassed for implementing deprecated-markup
800
+ # warnings as it is done in the markup-1-warn module.
801
+ class Deplate::DeprecatedParticle < Deplate::SimpleParticle
802
+ def process
803
+ Deplate::Core.log(["Deprecated text style", @match[0]], :error, @container.source)
804
+ txt = get_text
805
+ pre, post = get_prepost(@match)
806
+ acc = [
807
+ plain_text(pre.join, false),
808
+ @deplate.format_particles(@elt),
809
+ plain_text(post.join, false)
810
+ ]
811
+ @elt = acc.join
812
+ end
813
+ end
814
+
815
+ # vim: ff=unix