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.
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,763 @@
1
+ # structured.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: 17-M�r-2004.
6
+ # @Last Change: 28-Okt-2005.
7
+ # @Revision: 0.2590
8
+ #
9
+ # TODO:
10
+ # - am Ende des Dokuments muss ein Stapel mit offenen tags abgearbeitet werden
11
+
12
+ require "deplate/formatter"
13
+ require "deplate/abstract-class"
14
+
15
+ # An abstract formatter
16
+
17
+ class Deplate::Formatter::Structured < Deplate::Formatter
18
+ @@bibentries = {}
19
+ @@openLabels = []
20
+
21
+ label_delegate = [
22
+ # :format_heading,
23
+ :format_LIST,
24
+ :format_anchor,
25
+ ]
26
+
27
+ label_once = [
28
+ :format_list_env,
29
+ :format_table,
30
+ :format_IMG,
31
+ :format_IDX,
32
+ :format_paragraph,
33
+ ]
34
+
35
+
36
+ ################################################ Setup {{{1
37
+ def read_bib(bibfiles)
38
+ simple_bibtex_reader(bibfiles)
39
+ end
40
+
41
+ def output_at(type, slot, text)
42
+ ind = @deplate.options.indentation_level.last
43
+ if ind > 0
44
+ text = indent_text(text, ind)
45
+ end
46
+ super(type, slot, text)
47
+ end
48
+
49
+
50
+ ################################################ Lists {{{1
51
+ def format_list_item(invoker, type, level, item, explicit=false)
52
+ args = invoker.args
53
+ # $stderr << "Item #{type}: #{item.body}\n" if $DEBUG
54
+ case type
55
+ when "Numbered"
56
+ open = get_item_numbered_open(args, item.item, item.body)
57
+ close = get_item_numbered_close(args)
58
+ when "Itemize"
59
+ open = get_item_itemize_open(args, item.item, item.body)
60
+ close = get_item_itemize_close(args)
61
+ when "Description"
62
+ open = get_item_description_open(args, item.item, item.body)
63
+ close = get_item_description_close(args)
64
+ when "Paragraph"
65
+ open = get_item_paragraph(args, item.item, item.body)
66
+ close = nil
67
+ else
68
+ raise "Unknown list type: #{item.inspect}"
69
+ end
70
+ open = indent_text(open, level, true)
71
+ close = indent_text(close, level, true)
72
+ return open, close
73
+ end
74
+
75
+ def_abstract :get_item_numbered_open, :get_item_description_close, :get_item_paragraph
76
+
77
+ def format_list_env(invoker, type, level, what, subtype=nil)
78
+ args = invoker.args
79
+ case type
80
+ when "Numbered"
81
+ if what == :open
82
+ tag = get_list_numbered_open(args, subtype)
83
+ elsif what == :close
84
+ tag = get_list_numbered_close(args)
85
+ end
86
+ when "Itemize"
87
+ if what == :open
88
+ tag = get_list_itemize_open(args)
89
+ elsif what == :close
90
+ tag = get_list_itemize_close(args)
91
+ end
92
+ when "Description"
93
+ if what == :open
94
+ tag = get_list_description_open(args)
95
+ elsif what == :close
96
+ tag = get_list_description_close(args)
97
+ end
98
+ else
99
+ raise "Unknown list type: #{type}"
100
+ end
101
+ return indent_text(tag, level, true)
102
+ end
103
+
104
+ def_abstract :get_list_numbered_open, :get_list_numbered_close
105
+ def_abstract :get_list_itemize_open, :get_list_itemize_close
106
+ def_abstract :get_list_description_open, :get_list_description_close
107
+
108
+
109
+ ################################################ General {{{1
110
+ def format_label(invoker, mode=nil, label=nil)
111
+ args = invoker.args
112
+ id = use_id(args)
113
+ label = use_labels(args, label || invoker.label)
114
+ acc = []
115
+ unless !label or label.empty?
116
+ case mode
117
+ when :before
118
+ for l in label
119
+ acc << get_label(args, l, mode)
120
+ @@openLabels << l
121
+ end
122
+ when :after
123
+ for l in label
124
+ if @@openLabels.delete(l)
125
+ acc << get_label(args, l, mode)
126
+ end
127
+ end
128
+ when :once
129
+ for l in label
130
+ text = if block_given? then yield(l) else "" end
131
+ acc << get_label(args, l, mode, text)
132
+ end
133
+ when :closeOpen
134
+ while !@@openLabels.empty?
135
+ l = @@openLabels.pop
136
+ acc << format_label(invoker, :after)
137
+ end
138
+ else
139
+ for l in label.uniq
140
+ text = if block_given? then yield(l) else "" end
141
+ acc << get_label(args, l, mode, text)
142
+ end
143
+ end
144
+ end
145
+ join_inline(acc)
146
+ end
147
+
148
+ def format_figure(invoker, inline=false, elt=nil)
149
+ elt ||= invoker.elt
150
+ args = invoker.args
151
+ if inline
152
+ include_image(elt, args, inline)
153
+ else
154
+ caption = invoker.caption
155
+ fig = @deplate.msg("Figure")
156
+ capAbove = !(caption && caption.args && caption.args.include?("below"))
157
+ if caption
158
+ ti = %{#{fig} #{invoker.level_as_string}}
159
+ cap = get_figure_caption(args, ti, caption.elt, capAbove)
160
+ else
161
+ cap = nil
162
+ end
163
+ get_figure(args, cap, include_image(elt, args))
164
+ end
165
+ end
166
+
167
+ def_abstract :get_figure_caption, :get_figure
168
+
169
+ def include_image(file, args, inline=false)
170
+ f = file[0..-(File.extname(file).size + 1)]
171
+ for sfx in image_suffixes
172
+ ff = f + sfx
173
+ if File.exist?(File.join(@deplate.options.dir || "", ff))
174
+ return get_image(args, ff, f, inline)
175
+ end
176
+ end
177
+ return get_image(args, file, f, inline)
178
+ end
179
+
180
+ def_abstract :get_image, :image_suffixes
181
+
182
+
183
+ ################################################ Elements {{{1
184
+ def format_note(invoker)
185
+ get_note(invoker.args, invoker.marker, invoker.elt)
186
+ end
187
+
188
+ def_abstract :get_note
189
+
190
+ def format_table(invoker)
191
+ elt = invoker.elt
192
+ args = invoker.args
193
+ caption = invoker.caption
194
+ capAbove = !(caption && caption.args && caption.args.include?("below"))
195
+ table = []
196
+ if caption
197
+ cap = %{#{@deplate.msg("Table")} #{invoker.level_as_string}}
198
+ title = get_table_caption(args, cap, caption.elt, capAbove)
199
+ else
200
+ title = nil
201
+ end
202
+ table << get_table_group_open(args, table_row_size(elt))
203
+ mode = nil
204
+ accum = {
205
+ "head" => [],
206
+ "body" => [],
207
+ "foot" => [],
208
+ }
209
+ elt.each_with_index do |row, y|
210
+ if row.head
211
+ nextmode = "head"
212
+ elsif row.foot
213
+ nextmode = "foot"
214
+ elsif row.is_ruler
215
+ # <+TBD+>
216
+ next
217
+ else
218
+ nextmode = "body"
219
+ end
220
+ acc = accum[nextmode]
221
+ catch(:next) do
222
+ t = []
223
+ row.cols.each_with_index do |cell, x|
224
+ case cell
225
+ when :join_left, :join_above
226
+ when :ruler, :noruler
227
+ throw :next
228
+ else
229
+ c = cell.cell
230
+ # if row.head
231
+ # c = get_emphasize(args, c)
232
+ # end
233
+ t << indent_text(get_table_cell(args, c, y, x, cell.span_x, cell.span_y))
234
+ end
235
+ end
236
+ acc << get_table_row_open(args)
237
+ acc << join_blocks(t)
238
+ acc << get_table_row_close(args)
239
+ end
240
+ end
241
+ for type in get_table_order
242
+ acc = accum[type]
243
+ unless acc.empty?
244
+ table << send("get_table_#{type}_open", args)
245
+ table << indent_text(join_blocks(acc))
246
+ table << send("get_table_#{type}_close", args)
247
+ end
248
+ end
249
+ table << get_table_group_close(args)
250
+ note = args["note"]
251
+ if note
252
+ note = @deplate.parse_and_format(invoker, note)
253
+ acc << get_table_note(args, note)
254
+ end
255
+
256
+ get_table(args, title, join_blocks(table))
257
+ end
258
+
259
+ def_abstract :get_table, :get_table_row_open, :get_table_row_close, :get_table_group_open, :get_table_group_close, :get_table_cell, :get_table_note
260
+
261
+ def format_heading(invoker)
262
+ acc = []
263
+ acc << close_headings(invoker.level)
264
+ acc << format_heading_open(invoker)
265
+ @deplate.options.headings = [] unless @deplate.options.headings
266
+ @deplate.options.headings << invoker
267
+ join_blocks(acc)
268
+ end
269
+
270
+ def format_list(invoker)
271
+ printable_list(invoker)
272
+ end
273
+
274
+ def format_break(invoker)
275
+ format_pagebreak(invoker, "break")
276
+ end
277
+
278
+ def format_anchor(invoker)
279
+ format_label(invoker, :once)
280
+ end
281
+
282
+ def format_paragraph(invoker)
283
+ get_paragraph(invoker.args, invoker.elt)
284
+ end
285
+
286
+
287
+ ################################################ Regions {{{1
288
+ def format_verbatim(invoker, text=nil)
289
+ text = invoker.elt unless text
290
+ args = invoker.args
291
+ begin
292
+ @deplate.options.indentation_level << 0
293
+ # It's up to get_pre_format to deal with this.
294
+ # text = plain_text(text, false, false)
295
+ get_pre_format(args, text)
296
+ ensure
297
+ @deplate.options.indentation_level.pop
298
+ end
299
+ end
300
+
301
+ def format_abstract(invoker)
302
+ get_block_abstract(invoker.args, invoker.elt)
303
+ end
304
+
305
+ def_abstract :get_block_abstract
306
+
307
+ def format_quote(invoker)
308
+ args = invoker.args
309
+ elt = invoker.elt
310
+ if args["long"]
311
+ get_block_quote(args, elt)
312
+ else
313
+ get_block_longquote(args, elt)
314
+ end
315
+ end
316
+
317
+ def_abstract :get_block_longquote, :get_block_quote
318
+
319
+ def format_header(invoker)
320
+ format_header_or_footer(invoker, :pre, :header, :get_header)
321
+ end
322
+
323
+ def_abstract :get_header
324
+
325
+ def format_footer(invoker)
326
+ format_header_or_footer(invoker, :post, :footer, :get_footer)
327
+ end
328
+
329
+ def_abstract :get_footer
330
+
331
+
332
+ ################################################ Commands {{{1
333
+ def format_title(invoker)
334
+ args = invoker.args
335
+ acc = []
336
+ for i, c in [["title", :get_title_title],
337
+ ["author", :get_title_author],
338
+ ["authornote", :get_title_authornote],
339
+ ["date", :get_title_date]]
340
+ ii = @deplate.get_clip(i)
341
+ acc << send(c, args, ii.elt) if ii
342
+ end
343
+ get_title(args, join_blocks(acc), args["page"])
344
+ end
345
+
346
+ def_abstract :get_title, :get_title_date, :get_title_authornote, :get_title_author, :get_title_title
347
+
348
+ alias :format_IMG :format_figure
349
+
350
+ alias :format_MAKETITLE :format_title
351
+
352
+ def format_MAKEBIB(invoker)
353
+ args = invoker.args
354
+ bib = format_bibliography(invoker) do |key, labels, text|
355
+ get_bib_entry(args, key, text)
356
+ end
357
+ title = @deplate.msg("Bibliography")
358
+ get_bib(args, title, bib)
359
+ end
360
+
361
+ def_abstract :get_bib, :get_bib_entry
362
+
363
+ def format_IDX(invoker)
364
+ invoker.elt
365
+ end
366
+
367
+ def format_pagebreak(invoker, style=nil, major=false)
368
+ case style
369
+ when "title"
370
+ nil
371
+ when "list"
372
+ nil
373
+ else
374
+ get_pagebreak(invoker.args)
375
+ end
376
+ end
377
+
378
+
379
+ ################################################ Particles {{{1
380
+ # Shouldn't this be an alias to get_emphasize?
381
+ def format_emphasize(args, text)
382
+ get_emphasize(args, text)
383
+ end
384
+
385
+ def_abstract :get_emphasize
386
+
387
+ def format_code(args, text)
388
+ get_code(args, plain_text(text, true, false))
389
+ end
390
+
391
+ def_abstract :get_code
392
+
393
+ def format_url(args, name, dest, anchor, literal=false)
394
+ dest = Deplate::HyperLink.url_anchor(dest, anchor)
395
+ get_url(args, name, dest, anchor)
396
+ end
397
+
398
+ def_abstract :get_url
399
+
400
+ def format_wiki(args, name, dest, anchor)
401
+ dest = Deplate::HyperLink.url_anchor(dest, anchor)
402
+ get_wiki(args, name, dest, anchor)
403
+ end
404
+
405
+ def_abstract :get_wiki
406
+
407
+
408
+ ################################################ Macros {{{1
409
+ def format_index(invoker, idx)
410
+ args = invoker.args
411
+ i = Deplate::Core.get_index_name(idx)
412
+ n = plain_text(i).gsub(/,/, "{,}")
413
+ # n = i.gsub(/,/, "{,}")
414
+ return get_index(args, idx.label, n)
415
+ end
416
+
417
+ def format_footnote(invoker)
418
+ args = invoker.args
419
+ elt = invoker.elt
420
+ if elt and elt.elt and elt.elt.consumed
421
+ fn = elt.elt
422
+ lab = fn.label
423
+ if @deplate.footnotes_used.include?(lab)
424
+ return get_footnote_ref(args, lab, fn.body)
425
+ else
426
+ @deplate.footnotes_used << lab
427
+ @deplate.footnote_last_idx +=1
428
+ return get_footnote(args, lab, fn.body)
429
+ end
430
+ else
431
+ return ""
432
+ end
433
+ end
434
+
435
+ def_abstract :get_footnote, :get_footnote_ref
436
+
437
+ def format_ref(invoker)
438
+ args = invoker.args
439
+ text = invoker.text
440
+ container = invoker.container
441
+ o = @deplate.label_aliases[text]
442
+ if o
443
+ t = o.top_heading.get_id
444
+ f0 = container.output_file_name
445
+ f = container.output_file_name(:label => text)
446
+ f = "" if f == f0
447
+ ref = get_ref(args, f, text, t)
448
+ else
449
+ log(["Undefined label", text], :error)
450
+ ref = "??"
451
+ end
452
+ return nonbreakingspace(nil) + ref
453
+ end
454
+
455
+ def_abstract :get_ref
456
+
457
+ def format_linebreak(invoker)
458
+ return get_linebreak(invoker.args, invoker.container)
459
+ end
460
+
461
+ def_abstract :get_linebreak
462
+
463
+ def format_cite(invoker)
464
+ args = invoker.args
465
+ elt = invoker.elt
466
+ container = invoker.container
467
+ n = args["n"]
468
+ p = args["p"]
469
+ acc = []
470
+ for c in elt
471
+ cc = bib_entry(c)
472
+ if cc
473
+ e = {}
474
+ yr = cc.assoc("year")
475
+ yr = if yr then yr[1] else "" end
476
+ e[:year] = yr
477
+ if n
478
+ e[:note] = @deplate.parse_and_format(container, n)
479
+ n = nil
480
+ end
481
+ if p
482
+ p = @deplate.parse_and_format(container, "#{@deplate.msg("p.\\ ")}#{p}")
483
+ e[:pages] = p
484
+ end
485
+ nm = cc.assoc("author") || cc.assoc("editor")
486
+ if nm
487
+ nm = nm[1].gsub(/\s+/, " ").split(" and ").collect do |a|
488
+ a.scan(/\w+$/)
489
+ end
490
+ e[:name] = nm
491
+ else
492
+ e[:name] = c
493
+ end
494
+ e[:id] = c
495
+ acc << e
496
+ end
497
+ end
498
+ return get_citation(args, acc)
499
+ end
500
+
501
+ def format_subscript(invoker)
502
+ return get_subscript(invoker.args, invoker.elt)
503
+ end
504
+
505
+ def_abstract :get_subscript
506
+
507
+ def format_superscript(invoker)
508
+ return get_superscript(invoker.args, invoker.elt)
509
+ end
510
+
511
+ def_abstract :get_superscript
512
+
513
+ def format_stacked(invoker)
514
+ elt = invoker.elt
515
+ return get_stacked(invoker.args, elt[0], elt[1])
516
+ end
517
+
518
+ def format_pagenumber(invoker)
519
+ # <+TBD+>
520
+ return ""
521
+ end
522
+
523
+
524
+ protected ###################################### protected {{{1
525
+ ################################################ General {{{1
526
+ def format_header_or_footer(invoker, type, slot, get_method)
527
+ accum = []
528
+ for e in invoker.elt
529
+ e.doc_type = :array
530
+ e.doc_slot = accum
531
+ e.format_current
532
+ end
533
+ output_preferably_at(invoker, type, slot, send(get_method, invoker.args, join_blocks(accum)))
534
+ end
535
+
536
+ def index_entry_label(text)
537
+ return "idxEntry00" + text.gsub(/\W/, "00")
538
+ end
539
+
540
+
541
+ ################################################ Bibs {{{1
542
+ def get_cited(args, entries)
543
+ acc = []
544
+ for e in entries
545
+ n = e[:note] ? "%s " % e[:note] : ""
546
+ a = e[:name]
547
+ y = e[:year]
548
+ p = e[:pages] ? ": %s" % e[:pages] : ""
549
+ if a and y
550
+ m = "%s %s" % [a, y]
551
+ else
552
+ m = a || y
553
+ end
554
+ acc << [n, m, p].join
555
+ end
556
+ acc.join("; ")
557
+ end
558
+
559
+ def get_citation(args, entries)
560
+ rv = get_cited(args, entries)
561
+ if args["np"]
562
+ return rv
563
+ else
564
+ return "%s(%s)" % [nonbreakingspace(nil), rv]
565
+ end
566
+ end
567
+
568
+ alias :format_bib_entry_re_structured :format_bib_entry
569
+ def format_bib_entry(invoker, bibdef)
570
+ args = invoker.args
571
+ bib = Hash[*bibdef.flatten]
572
+ be = ["author", "title", "pages"]
573
+ entry = {}
574
+ process_bib_entry_part(invoker, args, entry, bib, be)
575
+ # for e in be
576
+ # ee = bib[e]
577
+ # if ee
578
+ # ee = simple_latex_reformat(ee)
579
+ # ee = @deplate.parse_and_format(invoker.container, ee)
580
+ # entry[e] = self.send("get_bib_#{e}", args, )
581
+ # end
582
+ # end
583
+ container = {}
584
+ bc = ["editor", "year", "booktitle", "publisher", "journal", "volume", "number"]
585
+ process_bib_entry_part(invoker, args, container, bib, bc)
586
+ # for e in bc
587
+ # ee = bib[e]
588
+ # container[e] = self.send("get_bib_%s" % e, args, simple_latex_reformat(ee)) if ee
589
+ # end
590
+ return get_bib_relation(args, bib["type"], entry, container)
591
+ end
592
+
593
+ def process_bib_entry_part(invoker, args, accum, bibdef, parts)
594
+ for e in parts
595
+ ee = bibdef[e]
596
+ if ee
597
+ ee = simple_latex_reformat(ee)
598
+ ee = @deplate.parse_and_format(invoker.container, ee)
599
+ accum[e] = self.send("get_bib_#{e}", args, ee)
600
+ end
601
+ end
602
+ end
603
+
604
+ def_abstract :get_bib_relation, :get_bib_editor, :get_bib_year, :get_bib_booktitle,
605
+ :get_bib_publisher, :get_bib_journal, :get_bib_volume, :get_bib_number,
606
+ :get_bib_author, :get_bib_title, :get_bib_pages
607
+
608
+
609
+
610
+ ################################################ Headings {{{1
611
+ def format_heading_open(invoker)
612
+ l = format_label(invoker)
613
+ @deplate.options.indentation_level << invoker.level
614
+ get_heading_open(invoker.args, invoker.level, invoker.level_as_string, invoker.elt, l)
615
+ end
616
+
617
+ def format_heading_close(invoker)
618
+ @deplate.options.indentation_level.pop
619
+ get_heading_close(invoker.args, invoker.level)
620
+ end
621
+
622
+ def close_headings(level)
623
+ hds = @deplate.options.headings
624
+ if hds
625
+ acc = []
626
+ loop do
627
+ hd = hds.last
628
+ if hd and level <= hd.level
629
+ acc << format_heading_close(hd)
630
+ hds.pop
631
+ else
632
+ break
633
+ end
634
+ end
635
+ return join_blocks(acc)
636
+ end
637
+ end
638
+
639
+
640
+ ################################################ List of ... {{{1
641
+ def format_list_of_contents(invoker)
642
+ format_list_of(invoker, "Table of Contents", @deplate.table_of_contents, "hd", false)
643
+ end
644
+ alias :format_list_of_toc :format_list_of_contents
645
+
646
+ def format_list_of_minitoc(invoker)
647
+ # <+TBD+>
648
+ # data = @deplate.table_of_contents.find_all {|e| e.level == 1}
649
+ # format_list_of("Contents", data, "hd", false, deplate.variables["navGif"]) do |hd|
650
+ # hd.args["shortcaption"] || hd.args["id"]
651
+ # end
652
+ end
653
+
654
+ def format_list_of_tables(invoker)
655
+ get_list_of_tables(invoker.args, @deplate.table_of_tables)
656
+ end
657
+
658
+ def_abstract :get_list_of_tables
659
+
660
+ def format_list_of_figures(invoker)
661
+ get_list_of_figures(invoker.args, @deplate.table_of_figures)
662
+ end
663
+
664
+ def_abstract :get_list_of_figures
665
+
666
+ def format_list_of_index(invoker)
667
+ get_list_of_index(invoker.args, @deplate.index)
668
+ end
669
+
670
+ def_abstract :get_list_of_index
671
+
672
+ def format_list_of(invoker, name, data, prefix, flat=false)
673
+ args = invoker.args
674
+ name = args["title"] || name
675
+ acc = []
676
+ acc << get_contents_open(args, prefix)
677
+ ll = 1
678
+ accData = []
679
+ for hd in data
680
+ unless hd.args["noList"]
681
+ l = if flat then 1 else hd.level end
682
+ f = hd.output_file_name(:relative => invoker)
683
+ d = f + "#" + @deplate.elt_label(prefix, hd.level_as_string)
684
+ v = if hd.caption then hd.caption.elt else v = hd.elt.dup end
685
+ v = [hd.level_as_string, v].join(" ")
686
+ b = format_url(invoker, v, d, nil, true)
687
+ s = Deplate::ListItem.new(nil, b, "Itemize", "Itemize", l, 0, true)
688
+ accData << s
689
+ end
690
+ end
691
+ acc << get_contents_list(args, prefix, accData)
692
+ acc << get_contents_close(args, prefix)
693
+ join_blocks(acc)
694
+ end
695
+
696
+ # <+TBD+>
697
+ def format_the_index(invoker, name, data, prefix="", flat=false)
698
+ accum = []
699
+ chars = []
700
+
701
+ # accum << get_index_open(@args)
702
+ for n, arr in invoker.sort_index_entries(data)
703
+ cht = get_first_char(n, true)
704
+ if !chars.include?(cht)
705
+ chars << cht
706
+ lab = format_label(invoker, :string, [format_index_hd_label(cht)])
707
+ accum << get_index_group_close(@args)
708
+ accum << get_index_toc_entry(@args, cht, lab)
709
+ accum << get_index_group_open(@args)
710
+ end
711
+ acc = []
712
+ for i in arr
713
+ ff = @deplate.dest
714
+ f = i.file || invoker.output_file_name(:level_as_string => i.level_as_string,
715
+ :relative => invoker)
716
+ if f == ff
717
+ f = ""
718
+ l = i.level_as_string
719
+ if l and !l.empty?
720
+ t = l
721
+ elsif @deplate.options.multi_file_output
722
+ t = @deplate.variables["refButton"]
723
+ else
724
+ t = "I"
725
+ end
726
+ else
727
+ t = @deplate.file_with_suffix(f, "", true)
728
+ end
729
+ acc << format_url(invoker, t, f, i.label, true)
730
+ end
731
+ l = format_label(invoker, :string, [index_entry_label(n)])
732
+ accum << get_index_item(@args, l, plain_text(n), acc)
733
+ end
734
+ accum << get_index_close(@args)
735
+
736
+ acc = []
737
+ acc << get_index_toc_open(@args)
738
+ for c in chars
739
+ acc << format_url(invoker, c, "", format_index_hd_label(c), true)
740
+ end
741
+ acc << get_index_toc_close(@args)
742
+ acc << join_blocks(accum)
743
+ join_blocks(acc)
744
+ end
745
+
746
+ def format_index_hd_label(char)
747
+ return "hdIdx#{char}"
748
+ end
749
+
750
+
751
+ ################################################ Particles {{{1
752
+ def get_stacked(args, above, below)
753
+ get_subscript(args, below) + get_superscript(args, above)
754
+ end
755
+
756
+ end
757
+
758
+ class Deplate::Element::Heading
759
+ def hook_post_setup_structured
760
+ @label_mode = :after
761
+ end
762
+ end
763
+