deplate 0.7.3 → 0.8

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 (160) hide show
  1. data/AUTHORS.TXT +3 -0
  2. data/CHANGES.TXT +248 -175
  3. data/LICENSE.TXT +0 -0
  4. data/NEWS.TXT +28 -24
  5. data/README.TXT +0 -0
  6. data/TODO.TXT +174 -88
  7. data/VERSION.TXT +1 -1
  8. data/bin/deplate +0 -0
  9. data/bin/deplate.bat +0 -0
  10. data/etc/deplate.ini +91 -3
  11. data/lib/action_view/helpers/deplate.rb +45 -0
  12. data/lib/deplate.rb +6 -1
  13. data/lib/deplate/abstract-class.rb +0 -0
  14. data/lib/deplate/bib.rb +576 -0
  15. data/lib/deplate/builtin.rb +0 -0
  16. data/lib/deplate/cache.rb +55 -5
  17. data/lib/deplate/commands.rb +346 -183
  18. data/lib/deplate/common.rb +209 -48
  19. data/lib/deplate/converter.rb +12 -6
  20. data/lib/deplate/core.rb +777 -378
  21. data/lib/deplate/counters.rb +254 -0
  22. data/lib/deplate/css/article.css +4 -3
  23. data/lib/deplate/css/deplate.css +121 -5
  24. data/lib/deplate/css/heading-navbar.css +0 -0
  25. data/lib/deplate/css/layout-deplate-print.css +0 -0
  26. data/lib/deplate/css/layout-deplate.css +0 -0
  27. data/lib/deplate/css/sans-serif.css +0 -0
  28. data/lib/deplate/css/serif-e.css +0 -0
  29. data/lib/deplate/css/serif-rel.css +0 -0
  30. data/lib/deplate/css/serif.css +9 -3
  31. data/lib/deplate/css/slides.css +0 -0
  32. data/lib/deplate/css/tabbar-left.css +0 -0
  33. data/lib/deplate/css/tabbar-right-ie.css +3 -9
  34. data/lib/deplate/css/tabbar-right.css +51 -18
  35. data/lib/deplate/css/tabbar-top.css +7 -1
  36. data/lib/deplate/css/tabbar.css +0 -0
  37. data/lib/deplate/css/text-sans-serif.css +0 -0
  38. data/lib/deplate/css/text-serif.css +0 -0
  39. data/lib/deplate/define.rb +183 -177
  40. data/lib/deplate/deplate-string.rb +82 -0
  41. data/lib/deplate/docbook.rb +236 -128
  42. data/lib/deplate/elements.rb +584 -417
  43. data/lib/deplate/etc.rb +163 -101
  44. data/lib/deplate/external.rb +42 -11
  45. data/lib/deplate/fmt/dbk-article-4.1.2.rb +0 -0
  46. data/lib/deplate/fmt/dbk-article.rb +0 -0
  47. data/lib/deplate/fmt/dbk-book.rb +0 -0
  48. data/lib/deplate/fmt/dbk-ref.rb +3 -3
  49. data/lib/deplate/fmt/dbk-slides.rb +0 -0
  50. data/lib/deplate/fmt/dbk-snippet.rb +0 -0
  51. data/lib/deplate/fmt/html-snippet.rb +0 -0
  52. data/lib/deplate/fmt/html.rb +783 -550
  53. data/lib/deplate/fmt/htmlsite.rb +192 -199
  54. data/lib/deplate/fmt/htmlslides.rb +0 -0
  55. data/lib/deplate/fmt/htmlwebsite.rb +3 -3
  56. data/lib/deplate/fmt/latex-snippet.rb +0 -0
  57. data/lib/deplate/fmt/latex.rb +242 -83
  58. data/lib/deplate/fmt/null.rb +32 -0
  59. data/lib/deplate/fmt/php.rb +4 -4
  60. data/lib/deplate/fmt/phpsite.rb +6 -5
  61. data/lib/deplate/fmt/plain.rb +160 -106
  62. data/lib/deplate/fmt/template.rb +0 -0
  63. data/lib/deplate/fmt/xhtml10t.rb +0 -0
  64. data/lib/deplate/formatter-snippet.rb +0 -0
  65. data/lib/deplate/formatter.rb +613 -301
  66. data/lib/deplate/input.rb +202 -142
  67. data/lib/deplate/input/deplate-headings.rb +4 -6
  68. data/lib/deplate/input/deplate-restricted.rb +15 -9
  69. data/lib/deplate/input/deplate.rb +2 -4
  70. data/lib/deplate/input/rdoc.rb +39 -38
  71. data/lib/deplate/input/template.rb +0 -0
  72. data/lib/deplate/lib/Makefile.config +29 -0
  73. data/lib/deplate/lib/latex/deplate.sty +54 -0
  74. data/lib/deplate/lib/latex/highlight-extra.sty +0 -0
  75. data/lib/deplate/lib/latex/highlight-typical.sty +0 -0
  76. data/lib/deplate/lib/php/page-comment.inc.php +216 -0
  77. data/lib/deplate/lib/tabmenu.js +0 -0
  78. data/lib/deplate/locale/de.latin1 +155 -17
  79. data/lib/deplate/locale/ru.koi8-r +0 -0
  80. data/lib/deplate/locale/zh_cn.gb2312 +0 -0
  81. data/lib/deplate/macros.rb +133 -82
  82. data/lib/deplate/messages.rb +6 -4
  83. data/lib/deplate/metadata.rb +0 -0
  84. data/lib/deplate/metadata/marshal.rb +0 -0
  85. data/lib/deplate/metadata/xml.rb +0 -0
  86. data/lib/deplate/metadata/yaml.rb +0 -0
  87. data/lib/deplate/mod/anyword.rb +3 -3
  88. data/lib/deplate/mod/babelfish.rb +4 -4
  89. data/lib/deplate/mod/code-gvim.rb +8 -4
  90. data/lib/deplate/mod/code-highlight.rb +3 -3
  91. data/lib/deplate/mod/colored-log.rb +0 -0
  92. data/lib/deplate/mod/de.rb +2 -2
  93. data/lib/deplate/mod/en.rb +0 -0
  94. data/lib/deplate/mod/endnotes.rb +0 -0
  95. data/lib/deplate/mod/fr.rb +0 -0
  96. data/lib/deplate/mod/html-asciimath.rb +0 -0
  97. data/lib/deplate/mod/html-deplate-button.rb +0 -0
  98. data/lib/deplate/mod/html-headings-navbar.rb +5 -13
  99. data/lib/deplate/mod/html-jsmath.rb +39 -0
  100. data/lib/deplate/mod/html-obfuscate-email.rb +3 -3
  101. data/lib/deplate/mod/html-sidebar.rb +0 -0
  102. data/lib/deplate/mod/htmlslides-navbar-fh.rb +3 -3
  103. data/lib/deplate/mod/iconv.rb +0 -0
  104. data/lib/deplate/mod/imgurl.rb +4 -4
  105. data/lib/deplate/mod/inlatex-compound.rb +7 -10
  106. data/lib/deplate/mod/koma.rb +0 -0
  107. data/lib/deplate/mod/latex-emph-table-head.rb +0 -0
  108. data/lib/deplate/mod/latex-styles.rb +7 -4
  109. data/lib/deplate/mod/latex-verbatim-small.rb +0 -0
  110. data/lib/deplate/mod/makefile.rb +23 -7
  111. data/lib/deplate/mod/mark-external-urls.rb +3 -3
  112. data/lib/deplate/mod/markup-1-warn.rb +10 -10
  113. data/lib/deplate/mod/markup-1.rb +0 -0
  114. data/lib/deplate/mod/navbar-png.rb +24 -8
  115. data/lib/deplate/mod/noindent.rb +0 -0
  116. data/lib/deplate/mod/numpara.rb +0 -0
  117. data/lib/deplate/mod/particle-math.rb +4 -4
  118. data/lib/deplate/mod/php-extra.rb +46 -6
  119. data/lib/deplate/mod/pstoedit.rb +0 -0
  120. data/lib/deplate/mod/recode.rb +0 -0
  121. data/lib/deplate/mod/ru_koi8-r.rb +0 -0
  122. data/lib/deplate/mod/smart-dash.rb +26 -0
  123. data/lib/deplate/mod/smiley.rb +69 -7
  124. data/lib/deplate/mod/soffice.rb +0 -0
  125. data/lib/deplate/mod/symbols-latin1.rb +14 -23
  126. data/lib/deplate/mod/symbols-od-utf-8.rb +5 -3
  127. data/lib/deplate/mod/symbols-plain.rb +5 -35
  128. data/lib/deplate/mod/symbols-sgml.rb +8 -9
  129. data/lib/deplate/mod/symbols-utf-8.rb +8 -9
  130. data/lib/deplate/mod/symbols-xml.rb +5 -9
  131. data/lib/deplate/mod/syntax-region-alt.rb +5 -5
  132. data/lib/deplate/mod/utf8.rb +0 -0
  133. data/lib/deplate/mod/validate-html.rb +0 -0
  134. data/lib/deplate/mod/xmlrpc.rb +0 -0
  135. data/lib/deplate/mod/zh-cn-autospace.rb +18 -20
  136. data/lib/deplate/mod/zh-cn.rb +4 -6
  137. data/lib/deplate/nukumi2.rb +71 -0
  138. data/lib/deplate/once-method.rb +0 -0
  139. data/lib/deplate/output.rb +19 -21
  140. data/lib/deplate/particles.rb +178 -116
  141. data/lib/deplate/regions.rb +99 -58
  142. data/lib/deplate/skeletons.rb +122 -0
  143. data/lib/deplate/structured.rb +164 -106
  144. data/lib/deplate/template.rb +67 -43
  145. data/lib/deplate/templates/html-doc.html +0 -0
  146. data/lib/deplate/templates/html-left-tabbar-js.html +0 -0
  147. data/lib/deplate/templates/html-left-tabbar.html +0 -0
  148. data/lib/deplate/templates/html-tabbar-right-pcomments.php +22 -0
  149. data/lib/deplate/templates/html-tabbar-right-step.html +24 -0
  150. data/lib/deplate/templates/html-tabbar-right-table.html +0 -0
  151. data/lib/deplate/templates/html-tabbar-right.html +2 -4
  152. data/lib/deplate/templates/html-tabbar-top.html +0 -9
  153. data/lib/deplate/templates/html-tabbar.html +0 -0
  154. data/lib/deplate/variables.rb +127 -0
  155. data/lib/deplate/wiki-markup.rb +99 -33
  156. data/lib/deplate/xml.rb +18 -18
  157. data/lib/deplate/zh-cn.rb +0 -0
  158. data/lib/ps2ppm.rb +0 -0
  159. data/man/man1/deplate.1 +564 -474
  160. metadata +201 -186
@@ -3,18 +3,38 @@
3
3
  # @Website: http://deplate.sf.net/
4
4
  # @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
5
5
  # @Created: 16-Okt-2005.
6
- # @Last Change: 01-Nov-2005.
7
- # @Revision: 0.30
6
+ # @Last Change: 29-Apr-2006.
7
+ # @Revision: 0.308
8
8
 
9
9
  require 'deplate/common'
10
10
 
11
+
12
+ module Deplate::Rx
13
+ # This function builds recursive regular expressions that are used
14
+ # for parsing macros and skeletons. The optional argument defines
15
+ # the depth of nested macros for which the regular expression is
16
+ # being built. The default is 5 which should be sufficient due to
17
+ # the primitivity of the macro language. The string "{#}" is
18
+ # replaced with the regexp itself.
19
+ def builder(rx_source, rx_opts=nil, depth=5, sol=true)
20
+ rxr = rx_source.gsub('\\', '\\\\\\\\')
21
+ for i in 1..depth
22
+ rx_source.gsub!(/\{#\}/, rxr)
23
+ end
24
+ rx_source.gsub!(/\{#\}/, '[^{}]+?')
25
+ rx_source = '^' + rx_source if sol
26
+ return Regexp.new(rx_source, rx_opts)
27
+ end
28
+ module_function :builder
29
+ end
30
+
11
31
  class Deplate::PseudoContainer < Deplate::BaseElement
12
32
  attr_accessor :registered_metadata
13
33
  attr_reader :destination
14
34
 
15
35
  def initialize(deplate, args)
16
36
  super(deplate, args)
17
- @level_as_string = args[:level_as_string]
37
+ self.level_as_string = args[:level_as_string]
18
38
  @top_heading = args[:top] || deplate.get_current_top
19
39
  @registered_metadata = args[:metadata] || []
20
40
  @accum = args[:accum] || []
@@ -38,14 +58,15 @@ end
38
58
 
39
59
 
40
60
  class Deplate::NullTop < Deplate::PseudoContainer
41
- attr_reader :args, :caption
61
+ attr_reader :args, :caption, :level_heading
42
62
  attr_accessor :first_top, :last_top, :description
43
63
 
44
64
  def initialize(deplate, args)
45
65
  super
66
+ @level_heading = [0]
46
67
  @destination = args[:destination]
47
- @args = {:id => "deplateNullTop"}
48
- @caption = deplate.msg("[Start]")
68
+ @args = {:id => 'deplateNullTop'}
69
+ @caption = Deplate::CaptionDef.new(deplate.msg('[Start]'), {}, nil)
49
70
  @description = nil
50
71
  @first_top = false
51
72
  @last_top = false
@@ -55,6 +76,72 @@ class Deplate::NullTop < Deplate::PseudoContainer
55
76
  end
56
77
 
57
78
 
79
+ module Deplate::Footnote
80
+ attr_reader :fnId
81
+ # Quack like Deplate::Region
82
+ attr_reader :accum, :regNote, :label, :level, :caption, :captionOptions
83
+
84
+ def footnote_setup(text)
85
+ if text
86
+ @fnId = @args['id']
87
+ if @fnId and text and !text.empty?
88
+ @regNote = @fnId
89
+ @accum = text
90
+ # @level = @container.level
91
+ fn = Deplate::Regions::Footnote.new(@deplate, @source, @regNote, {}, self)
92
+ fn.finish
93
+ else
94
+ @fnId ||= text
95
+ end
96
+ if @container.kind_of?(Deplate::Element::Table)
97
+ @container.contains_footnotes = true
98
+ end
99
+ else
100
+ log('No footnote ID', :error)
101
+ end
102
+ end
103
+
104
+ def footnote_process
105
+ fn = @deplate.footnotes[@fnId]
106
+ if fn
107
+ # fn.elt.consumed = true
108
+ fn.fn_consumed = true
109
+ @elt = fn
110
+ else
111
+ log(['Unknown footnote', @fnId, @deplate.footnotes.keys.inspect], :error)
112
+ @elt = nil
113
+ end
114
+ return format_particle(:format_footnote, self)
115
+ end
116
+ end
117
+
118
+
119
+ class Deplate::IndexEntry
120
+ attr_accessor :container, :name, :synonymes, :label
121
+ attr_writer :file, :level_as_string
122
+
123
+ def initialize(container)
124
+ @container = container
125
+ unless container
126
+ # p "DBG IndexEntry: container = nil"
127
+ end
128
+ if block_given?
129
+ yield(self)
130
+ end
131
+ end
132
+
133
+ def file(invoker=nil)
134
+ # @file || (@container && @container.output_file_name(:relative => invoker))
135
+ @file
136
+ end
137
+
138
+ def level_as_string
139
+ # @level_as_string || (@container && @container.level_as_string)
140
+ @level_as_string
141
+ end
142
+ end
143
+
144
+
58
145
  class Deplate::Source
59
146
  attr_accessor :file, :begin, :end, :level_as_string, :stats
60
147
 
@@ -68,104 +155,12 @@ class Deplate::Source
68
155
  end
69
156
 
70
157
 
71
- module Deplate::Symbols
72
- end
158
+ # module Deplate::Symbols
159
+ # end
73
160
 
74
161
 
75
- class Deplate::Variables < Hash
76
- attr_accessor :deplate
77
-
78
- def initialize(deplate=nil)
79
- super()
80
- @deplate = deplate
81
- end
82
-
83
- def update(hash)
84
- for key, val in hash
85
- self[key] = val
86
- end
87
- end
88
-
89
- def []=(name, value)
90
- if (m = /^(\S+)\[(\S+)?\]$/.match(name))
91
- key = m[1]
92
- field = m[2]
93
- var = self[key]
94
- if !var
95
- if !field
96
- self[key] = [value]
97
- elsif field =~ /^[0-9]$/
98
- self[key] = []
99
- self[key][field.to_i] = value
100
- else
101
- self[key] = {field => value}
102
- end
103
- elsif var.kind_of?(Struct) || var.kind_of?(OpenStruct)
104
- var.send("#{field}=", value)
105
- elsif var.kind_of?(Hash)
106
- var[field] = value
107
- elsif var.kind_of?(Array)
108
- if !field
109
- var << value
110
- elsif field =~ /^[0-9]+$/
111
- field = field.to_i
112
- var[field] = value
113
- else
114
- Deplate::Core.log(["Wrong index", field, name, var.class], :error)
115
- end
116
- elsif var
117
- Deplate::Core.log(["Doc variable has wrong type", key, var.class], :error)
118
- end
119
- else
120
- super
121
- end
122
- end
123
-
124
- def [](name)
125
- begin
126
- if keys.include?(name)
127
- return super
128
- elsif name =~ /^\S+\(.*\)$/
129
- m = /^(\S+)\((.*?)?\)$/.match(name)
130
- if m
131
- method = m[1]
132
- args = m[2]
133
- args, text = @deplate.input.parse_args(args, nil, false)
134
- return @deplate.invoke_service(method, args, text)
135
- else
136
- Deplate::Core.log(["Malformed variable name", name], :error)
137
- end
138
- elsif (m = /^(\S+)\[(\S+)\]$/.match(name))
139
- key = m[1]
140
- field = m[2]
141
- var = self[key]
142
- if var.kind_of?(Struct) || var.kind_of?(OpenStruct)
143
- return var.send(field)
144
- elsif var.kind_of?(Hash)
145
- return var[field]
146
- elsif var.kind_of?(Array)
147
- if field =~ /^[0-9]+$/
148
- field = field.to_i
149
- return var[field]
150
- else
151
- Deplate::Core.log(['Wrong index', field, name, var.class], :error)
152
- end
153
- elsif var
154
- # <+TBD+> this is unsave
155
- # return var.send(field)
156
- Deplate::Core.log(['Variable has wrong type', key, var.class], :error)
157
- else
158
- Deplate::Core.log(['Unknown variable', key], :error)
159
- end
160
- end
161
- rescue Exception => e
162
- Deplate::Core.log(['Retrieving doc variable failed', name, e], :error)
163
- end
164
- return nil
165
- end
166
- end
167
-
168
162
  module Deplate::Void
163
+ module_function
169
164
  end
170
165
 
171
166
  # Based on code by:
@@ -197,3 +192,70 @@ class << Deplate::Safe
197
192
  end
198
193
  end
199
194
 
195
+
196
+ class Deplate::Symbols < Deplate::CommonObject
197
+ class_attribute :myname
198
+
199
+ class << self
200
+ def hook_post_myname=(name)
201
+ klass = self
202
+ Deplate::Core.declare_symbols(name, klass)
203
+ end
204
+
205
+ def register_as(*names)
206
+ for n in names
207
+ hook_post_myname=(n)
208
+ end
209
+ end
210
+ end
211
+
212
+ def initialize(deplate)
213
+ @deplate = deplate
214
+ @formatter = @deplate.formatter
215
+ end
216
+
217
+ def symbol_quote(invoker)
218
+ '"'
219
+ end
220
+
221
+ def symbol_gt(invoker)
222
+ ">"
223
+ end
224
+
225
+ def symbol_lt(invoker)
226
+ "<"
227
+ end
228
+
229
+ def symbol_amp(invoker)
230
+ "&"
231
+ end
232
+
233
+ def doublequote_open(invoker)
234
+ %{"}
235
+ end
236
+
237
+ def doublequote_close(invoker)
238
+ %{"}
239
+ end
240
+
241
+ def singlequote_open(invoker)
242
+ %{'}
243
+ end
244
+
245
+ def singlequote_close(invoker)
246
+ %{'}
247
+ end
248
+
249
+ def nonbreakingspace(invoker)
250
+ %{ }
251
+ end
252
+
253
+ def symbol_paragraph(invoker)
254
+ %{§}
255
+ end
256
+
257
+ def format_symbol(invoker, sym)
258
+ return @formatter.plain_text(sym)
259
+ end
260
+ end
261
+
@@ -3,8 +3,8 @@
3
3
  # @Website: http://deplate.sf.net/
4
4
  # @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
5
5
  # @Created: 04-Sep-2004.
6
- # @Last Change: 28-Okt-2005.
7
- # @Revision: 0.168
6
+ # @Last Change: 08-Apr-2006.
7
+ # @Revision: 0.206
8
8
 
9
9
  require "ps2ppm"
10
10
 
@@ -26,12 +26,19 @@ module Deplate::External
26
26
  end
27
27
 
28
28
  def get_app(name, default=nil)
29
- @@apps[name] || default || name
29
+ app = @@apps[name]
30
+ unless app
31
+ app = default || name
32
+ if RUBY_PLATFORM =~ /mswin/ and app !~ /\.\w+$/
33
+ app += '.exe'
34
+ end
35
+ end
36
+ app
30
37
  end
31
38
 
32
39
  def log_popen(container, cmd)
33
40
  rv = []
34
- if container.deplate.options.allow_external
41
+ if container.deplate.allow_external
35
42
  container.log(["PWD", Dir.pwd])
36
43
  container.log(["Exec", cmd])
37
44
  begin
@@ -41,8 +48,8 @@ module Deplate::External
41
48
  else
42
49
  until io.eof
43
50
  l = io.gets
44
- rv << l
45
- puts l
51
+ rv << l.chomp
52
+ puts l unless Deplate::Core.quiet?
46
53
  end
47
54
  end
48
55
  end
@@ -60,7 +67,7 @@ module Deplate::External
60
67
  # directory, i.e., that the proper working directory was previously
61
68
  # set
62
69
  def write_file(container, filename, &block)
63
- if container.deplate.options.allow_external
70
+ if container.deplate.allow_external
64
71
  File.open(filename, "w") {|io| block.call(io)}
65
72
  end
66
73
  end
@@ -79,21 +86,45 @@ module Deplate::External
79
86
  end
80
87
 
81
88
  def ps2img(instance, device, psfile, outfile, args)
82
- r = args["rx"] || instance.deplate.variables["ps2imgRes"] || 96
83
- # r = args["rx"] || instance.deplate.variables["ps2imgRes"] || 120
89
+ # r = args["rx"] || instance.deplate.variables["ps2imgRes"] || 96
90
+ r = args["rx"] || instance.deplate.variables["ps2imgRes"] || 120
84
91
  # r = args["rx"] || 140
85
92
  # case device
86
93
  # when "pdf"
87
94
  # log_popen(instance, "#{get_app('ps2pdf'} #{psfile} #{outfile}")
88
95
  # else
89
96
  # log_popen(instance, "#{get_app('ps2ppm'} -o -r #{r} -g -t -f #{device} #{psfile}")
90
- # log_popen(instance, "#{get_app('convert'} -antialias -density #{r}x#{r} #{psfile} #{outfile}")
97
+ # log_popen(instance, "#{get_app('convert')} -antialias -density #{r}x#{r} #{psfile} #{outfile}")
91
98
  Ps2ppm.run(psfile, "o" => true, "r" => r, "g" => true, "t" => true, "f" => device)
92
99
  # end
93
100
  end
94
101
 
102
+ def jave(instance, imgfile, args)
103
+ variables = args[:deplate].variables
104
+ cmd = ["#{get_app('jave')} image2ascii #{imgfile}"]
105
+ alg = args['ascii_algorithm'] || args['algorithm'] ||
106
+ variables['ascii_algorithm'] || 'edge_detection'
107
+ cmd << "algorithm=#{alg}"
108
+ width = args['ascii_width'] || args['width'] || variables['ascii_width']
109
+ if width =~ /^(\d+)%$/
110
+ width = 80 * $1.to_i / 100
111
+ elsif width =~ /^(\d+)cm$/
112
+ width = $1.to_i / 2
113
+ elsif width =~ /^(\d+)mm$/
114
+ width = $1.to_i / 20
115
+ elsif width =~ /^(\d+)px$/ or width.to_i > 120
116
+ width = $1.to_i / 8
117
+ elsif width =~ /^(\d+)pt$/
118
+ width = $1.to_i / 8
119
+ elsif width !~ /^(\d+)$/
120
+ width = nil
121
+ end
122
+ cmd << "width=#{width}" if width
123
+ log_popen(instance, cmd.join(' '))
124
+ end
125
+
95
126
  def dot(instance, device, dotfile, outfile, command_line_args=[])
96
- c = command_line_args.join(" ")
127
+ c = command_line_args.join(' ')
97
128
  log_popen(instance, "#{get_app('dot')} -T#{device} -o#{outfile} #{c} #{dotfile}")
98
129
  end
99
130
 
File without changes
File without changes
File without changes
@@ -3,8 +3,8 @@
3
3
  # @Website: http://deplate.sf.net/
4
4
  # @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
5
5
  # @Created: 17-M�r-2004.
6
- # @Last Change: 23-Okt-2005.
7
- # @Revision: 0.2124
6
+ # @Last Change: 02-Apr-2006.
7
+ # @Revision: 0.2125
8
8
 
9
9
  require "deplate/docbook"
10
10
 
@@ -26,7 +26,7 @@ class Deplate::Formatter::DbkRef < Deplate::Formatter::Docbook
26
26
  out = @deplate.variables["refentry"]
27
27
  unless out
28
28
  out = @deplate.options.out
29
- out = File.basename(out, File.extname(out))
29
+ out = File.basename(out, '.*')
30
30
  @deplate.variables["refentry"] = out
31
31
  end
32
32
  o = []
File without changes
File without changes
File without changes
@@ -3,9 +3,10 @@
3
3
  # @Website: http://deplate.sf.net/
4
4
  # @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
5
5
  # @Created: 17-M�r-2004.
6
- # @Last Change: 02-Nov-2005.
7
- # @Revision: 0.3513
6
+ # @Last Change: 05-Jun-2006.
7
+ # @Revision: 0.4111
8
8
 
9
+ # require 'cgi'
9
10
  require 'uri'
10
11
  require 'parsedate'
11
12
  require 'time'
@@ -16,9 +17,9 @@ require 'deplate/formatter'
16
17
  # A sample html formatter.
17
18
 
18
19
  class Deplate::Formatter::HTML < Deplate::Formatter
19
- self.myname = "html"
20
+ self.myname = 'html'
20
21
  self.rx = /html?/i
21
- self.suffix = ".html"
22
+ self.suffix = '.html'
22
23
 
23
24
  self.label_delegate = [
24
25
  :format_heading,
@@ -37,7 +38,7 @@ class Deplate::Formatter::HTML < Deplate::Formatter
37
38
  :format_paragraph,
38
39
  :format_verbatim,
39
40
  ]
40
-
41
+
41
42
  attr_accessor :html_class
42
43
 
43
44
 
@@ -45,14 +46,16 @@ class Deplate::Formatter::HTML < Deplate::Formatter
45
46
  def initialize(deplate, args)
46
47
  super
47
48
  # Create OpenOffice compatible footnotes
48
- @footnote_template = "sdfootnote%dsym"
49
- @is_html_pageicons = false
49
+ @footnote_template = 'sdfootnote%dsym'
50
+ @html_navigation_note = nil
51
+ @is_html_pageicons = false
50
52
  @special_symbols = {
51
53
  %{"} => %{&quot;},
52
54
  %{>} => %{&gt;},
53
55
  %{<} => %{&lt;},
54
56
  %{&} => %{&amp;},
55
- %{ } => lambda {|escaped| escaped ? "&nbsp;" : " "},
57
+ # %{} => %{&euro;},
58
+ %{ } => lambda {|escaped| escaped ? '&nbsp;' : ' '},
56
59
  }
57
60
  build_plain_text_rx
58
61
  @encodings = {
@@ -63,29 +66,35 @@ class Deplate::Formatter::HTML < Deplate::Formatter
63
66
  def hook_post_write_file_html
64
67
  @deplate.options.css.each do |name, anyway|
65
68
  begin
66
- src = @deplate.collected_css[name]
67
- css = File.basename(src)
68
- dest = @deplate.auxiliary_filename(css, true)
69
- if anyway or !File.exist?(dest)
70
- File.copy(src, dest)
71
- log(["Copy css file", css])
69
+ src = @deplate.collected_css[name]
70
+ if src
71
+ css = File.basename(src)
72
+ dest = @deplate.auxiliary_filename(css, true)
73
+ if anyway or !File.exist?(dest)
74
+ @deplate.copy_file(src, dest)
75
+ end
76
+ else
77
+ srcc = @deplate.auxiliary_filename("#{name}.css", true)
78
+ unless File.exist?(srcc)
79
+ log(['File not found', srcc], :error)
80
+ end
72
81
  end
73
82
  rescue
74
- log(["Can't copy css file", css], :error)
83
+ log(["Can't copy css file", name], :error)
75
84
  end
76
85
  end
77
86
  end
78
87
 
79
88
  def hook_pre_body_flush_html
80
- url = @variables["baseUrl"]
89
+ url = @variables['baseUrl']
81
90
  if url
82
- fn = @deplate.output.top_heading.destination || @deplate.options.out
83
- if fn && fn != "-"
91
+ fn = output_destination
92
+ if fn && fn != '-'
84
93
  fn = Pathname.new(fn).expand_path
85
- unless fn.dirname.to_s == "."
94
+ unless fn.dirname.to_s == '.'
86
95
  pwd = Pathname.new(Dir.pwd).expand_path
87
- fn = fn.relative_path_from(pwd).to_s.gsub(/\\/, "/")
88
- fp = @variables["baseUrlStripDir"]
96
+ fn = fn.relative_path_from(pwd).to_s.gsub(/\\/, '/')
97
+ fp = @variables['baseUrlStripDir']
89
98
  if fp
90
99
  fn = fn.split(/\//)
91
100
  fn = fn[fp.to_i..-1]
@@ -118,19 +127,19 @@ class Deplate::Formatter::HTML < Deplate::Formatter
118
127
  def prepare
119
128
  html_head
120
129
 
121
- bodyOpts = @variables["bodyOptions"] || ""
130
+ bodyOpts = @variables['bodyOptions'] || ''
122
131
  output_at(:pre, :body_beg, %{<body #{bodyOpts}>\n<a name="#pagetop"></a>})
123
132
 
124
- output_at(:post, :body_end, "</body>")
125
- output_at(:post, :doc_end, "</html>")
133
+ output_at(:post, :body_end, '</body>')
134
+ output_at(:post, :doc_end, '</html>')
126
135
  end
127
136
 
128
137
  def html_head
129
138
  output_at(:pre, :doc_def, head_doctype)
130
139
  output_at(:pre, :doc_beg, html_def)
131
- output_at(:pre, :head_beg, "<head>")
140
+ output_at(:pre, :head_beg, '<head>')
132
141
 
133
- t = @variables["encoding"] || "ISO-8859-1"
142
+ t = @variables['encoding'] || 'ISO-8859-1'
134
143
  t = canonic_enc_name(t)
135
144
  t = %{http-equiv="content-type" content="text/html; charset=#{t}"}
136
145
  output_at(:pre, :head, head_meta_tag(t))
@@ -146,9 +155,9 @@ class Deplate::Formatter::HTML < Deplate::Formatter
146
155
  date = date.elt
147
156
  if date =~ /^\d\d(\d\d)$/
148
157
  date = Time.local(date)
149
- else
150
- if date =~ /^(\w+)\s+(\d\d(\d\d))$/
151
- date = "1-#$1-#$2"
158
+ elsif !date.empty?
159
+ if date =~ /^(\w+)(\s+|-|\.|\/)(\d\d(\d\d))$/
160
+ date = "1-#$1-#$3"
152
161
  end
153
162
  begin
154
163
  date = ParseDate.parsedate(date, true)
@@ -159,14 +168,18 @@ class Deplate::Formatter::HTML < Deplate::Formatter
159
168
  end
160
169
  end
161
170
  end
162
- date ||= Time.now
163
- # date = date.xmlschema
164
- date = xmlschema(date)
171
+ if date == ''
172
+ date = nil
173
+ else
174
+ date ||= Time.now
175
+ # date = date.xmlschema
176
+ date = xmlschema(date)
177
+ end
165
178
 
166
- title = @deplate.get_clip("title")
179
+ title = @deplate.get_clip('title')
167
180
  title = clean_tags(title.elt) if title
168
181
 
169
- if @variables["useDublinCore"]
182
+ if @variables['useDublinCore']
170
183
  output_at(:pre, :head_meta, head_meta_tag(%{name="DC.Title" content="%s"}) % title) if title
171
184
  output_at(:pre, :head_meta, head_meta_tag(%{name="DC.Creator" content="%s"}) % author) if author
172
185
  # DC.Subject
@@ -179,24 +192,24 @@ class Deplate::Formatter::HTML < Deplate::Formatter
179
192
  else
180
193
  output_at(:pre, :head_meta, head_meta_tag(%{name="author" content="%s"}) % author) if author
181
194
  output_at(:pre, :head_meta, head_meta_tag(%{name="description" content="%s"}) % desc) if desc
182
- output_at(:pre, :head_meta, head_meta_tag(%{name="keywords" content="%s"}) % kw.join(", ")) if kw
195
+ output_at(:pre, :head_meta, head_meta_tag(%{name="keywords" content="%s"}) % kw.join(', ')) if kw
183
196
  output_at(:pre, :head_meta, head_meta_tag(%{name="language" content="%s"}) % lang) if lang
184
197
  output_at(:pre, :head_meta, head_meta_tag(%{name="date" content="%s"}) % date) if date
185
198
  end
186
- output_at(:pre, :head_meta, head_meta_tag(%{name="generator" content="deplate.rb #{Deplate::Core.version}"})) unless @variables["noGenerator"]
187
- md = @variables["metaDataExtra"]
199
+ output_at(:pre, :head_meta, head_meta_tag(%{name="generator" content="deplate.rb #{Deplate::Core.version}"})) unless @variables['noGenerator']
200
+ md = @variables['metaDataExtra']
188
201
  output_at(:pre, :head_meta, md) if md
189
202
 
190
203
  output_at(:pre, :head_title, %{<title>%s</title>} % title) if title
191
204
 
192
- headExtra = @variables["headExtra"]
205
+ headExtra = @variables['headExtra']
193
206
  headExtra = headExtra.join("\n") if headExtra.kind_of?(Array)
194
207
  output_at(:pre, :head_extra, headExtra) if headExtra and !headExtra.empty?
195
208
 
196
209
  css = head_css
197
210
  output_at(:pre, :css, css) unless css.empty?
198
211
 
199
- styleExtra = @variables["styleExtra"]
212
+ styleExtra = @variables['styleExtra']
200
213
  if styleExtra
201
214
  styleExtra = styleExtra.join("\n") if styleExtra.kind_of?(Array)
202
215
  styleExtra = <<EOH
@@ -210,14 +223,20 @@ EOH
210
223
  end
211
224
 
212
225
  shortcutIcon = @variables["shortcutIcon"]
213
- output_at(:pre, :head_end, head_link_tag(%{rel="shortcut icon" href="#{shortcutIcon}" type="image/x-icon"})) if shortcutIcon
226
+ if shortcutIcon
227
+ shortcutIcon = escape_filename(shortcutIcon)
228
+ output_at(:pre, :head_end, head_link_tag(%{rel="shortcut icon" href="#{shortcutIcon}" type="image/x-icon"}))
229
+ end
214
230
  pageicon = @variables["pageIcon"]
215
- output_at(:pre, :head_end, head_link_tag(%{rel="icon" href="#{pageicon}" type="image/x-icon"})) if pageicon
231
+ if pageicon
232
+ pageicon = escape_filename(pageicon)
233
+ output_at(:pre, :head_end, head_link_tag(%{rel="icon" href="#{pageicon}" type="image/x-icon"}))
234
+ end
216
235
 
217
- output_at(:pre, :html_relations, @deplate.invoke_service("navigation_links")) unless @variables["noPageNavigation"]
236
+ output_at(:pre, :html_relations, invoke_service('navigation_links')) unless @variables['noPageNavigation']
218
237
 
219
- output_at(:pre, :head_end, @variables["explorerHack"])
220
- output_at(:pre, :head_end, "</head>")
238
+ output_at(:pre, :head_end, @variables['explorerHack'])
239
+ output_at(:pre, :head_end, '</head>')
221
240
  end
222
241
 
223
242
  def head_meta_tag(text)
@@ -230,11 +249,11 @@ EOH
230
249
 
231
250
  def xmlschema(time)
232
251
  z = time.zone.scan(/([+-])(\d+):(\d+)/)[0]
233
- z = z ? ("%s%02d:%02d" % z) : ""
252
+ z = z ? ('%s%02d:%02d' % z) : ''
234
253
  if time.hour != 0 or time.min != 0 or time.sec != 0
235
- time.strftime("%Y-%m-%dT%H:%M:%S" + z)
254
+ time.strftime('%Y-%m-%dT%H:%M:%S' + z)
236
255
  else
237
- time.strftime("%Y-%m-%d")
256
+ time.strftime('%Y-%m-%d')
238
257
  end
239
258
  end
240
259
  private :xmlschema
@@ -253,7 +272,7 @@ EOH
253
272
  id = use_id(args, opts)
254
273
  oid = opts['id']
255
274
  if oid and oid != id
256
- log(['ID mismatch', id, oid, opts, args], :error)
275
+ invoker.log(['ID mismatch', id, oid, opts, args], :error)
257
276
  end
258
277
  opts['id'] = encode_id(id) if id
259
278
  # args = args.dup
@@ -268,7 +287,7 @@ EOH
268
287
  case cls
269
288
  when Array
270
289
  unless opts['class'].empty?
271
- opts['class'] = opts['class'].join(' ')
290
+ opts['class'] = class_attr(opts['class'])
272
291
  end
273
292
  when nil
274
293
  opts['class'] = get_html_class(invoker)
@@ -279,23 +298,11 @@ EOH
279
298
  end
280
299
  end
281
300
  if single
282
- opts << "/"
301
+ opts << '/'
283
302
  end
284
- %{<%s>} % [tag, *opts].compact.join(" ")
303
+ %{<%s>} % [tag, *opts].compact.join(' ')
285
304
  end
286
305
 
287
- def consume_label(label, warn=false)
288
- if !label
289
- return false
290
- elsif @consumed_labels.include?(label)
291
- log(['Duplicate label'], label, :error) if warn
292
- return false
293
- else
294
- @consumed_labels << label
295
- return true
296
- end
297
- end
298
-
299
306
  def close_tag(invoker, tag)
300
307
  %{</%s>} % tag
301
308
  end
@@ -304,76 +311,145 @@ EOH
304
311
  [open_tag(invoker, tag, opts), text, close_tag(invoker, tag)].join
305
312
  end
306
313
 
314
+ def wrap_formatted_particle_styles(invoker, value, args)
315
+ s = args[:styles]
316
+ unless !s or s.empty?
317
+ value.sub!(/\A(\s*)(.*?)(\s*)\Z/m) do |m|
318
+ %{#$1<span class="#{class_attr(s)}">#$2</span>#$3}
319
+ end
320
+ end
321
+ value
322
+ end
323
+
324
+ def wrap_formatted_element_styles(invoker, value, args)
325
+ s = args[:styles]
326
+ unless !s or s.empty?
327
+ value.sub!(/\A(\s*)(.*?)(\s*)\Z/m) do |m|
328
+ <<EOT
329
+ #$1<div class="#{class_attr(s)}">
330
+ #$2
331
+ </div>#$3
332
+ EOT
333
+ end
334
+ end
335
+ value
336
+ end
337
+
338
+ def wrap_formatted_element_zz_stepwise(invoker, value, args)
339
+ if @variables['stepwiseDisplay']
340
+ @deplate.output.attributes[:stepwiseIdx] ||= 0
341
+ idx = @deplate.output.attributes[:stepwiseIdx] += 1
342
+ beg = (@variables['stepwiseBegin'] || '1').to_i
343
+ vis = idx > beg ? 'hidden' : 'visible'
344
+ value.sub!(/\A(\s*)(.*?)(\s*)\Z/m) do |m|
345
+ <<EOT
346
+ #$1<div id="Step#{idx}" style="visibility:#{vis};">
347
+ #$2
348
+ #$1</div>#$3
349
+ EOT
350
+ end
351
+ end
352
+ value
353
+ end
354
+
307
355
  def wrap_text(text, args={})
308
356
  args[:check] ||= lambda do |line|
309
357
  line =~ /<[^>]*$/
310
358
  end
311
359
  super(text, args)
312
360
  end
313
-
361
+
362
+ def class_attr(classes)
363
+ classes.flatten.compact.uniq.join(' ')
364
+ end
365
+
314
366
 
315
367
  ################################################ Lists {{{1
316
- def format_list_item(invoker, type, level, item, html_class=nil, explicit=false)
368
+ def format_list_item(invoker, type, level, item, args={})
317
369
  indent = format_indent(level, true)
318
370
  body = item.body
319
- body = wrap_text(body) if body
320
- opts = {"class" => []}
321
- html_class ||= item.style || get_html_class(invoker)
371
+ opts = {'class' => []}
372
+ html_class ||= get_html_class(invoker, :add => item.style, :set => false)
322
373
  if html_class
323
- opts["class"] << html_class
374
+ opts['class'] << html_class
324
375
  end
325
376
  case type
326
- when "Numbered", "Itemize"
377
+ when 'Ordered', 'Itemize'
378
+ explicit = args[:explicit]
327
379
  ev = list_item_explicit_value(item, explicit)
328
380
  if ev
329
- opts["value"] = ev
381
+ ev = ev.sub(/\.\s*$/, '')
382
+ if ev =~ /^([[:lower:]])$/
383
+ ev = $1[0] - 96
384
+ elsif ev =~ /^([[:upper:]])$/
385
+ ev = $1[0] - 64
386
+ end
387
+ opts['value'] = ev.to_s
330
388
  else
331
389
  case item.item
332
- when "-"
333
- opts["class"] << "dash"
334
- when "+"
335
- opts["class"] << "plus"
336
- when "*"
337
- opts["class"] << "asterisk"
338
- when ""
339
- opts["class"] << "bullet"
390
+ when '-'
391
+ opts['class'] << 'dash'
392
+ when '+'
393
+ opts['class'] << 'plus'
394
+ when '*'
395
+ opts['class'] << 'asterisk'
396
+ when ''
397
+ opts['class'] << 'bullet'
340
398
  end
341
399
  end
342
- li = open_tag(invoker, "li", opts)
400
+ li = open_tag(invoker, 'li', opts)
343
401
  # indent1 = format_indent(level + 1, true)
344
402
  # return %{#{indent}#{li}\n#{indent1}#{body}}, %{#{indent}</li>}
345
- body = indent_text(body, level + 1)
403
+ body = indent_text(wrap_text(body), :mult => level + 1)
346
404
  return %{#{indent}#{li}\n#{body}}, %{#{indent}</li>}
347
- when "Description"
348
- dt = open_tag(invoker, "dt", opts)
349
- dd = open_tag(invoker, "dd", opts)
405
+ when 'Description'
406
+ dt = open_tag(invoker, 'dt', opts)
407
+ dd = open_tag(invoker, 'dd', opts)
350
408
  accum = []
351
409
  accum << "#{dt}#{item.item}</dt>\n" if item.item
352
410
  accum << "#{dd}\n"
353
- accum << indent_text(body, 1) if body
354
- return indent_text(accum.join, level), "#{indent}</dd>"
355
- when "Paragraph"
356
- return indent_text(%{<br class="itempara" />#{body}}, 2), nil
411
+ accum << indent_text(wrap_text(body), :mult => 1) if body
412
+ return indent_text(accum.join, :mult => level), "#{indent}</dd>"
413
+ when 'Task'
414
+ pri = item.opts[:priority]
415
+ cat = item.opts[:category]
416
+ done = item.opts[:done] ? 'done' : nil
417
+ due = item.opts[:due]
418
+ opts = {}
419
+ cls = cat ? [html_class, cat].join('-') : html_class
420
+ opts['class'] = class_attr([cls, done])
421
+ li = open_tag(invoker, 'li', opts)
422
+ task = [cat, pri].compact.join
423
+ task += " #{due}" if due
424
+ body = [%{<span class="#{cls}">#{task}</span>}, body].join(' ')
425
+ body = indent_text(wrap_text(body), :mult => level + 1)
426
+ return %{#{indent}#{li}\n#{body}}, %{#{indent}</li>}
427
+ when 'Paragraph'
428
+ body = wrap_text(body)
429
+ body = %{<br class="itempara" />#{body}} unless args[:follow_container]
430
+ return indent_text(body, :mult => 2), nil
431
+ when 'Container'
432
+ return body, nil
357
433
  else
358
- raise "Unknown list type: #{item.inspect}"
434
+ invoker.log(['Unknown list type', type], :error)
359
435
  end
360
436
  end
361
437
 
362
438
  def format_list_env(invoker, type, level, what, subtype=nil)
363
439
  indent = format_indent(level)
364
440
  opts = {'class' => []}
365
- html_class ||= get_html_class(invoker)
441
+ html_class ||= get_html_class(invoker, :add => type, :set => false)
366
442
  if html_class
367
- opts["class"] << html_class
443
+ opts['class'] << html_class
368
444
  end
369
445
  case type
370
- when "Numbered"
446
+ when 'Ordered'
371
447
  case subtype
372
- when "a"
373
- opts["type"] = "a"
448
+ when 'a'
449
+ opts['type'] = 'a'
374
450
  opts['class'] << 'alpha'
375
- when "A"
376
- opts["type"] = "A"
451
+ when 'A'
452
+ opts['type'] = 'A'
377
453
  opts['class'] << 'Alpha'
378
454
  # when "1"
379
455
  # type = %{}
@@ -381,13 +457,16 @@ EOH
381
457
  opts['class'] << 'numeric'
382
458
  # type = %{}
383
459
  end
384
- tag = "ol"
385
- when "Itemize"
386
- tag = "ul"
387
- when "Description"
388
- tag = "dl"
460
+ tag = 'ol'
461
+ when 'Itemize'
462
+ tag = 'ul'
463
+ when 'Task'
464
+ tag = 'ul'
465
+ opts['class'] << 'Task'
466
+ when 'Description'
467
+ tag = 'dl'
389
468
  else
390
- raise "Unknown list type: #{type}"
469
+ invoker.log(['Unknown list type', type], :error)
391
470
  end
392
471
 
393
472
  case what
@@ -408,24 +487,35 @@ EOH
408
487
  end
409
488
  end
410
489
 
411
- def get_html_class(invoker, default=nil)
412
- html_class = [
413
- invoker.args["htmlClass"],
414
- invoker.styles_as_string,
415
- ]
416
- html_class.compact!
490
+ def get_html_class(invoker, args={})
417
491
  if invoker.respond_to?(:html_class)
418
- hc = invoker.html_class
419
- if invoker.respond_to?(:html_class=) and (!hc or hc.empty?)
420
- invoker.html_class = default
421
- html_class << default
422
- end
492
+ html_class = invoker.html_class
493
+ else
494
+ html_class = nil
495
+ end
496
+ unless html_class
497
+ default = args[:default]
498
+ html_class = [
499
+ invoker.args[:htmlClass],
500
+ invoker.args['htmlClass'],
501
+ invoker.styles_as_string,
502
+ args[:style],
503
+ args[:html_class],
504
+ (args[:add] || []),
505
+ ]
506
+ html_class.flatten!
507
+ html_class.compact!
423
508
  if html_class.empty?
424
- html_class << invoker.html_class
509
+ html_class = default
510
+ else
511
+ html_class.uniq!
512
+ html_class = class_attr(html_class)
513
+ end
514
+ if invoker.respond_to?(:html_class=) and args[:set] != false
515
+ invoker.html_class = html_class
425
516
  end
426
517
  end
427
- html_class.compact!
428
- return html_class.empty? ? nil : html_class.join(" ")
518
+ return html_class
429
519
  end
430
520
 
431
521
  def format_label(invoker, mode=nil, label=nil, with_id=true)
@@ -442,7 +532,7 @@ EOH
442
532
  when :after
443
533
  for l in label
444
534
  if @open_labels.delete(l)
445
- accum << "</a>"
535
+ accum << '</a>'
446
536
  end
447
537
  end
448
538
  when :closeOpen
@@ -453,7 +543,7 @@ EOH
453
543
  # when :once
454
544
  else
455
545
  for l in label
456
- text = if block_given? then yield(l) else "" end
546
+ text = if block_given? then yield(l) else '' end
457
547
  accum << %{<a name="#{l}"></a>#{text}}
458
548
  end
459
549
  end
@@ -464,10 +554,10 @@ EOH
464
554
  def format_figure(invoker, inline=false, elt=nil)
465
555
  elt ||= invoker.elt
466
556
  if inline
467
- include_image(elt, invoker.args)
557
+ include_image(invoker, elt, invoker.args)
468
558
  else
469
559
  acc = []
470
- fig = @deplate.msg("Figure")
560
+ fig = @deplate.msg('Figure')
471
561
  caption = invoker.caption
472
562
  if caption
473
563
  capAbove = !(caption && caption.args && caption.args.include?("below"))
@@ -483,7 +573,7 @@ EOH
483
573
  if caption and capAbove
484
574
  acc << cap
485
575
  end
486
- acc << include_image(elt, invoker.args)
576
+ acc << include_image(invoker, elt, invoker.args)
487
577
  if caption and !capAbove
488
578
  acc << cap
489
579
  end
@@ -492,60 +582,119 @@ EOH
492
582
  end
493
583
  end
494
584
 
495
- def include_image(file, args, inline=false)
496
- o = []
497
- w = args["w"] || args["width"]
498
- o << %{width="#{w}"} if w
499
- h = args["h"] || args["heigth"]
500
- o << %{height="#{h}"} if h
501
- o = o.join(" ")
502
- f = file[0..-(File.extname(file).size + 1)]
503
- alt = args["alt"]
585
+ def include_image(invoker, file, args, inline=false)
586
+ acc = []
587
+
588
+ file = args['file'] if args['file']
589
+ file = img_url(use_image_filename(file, args))
590
+ acc << %{src="#{file}"}
591
+
592
+ w = args['w'] || args['width']
593
+ acc << %{width="#{w}"} if w
594
+ h = args['h'] || args['heigth']
595
+ acc << %{height="#{h}"} if h
596
+
597
+ # b = args['border'] || '0'
598
+ # acc << %{border="#{b}"}
599
+
600
+ # f = file[0..-(File.extname(file).size + 1)]
601
+ alt = args['alt']
504
602
  if alt
505
603
  alt.gsub!(/[\\"&<>]/) do |s|
506
604
  case s
507
605
  when '\\'
508
- '\\\\'
606
+ ''
509
607
  else
510
- plain_text(s)
608
+ plain_text(s).gsub(/\\([0-9&`'+])/, '\\1')
511
609
  end
512
610
  end
513
611
  else
514
612
  alt = File.basename(file, '.*')
515
613
  end
516
- style = [args["style"]]
517
- style << "inline" if inline
518
- style = style.compact.join(", ")
519
- for sfx in image_suffixes
520
- fs = f + sfx
521
- ff = @deplate.auxiliary_filename(fs)
522
- fff = @deplate.auxiliary_filename(fs, true)
523
- if File.exist?(fff)
524
- return %{<img src="#{ff}" #{o} alt="#{alt}" class="#{style}" />}
614
+ acc << %{alt="#{alt}"}
615
+
616
+ style = args['style']
617
+ if style
618
+ style = style.split(/[ ,]/)
619
+ else
620
+ style = []
621
+ end
622
+ style << (inline ? 'inline' : 'figure')
623
+ acc << %{class="#{class_attr(style)}"}
624
+
625
+ img_id = args['id']
626
+ unless img_id
627
+ fbase = Deplate::Core.clean_file_name(File.basename(fbase || 'imgid'))
628
+ img_id = @deplate.auto_numbered(fbase, :inc => 1, :fmt => %{#{fbase}_%s})
629
+ end
630
+ acc << %{id="#{img_id}" name="#{img_id}"}
631
+
632
+ hi = args['hi']
633
+ if hi
634
+ case hi
635
+ when String
636
+ hi_img = img_url(use_image_filename(hi, args))
637
+ else
638
+ hi_img = [File.dirname(file), %{hi-#{File.basename(file)}}]
639
+ hi_img = File.join(hi_img.compact)
525
640
  end
641
+
642
+ setup_highlight_image
643
+ acc << %{onMouseover="HighlightImage('%s', '%s')" onMouseout="HighlightImage('%s', '%s')"} % [
644
+ img_id, img_url(hi_img, args),
645
+ img_id, file
646
+ ]
526
647
  end
527
- return %{<img src="#{file}" alt="#{alt}" class="#{style}" />}
648
+
649
+ return %{<img #{acc.join(' ')}/>}
528
650
  end
529
651
 
652
+ def setup_highlight_image
653
+ unless @deplate.options.highlight_image
654
+ output_at(:pre, :javascript, <<EOJS
655
+ <script type="text/javascript">
656
+ <!--
657
+ function HighlightImage(Name, Src) {
658
+ if (document.images) {
659
+ document.images[Name].src = Src
660
+ }
661
+ }
662
+ //-->
663
+ </script>
664
+ EOJS
665
+ )
666
+ @deplate.options.highlight_image = true
667
+ end
668
+ end
669
+
670
+ def img_url(file, args={})
671
+ if args[:raw]
672
+ file
673
+ else
674
+ fmt = @deplate.variables['htmlImgUrl'] || @deplate.variables['htmlAuxUrl']
675
+ fmt ? fmt % file : file
676
+ end
677
+ end
678
+
530
679
  def image_suffixes
531
- [".png", ".jpeg", ".jpg", ".gif", ".bmp"]
680
+ ['.png', '.jpeg', '.jpg', '.gif', '.bmp', '.wmf']
532
681
  end
533
682
 
534
683
  ################################################ Elements {{{1
535
684
  def format_note(invoker)
536
685
  marker = invoker.marker
537
686
  case marker
538
- when "#"
539
- html_class = "note"
540
- when "+"
541
- html_class = "warning"
542
- when "?"
543
- html_class = "caution"
544
- when "!"
545
- html_class = "important"
687
+ when '#'
688
+ html_class = 'note'
689
+ when '+'
690
+ html_class = 'warning'
691
+ when '?'
692
+ html_class = 'caution'
693
+ when '!'
694
+ html_class = 'important'
546
695
  else
547
- log(["Unknown marker", marker], :error)
548
- html_class = "note"
696
+ invoker.log(['Unknown marker', marker], :error)
697
+ html_class = 'note'
549
698
  end
550
699
  cls = %{ class="%s"} % html_class
551
700
  join_blocks(["<div#{cls}><p#{cls}>", invoker.elt, "</p></div>\n"])
@@ -556,19 +705,18 @@ EOH
556
705
  elt = invoker.elt
557
706
  caption = invoker.caption
558
707
  level_as_string = invoker.level_as_string
559
- style = invoker.styles_as_string || @variables["tableStyle"]
560
- style.gsub!(/[,;]+/, " ") if style
561
- html_class = style || get_html_class(invoker)
562
- capAbove = !(caption && caption.args && caption.args.include?("below"))
563
- clss = html_class ? html_class : "standard"
708
+ capAbove = !(caption && caption.args && caption.args.include?('below'))
709
+ style = invoker.styles_as_string || @variables['tableStyle']
710
+ style.gsub!(/[,;]+/, ' ') if style
711
+ clss = style || get_html_class(invoker, :default => 'standard')
564
712
  clsss = %{ class="#{clss}"}
565
713
  opts = format_particle(:table_args, invoker)
566
- halfindent = " "
714
+ halfindent = ' '
567
715
  indent = halfindent * 2
568
716
 
569
717
  acc = []
570
718
  unless args[:dontWrapTable]
571
- acc << %{<div class="#{['table', style].compact.join(' ')}">}
719
+ acc << %{<div class="#{class_attr(['table', style])}">}
572
720
  end
573
721
  acc << %{<table#{clsss}#{opts}>}
574
722
  if caption
@@ -580,7 +728,7 @@ EOH
580
728
  end
581
729
  # capOpts << %{style="text-align=#{float_align_caption(invoker)};"}
582
730
  cap = %{#{@deplate.msg("Table")} #{level_as_string}: #{caption.elt}}
583
- acc << %{<caption#{capOpts.join(" ")}>#{cap}</caption>}
731
+ acc << %{<caption#{capOpts.join(' ')}>#{cap}</caption>}
584
732
  end
585
733
 
586
734
  acc_head = []
@@ -588,17 +736,17 @@ EOH
588
736
  acc_body = []
589
737
  elt.each_with_index do |r, n|
590
738
  if r.head
591
- row = formatted_table_row(n, r, args, indent, clss, "th")
739
+ row = formatted_table_row(n, r, args, indent, clss, 'th')
592
740
  if row
593
741
  table_add_row(acc_head, row, %{head #{style}}, :indent => halfindent)
594
742
  end
595
743
  elsif r.foot
596
- row = formatted_table_row(n, r, args, indent, clss, "td")
744
+ row = formatted_table_row(n, r, args, indent, clss, 'td')
597
745
  if row
598
746
  table_add_row(acc_foot, row, %{foot #{style}}, :indent => halfindent)
599
747
  end
600
748
  elsif r.high
601
- row = formatted_table_row(n, r, args, indent, clss, "td")
749
+ row = formatted_table_row(n, r, args, indent, clss, 'td')
602
750
  table_add_row(acc_body, row, %{high #{style}}, :indent => halfindent) if row
603
751
  elsif r.is_ruler
604
752
  else
@@ -619,8 +767,8 @@ EOH
619
767
  end
620
768
  acc << acc_body
621
769
 
622
- acc << "</table>"
623
- note = invoker.args["note"]
770
+ acc << '</table>'
771
+ note = invoker.args['note']
624
772
  if note
625
773
  note = @deplate.parse_and_format(invoker, note)
626
774
  nopts = ['', %{class="tableNote"}]
@@ -629,14 +777,18 @@ EOH
629
777
  acc << %{<div#{nopts.join(' ')}>#{note}</div>}
630
778
  end
631
779
  acc << "</div>\n" unless args[:dontWrapTable]
632
- acc << ""
780
+ acc << ''
633
781
 
634
782
  join_blocks(acc)
635
783
  end
636
784
 
785
+ # def table_empty_cell
786
+ # '{ins: &nbsp}'
787
+ # end
788
+
637
789
  def table_add_row(acc, row, clss, args)
638
- tag = args[:tag] || "tr"
639
- indent = args[:indent] || " "
790
+ tag = args[:tag] || 'tr'
791
+ indent = args[:indent] || ' '
640
792
  dblindent = indent * 2
641
793
  row = row.join("\n#{dblindent}")
642
794
  acc << %{#{indent}<#{tag} class="#{clss}">}
@@ -644,11 +796,11 @@ EOH
644
796
  acc << "#{indent}</#{tag}>"
645
797
  end
646
798
 
647
- def format_heading(invoker)
648
- l = format_label(invoker, nil, nil, false)
649
- level = invoker.level
799
+ def format_heading(invoker, level=nil, elt=nil)
650
800
  args = invoker.args
651
- elt = invoker.elt
801
+ level ||= invoker.level
802
+ elt ||= invoker.elt
803
+ l = format_label(invoker, nil, nil, false)
652
804
  html_args = invoker.html_args || ''
653
805
  id = invoker.get_id
654
806
  if consume_label(id)
@@ -657,9 +809,10 @@ EOH
657
809
  if level > 0 and level <= 6
658
810
  hd = "h#{level}"
659
811
  if invoker.plain_caption?
660
- ls = ""
812
+ ls = ''
661
813
  else
662
- ls = invoker.level_as_string + "&nbsp;"
814
+ ls = invoker.level_as_string
815
+ ls += '&nbsp;' if ls
663
816
  end
664
817
  %{\n<#{hd}#{html_args}>#{l}#{ls}#{elt}</#{hd}>\n}
665
818
  else
@@ -673,7 +826,7 @@ EOH
673
826
  end
674
827
 
675
828
  def format_break(invoker)
676
- format_pagebreak(invoker, "break")
829
+ format_pagebreak(invoker, 'break')
677
830
  end
678
831
 
679
832
  def format_anchor(invoker)
@@ -692,28 +845,34 @@ EOH
692
845
  ################################################ Regions {{{1
693
846
  def format_verbatim(invoker, text=nil)
694
847
  text ||= invoker.elt
695
- format_environment(invoker, "pre", {"class"=>"verbatim"}, plain_text(text, :pre))
848
+ format_environment(invoker, 'pre', {'class'=>'verbatim'}, plain_text(text, :pre))
696
849
  end
697
850
 
698
851
  def format_abstract(invoker)
699
- format_environment(invoker, %{blockquote}, {"class"=>"abstract"}, invoker.elt)
852
+ format_environment(invoker, %{blockquote}, {'class'=>'abstract'}, invoker.elt)
700
853
  end
701
854
 
702
855
  def format_quote(invoker)
703
- if invoker.args["long"]
704
- format_environment(invoker, %{blockquote}, {"class"=>"quote"}, invoker.elt)
705
- else
706
- format_environment(invoker, %{blockquote}, {"class"=>"longquote"}, invoker.elt)
856
+ elt = invoker.elt.strip
857
+ rv = [if invoker.args['long']
858
+ format_environment(invoker, %{blockquote}, {'class'=>'longquote'}, elt)
859
+ else
860
+ format_environment(invoker, %{blockquote}, {'class'=>'quote'}, elt)
861
+ end]
862
+ if (src = invoker.args['source'])
863
+ rv << format_environment(invoker, %{div}, {'class' => 'source'},
864
+ plain_text(src))
707
865
  end
866
+ join_blocks(rv)
708
867
  end
709
868
 
710
869
  def format_header(invoker)
711
- format_header_or_footer(invoker, :pre, :header, "HEADER", "header")
870
+ format_header_or_footer(invoker, :pre, :header, 'HEADER', 'header')
712
871
  nil
713
872
  end
714
873
 
715
874
  def format_footer(invoker)
716
- format_header_or_footer(invoker, :post, :footer, "FOOTER", "footer")
875
+ format_header_or_footer(invoker, :post, :footer, 'FOOTER', 'footer')
717
876
  nil
718
877
  end
719
878
 
@@ -730,7 +889,7 @@ EOH
730
889
  acc << c % ii.elt if ii
731
890
  end
732
891
  acc << %{</div>}
733
- acc << format_pagebreak(invoker, "title") if invoker.args["page"]
892
+ acc << format_pagebreak(invoker, 'title') if invoker.args['page']
734
893
  join_blocks(acc)
735
894
  end
736
895
 
@@ -761,28 +920,33 @@ EOH
761
920
 
762
921
 
763
922
  ################################################ Particles {{{1
764
- def format_emphasize(invoker, text)
765
- inline_tag(invoker, "em", text)
923
+ def format_emphasize(invoker, text=nil)
924
+ text ||= invoker.elt || invoker.text
925
+ inline_tag(invoker, 'em', text)
766
926
  end
767
927
 
768
- def format_code(invoker, text)
769
- inline_tag(invoker, "code", plain_text(text, :code))
928
+ def format_code(invoker, text=nil)
929
+ text ||= invoker.elt || invoker.text
930
+ inline_tag(invoker, 'code', plain_text(text, :code))
770
931
  end
771
932
 
772
933
  def format_url(invoker, name, dest, anchor, literal=false)
773
934
  dest = Deplate::HyperLink.url_anchor(dest, anchor)
774
- dest.gsub!(/&/, "&amp;")
775
- inline_tag(invoker, "a", name, href_args(invoker, dest))
935
+ dest.gsub!(/&/, '&amp;')
936
+ if name =~ /^mailto:(.*)$/
937
+ name = $1
938
+ end
939
+ inline_tag(invoker, 'a', name, href_args(invoker, dest))
776
940
  end
777
941
 
778
942
  def format_wiki(invoker, name, dest, anchor)
779
943
  dest = Deplate::HyperLink.url_anchor(dest, anchor)
780
944
  # dest.gsub!(/&/, "&amp;")
781
- inline_tag(invoker, "a", name, href_args(invoker, dest))
945
+ inline_tag(invoker, 'a', name, href_args(invoker, dest))
782
946
  end
783
947
 
784
948
  def href_args(invoker, dest)
785
- args = {"href" => dest}
949
+ args = {'href' => dest}
786
950
  target = invoker.args['target']
787
951
  if target
788
952
  args['target'] = target
@@ -793,29 +957,29 @@ EOH
793
957
 
794
958
  def format_symbol(invoker, text)
795
959
  case text
796
- when "<-"
797
- return "&larr;"
798
- when "->"
799
- return "&rarr;"
800
- when "<=", "<<<"
801
- return "&lArr;"
802
- when "=>", ">>>"
803
- return "&rArr;"
804
- when "<->"
805
- return "&harr;"
806
- when "<=>"
807
- return "&hArr;"
808
- when "!="
809
- return "&ne;"
810
- when "~~"
811
- return "&asymp;"
812
- when "..."
813
- return "&hellip;"
814
- when "--"
815
- return "&ndash;"
816
- when "=="
817
- return "&equiv;"
818
- when "+++", "###", "???", "!!!"
960
+ when '<-'
961
+ return '&larr;'
962
+ when '->'
963
+ return '&rarr;'
964
+ when '<=', '<<<'
965
+ return '&lArr;'
966
+ when '=>', '>>>'
967
+ return '&rArr;'
968
+ when '<->'
969
+ return '&harr;'
970
+ when '<=>'
971
+ return '&hArr;'
972
+ when '!='
973
+ return '&ne;'
974
+ when '~~'
975
+ return '&asymp;'
976
+ when '...'
977
+ return '&hellip;'
978
+ when '--'
979
+ return '&ndash;'
980
+ when '=='
981
+ return '&equiv;'
982
+ when '+++', '###', '???', '!!!'
819
983
  m = plain_text(text)
820
984
  return %{<span class="marker"><em class="marker">#{m}</em></span>}
821
985
  # when "<~"
@@ -830,19 +994,19 @@ EOH
830
994
  end
831
995
 
832
996
  def doublequote_open(invoker)
833
- "&ldquo;"
997
+ '&ldquo;'
834
998
  end
835
999
 
836
1000
  def doublequote_close(invoker)
837
- "&rdquo;"
1001
+ '&rdquo;'
838
1002
  end
839
1003
 
840
1004
  def singlequote_open(invoker)
841
- "&lsquo;"
1005
+ '&lsquo;'
842
1006
  end
843
1007
 
844
1008
  def singlequote_close(invoker)
845
- "&rsquo;"
1009
+ '&rsquo;'
846
1010
  end
847
1011
 
848
1012
 
@@ -851,45 +1015,53 @@ EOH
851
1015
  if idx
852
1016
  return format_label(invoker, :string, [idx.label])
853
1017
  else
854
- return ""
1018
+ return ''
855
1019
  end
856
1020
  end
857
1021
 
858
1022
  def format_footnote(invoker)
859
1023
  elt = invoker.elt
860
- if elt and elt.elt and elt.elt.consumed
861
- fn = elt.elt
862
- lab = fn.label
1024
+ if elt and elt.elt and elt.fn_consumed
1025
+ lab = elt.fn_label
863
1026
  if !@deplate.footnotes_used.include?(lab)
864
1027
  idx = @deplate.footnote_last_idx +=1
865
- hclass = "sdfootnoteanc"
866
- id = "sdfootnote%d" % idx
867
- name = "sdfootnote%danc" % idx
1028
+ hclass = 'sdfootnoteanc'
1029
+ id = 'sdfootnote%d' % idx
1030
+ name = 'sdfootnote%danc' % idx
868
1031
  href = @footnote_template % idx
869
1032
  lab = [href]
870
- fn.n = idx
871
- fn.label = lab
1033
+ elt.fn_n = idx
1034
+ elt.fn_label = lab
872
1035
  @deplate.footnotes_used << lab
873
1036
  invoker.container.postponed_format << Proc.new do |container|
874
1037
  consume_label(id, true)
875
- t = [%{<div id="#{id}">},
876
- %{<p class="sdfootnote">},
877
- %{<a class="sdfootnotesym" name="#{href}" href="##{name}">#{idx}</a>},
878
- %{#{fn.body}},
879
- %{</p></div>}]
1038
+ t = [
1039
+ %{<div id="#{id}">},
1040
+ ]
1041
+ l = %{<a class="sdfootnotesym" name="#{href}" href="##{name}">#{idx}</a>}
1042
+ e = elt.elt[0]
1043
+ case e
1044
+ when Deplate::Element::Paragraph
1045
+ e.elt.insert(0, l)
1046
+ else
1047
+ t << l
1048
+ end
1049
+ elt.push_styles('sdfootnote')
1050
+ t << elt.format_current
1051
+ t << %{</div>}
880
1052
  output_at(:body, :footnotes, t.join("\n"))
881
1053
  end
882
1054
  else
883
- href = @footnote_template % fn.n
1055
+ href = @footnote_template % elt.fn_n
884
1056
  end
885
- return %{<a class="sdfootnoteanc" name="#{name}" href="##{href}">#{fn.n}</a>}
1057
+ return %{<a class="sdfootnoteanc" name="#{name}" href="##{href}">#{elt.fn_n}</a>}
886
1058
  else
887
- return ""
1059
+ return ''
888
1060
  end
889
1061
  end
890
1062
 
891
1063
  def format_ref(invoker)
892
- text = invoker.text || ""
1064
+ text = invoker.text || ''
893
1065
  f = @deplate.get_filename_for_label(invoker, text)
894
1066
  if f
895
1067
  # if invoker.args['obj'] and (o = @deplate.label_aliases[text])
@@ -902,74 +1074,31 @@ EOH
902
1074
  if l
903
1075
  t = plain_text(l)
904
1076
  else
905
- t = @variables["refButton"] || "[&rArr;]"
1077
+ t = @variables['refButton'] || '[&rArr;]'
906
1078
  end
907
- return %{&nbsp;<a href="#{URI.escape(f)}##{URI.escape(text)}" class="ref">#{t}</a>}
1079
+ prefix = invoker.args['prefix'] || '&nbsp;'
1080
+ return %{#{prefix}<a href="#{URI.escape(f)}##{URI.escape(text)}" class="ref">#{t}</a>}
1081
+ else
1082
+ return text.empty? ? '??' : text
908
1083
  end
909
1084
  end
910
1085
 
911
1086
  def format_linebreak(invoker)
912
- open_tag(invoker, "br", nil, :single => true)
913
- end
914
-
915
- # def format_cite(invoker)
916
- # container = invoker.container
917
- # args = invoker.args
918
- # n = args["n"]
919
- # p = args["p"]
920
- # np = args["np"]
921
- # y = args["y"]
922
- # acc = []
923
- # pmsg = @deplate.msg("p.\\ ")
924
- # for c in invoker.elt
925
- # cc = bib_entry(c)
926
- # if cc
927
- # yr = cc.assoc("year")
928
- # yr = if yr then yr[1] else "" end
929
- # if p
930
- # p = @deplate.parse_and_format(container, "#{pmsg}#{p}")
931
- # yr += ": #{p}"
932
- # # yr += ": " + p if p
933
- # end
934
- # if y
935
- # acc << referenced_bib_entry(invoker, c, yr)
936
- # else
937
- # nm = cc.assoc("author") || cc.assoc("editor")
938
- # if nm
939
- # nm = nm[1]
940
- # nm = nm.gsub(/\s+/, " ").split(" and ").collect do |a|
941
- # a.scan(/\w+$/)
942
- # end
943
- # nm = nm.join(", ")
944
- # acc << referenced_bib_entry(invoker, c, [nm, yr].join(" "))
945
- # else
946
- # acc << referenced_bib_entry(invoker, c, c)
947
- # end
948
- # end
949
- # end
950
- # end
951
- # n &&= n + " "
952
- # acc = acc.join("; ")
953
- # if np
954
- # return %{#{n}#{acc}}
955
- # else
956
- # return %{&nbsp;(#{n}#{acc})}
957
- # end
958
- # end
1087
+ open_tag(invoker, 'br', nil, :single => true)
1088
+ end
959
1089
 
960
1090
  def referenced_bib_entry(invoker, key, text)
961
1091
  hd = @deplate.options.html_makebib_heading
962
- f = hd ? hd.top_heading.output_file_name(:relative => invoker.container) : ""
1092
+ f = hd ? hd.top_heading.output_file_name(:relative => invoker.container) : ''
963
1093
  %{<a href="#{f}##{encode_id(key)}">#{text}</a>}
964
1094
  end
965
- private :referenced_bib_entry
966
1095
 
967
1096
  def format_subscript(invoker)
968
- inline_tag(invoker, "sub", invoker.elt)
1097
+ inline_tag(invoker, 'sub', invoker.elt)
969
1098
  end
970
1099
 
971
1100
  def format_superscript(invoker)
972
- inline_tag(invoker, "sup", invoker.elt)
1101
+ inline_tag(invoker, 'sup', invoker.elt)
973
1102
  end
974
1103
 
975
1104
  # this doesn't work with IExplorer and others
@@ -982,7 +1111,7 @@ EOH
982
1111
  end
983
1112
 
984
1113
  def format_pagenumber(invoker)
985
- return ""
1114
+ return ''
986
1115
  end
987
1116
 
988
1117
 
@@ -1015,15 +1144,15 @@ EOH
1015
1144
 
1016
1145
  ################################################ Head {{{1
1017
1146
  def head_css
1018
- csso = @variables["css"]
1147
+ csso = @variables['css']
1019
1148
  if csso
1020
1149
  csss = csso.split(/\s+/)
1021
1150
  else
1022
1151
  csss = []
1023
1152
  end
1024
- cls = @variables["class"]
1153
+ cls = @variables['class']
1025
1154
  if cls
1026
- csss << cls + ".css"
1155
+ csss << cls + '.css'
1027
1156
  end
1028
1157
  acc = []
1029
1158
  csss.each_with_index do | f, i |
@@ -1034,14 +1163,19 @@ EOH
1034
1163
  else
1035
1164
  with_title = true
1036
1165
  end
1037
- cssName = File.basename(css, ".css")
1166
+ cssName = File.basename(css, '.css')
1167
+ unless @deplate.options.css.find {|c, anyway| cssName == c}
1168
+ @deplate.options.css << [cssName]
1169
+ end
1038
1170
  cssFile = @deplate.auxiliary_filename(css)
1171
+ cssFmt = @deplate.variables['htmlCssUrl'] || @deplate.variables['htmlAuxUrl']
1172
+ cssFile = cssFmt % cssFile if cssFmt
1039
1173
  opts = [%{rel="stylesheet" type="text/css" href="#{URI.escape(cssFile)}"}]
1040
1174
  opts << %{title="#{cssName}"} if with_title
1041
1175
  opts << %{media="#{media}"} if media
1042
- acc << head_link_tag(opts.join(" "))
1176
+ acc << head_link_tag(opts.join(' '))
1043
1177
  end
1044
- cssExtra = @variables["cssExtra"]
1178
+ cssExtra = @variables['cssExtra']
1045
1179
  acc << cssExtra if cssExtra
1046
1180
  return acc.join("\n")
1047
1181
  end
@@ -1060,132 +1194,102 @@ EOH
1060
1194
  def html_def
1061
1195
  acc = []
1062
1196
  acc << html_lang
1063
- acc << @variables["htmlDefEtc"] if @variables["htmlDefEtc"]
1197
+ acc << @variables['htmlDefEtc'] if @variables['htmlDefEtc']
1064
1198
  if acc.empty?
1065
- return "<html>"
1199
+ return '<html>'
1066
1200
  else
1067
- return "<html #{acc.join(" ")}>"
1201
+ return "<html #{acc.join(' ')}>"
1068
1202
  end
1069
1203
  end
1070
-
1204
+
1071
1205
 
1072
1206
  ################################################ List of ... {{{1
1073
- def format_list_of_contents(invoker)
1074
- format_list_of(invoker, "Table of Contents", @deplate.table_of_contents, "hd",
1075
- :flat => false, :html_class => "toc")
1207
+ def format_list_of_toc(invoker)
1208
+ format_list_of(invoker,
1209
+ :title => 'Table of Contents',
1210
+ :prefix => 'hd',
1211
+ :listing => 'toc',
1212
+ :flat => false,
1213
+ :style => 'toc')
1076
1214
  end
1077
1215
 
1078
- alias :format_list_of_toc :format_list_of_contents
1079
-
1080
1216
  def format_list_of_minitoc(invoker)
1081
- data = @deplate.table_of_contents.find_all {|e| e.level == 1}
1082
- format_list_of(invoker, "Contents", data, "hd",
1083
- :flat => false, :img => @variables["navGif"],
1084
- :html_class => "minitoc") do |hd|
1085
- hd.args["shortcaption"] || hd.args["id"]
1217
+ data = @deplate.options.listings.get('toc').find_all {|e| e.level == 1}
1218
+ format_list_of(invoker,
1219
+ :title => 'Contents',
1220
+ :prefix => 'hd',
1221
+ :data => data, :flat => false,
1222
+ :img => @variables['navGif'],
1223
+ :style => 'minitoc') do |hd|
1224
+ hd.args['shortcaption'] || hd.args['id']
1086
1225
  end
1087
1226
  end
1088
1227
 
1089
- def format_list_of_tables(invoker)
1090
- format_list_of(invoker, "List of Tables", @deplate.table_of_tables, "tab",
1091
- :flat => true, :html_class => "lot")
1228
+ def format_list_of_lot(invoker)
1229
+ format_list_of(invoker,
1230
+ :title => 'List of Tables',
1231
+ :prefix => 'tab',
1232
+ :listing => 'lot',
1233
+ :flat => true,
1234
+ :style => 'lot')
1092
1235
  end
1093
1236
 
1094
- def format_list_of_figures(invoker)
1095
- @html_class = "lof"
1096
- format_list_of(invoker, "List of Figures", @deplate.table_of_figures, "fig",
1097
- :flat => true, :html_class => "lof")
1237
+ def format_list_of_lof(invoker)
1238
+ # @html_class = "lof"
1239
+ format_list_of(invoker,
1240
+ :title => 'List of Figures',
1241
+ :prefix => 'fig',
1242
+ :listing => 'lof',
1243
+ :flat => true,
1244
+ :style => 'lof')
1098
1245
  end
1099
1246
 
1100
1247
  def format_list_of_index(invoker)
1101
- format_the_index(invoker, "Index", @deplate.index, "idx",
1102
- true, :html_class => "index")
1248
+ format_the_index(invoker, 'Index',
1249
+ @deplate.index,
1250
+ 'idx',
1251
+ true,
1252
+ :style => 'index')
1253
+ end
1254
+
1255
+ def listing_prematter(invoker, args, id)
1256
+ img = args[:img]
1257
+ img = %{<img src="#{img_url(img, args)}" border="0" alt="" />} if img
1258
+ %{<div id="%s">%s\n<div id="%sBlock" class="%s">} % [
1259
+ id,
1260
+ img,
1261
+ id,
1262
+ get_html_class(invoker, args)
1263
+ ]
1103
1264
  end
1104
-
1105
- def format_list_of(invoker, name, data, prefix, other_args)
1106
- args = invoker.args
1107
- flat = other_args[:flat] || false
1108
- img = other_args[:img] || nil
1109
- img = %{<img src="#{img}" border="0" alt="" />} if img
1110
- html_class = get_html_class(invoker, other_args[:html_class])
1111
- name = args["title"] || name
1112
- id = name.gsub(/\W/, "_")
1113
-
1114
- acc = []
1115
- consume_label(id, true)
1116
- consume_label("#{id}Block", true)
1117
- acc << %{<div id="%s">%s\n<div id="%sBlock" class="%s">} % [id, img, id, html_class]
1118
- unless args["plain"] || args["noTitle"]
1119
- ti = @deplate.msg(name)
1120
- acc << %{<h1 class="%s">%s%s</h1>} % [html_class, format_label(invoker), ti]
1121
- end
1122
-
1123
- ll = 1
1124
- levels = args['levels']
1125
- if levels
1126
- range_from, range_to, rest = levels.split(/\.\./)
1127
- if rest
1128
- log(['Malformed range', levels], :error)
1129
- end
1130
- end
1131
- range_from ||= args['min']
1132
- if range_from
1133
- range_from = range_from.to_i
1134
- end
1135
- range_to ||= args['max']
1136
- if range_to
1137
- range_to = range_to.to_i
1138
- end
1139
- top = args['top']
1140
- if top
1141
- top = /^#{Regexp.escape(top)}/
1142
- end
1143
- sub = args['sub']
1144
- if sub
1145
- sub = /^#{Regexp.escape(invoker.level_as_string)}\./
1265
+
1266
+ def listing_postmatter(invoker, args)
1267
+ %{</div></div>}
1268
+ end
1269
+
1270
+ def listing_title(invoker, args, name)
1271
+ if name
1272
+ %{<h1 class="%s">%s%s</h1>} % [
1273
+ get_html_class(invoker, args),
1274
+ format_label(invoker),
1275
+ @deplate.msg(name)
1276
+ ]
1146
1277
  end
1147
- accData = []
1148
- for hd in data
1149
- if hd.nil? or hd.args["noList"]
1150
- next
1151
- end
1152
- if range_from and hd.level < range_from
1153
- next
1154
- end
1155
- if range_to and hd.level > range_to
1156
- next
1157
- end
1158
- if top and hd.level_as_string !~ top
1159
- next
1160
- end
1161
- if sub and hd.level_as_string !~ sub
1162
- next
1163
- end
1164
- l = if flat then 1 else hd.level end
1165
- f = hd.output_file_name(:relative => invoker)
1166
- d = f + "#" + @deplate.elt_label(prefix, hd.level_as_string)
1167
- v = nil
1168
- if block_given?
1169
- v = yield(hd)
1170
- end
1171
- unless v
1172
- v = hd.caption ? hd.caption.elt : hd.elt.dup
1173
- end
1174
- # v.gsub!(/<a name=".*?"><\/a>/, "")
1175
- v = clean_tags(v)
1176
- v = [hd.level_as_string, v].join(" ") unless hd.plain_caption?
1177
- b = format_url(invoker, v, d, nil, true)
1178
- s = Deplate::ListItem.new(nil, b, "Itemize", "Itemize", l, 0, true)
1179
- s.style = html_class
1180
- accData << s
1181
- end
1182
- acc << printable_list(invoker, accData)
1183
- acc << %{</div></div>}
1184
- join_blocks(acc)
1185
1278
  end
1186
-
1187
- def format_the_index(invoker, name, data, prefix="", flat=false, other_args={})
1188
- html_class = other_args[:html_class] || "index"
1279
+
1280
+ def listing_item(invoker, args, prefix, title, heading, level, other_args)
1281
+ v = clean_tags(title)
1282
+ v = [heading.level_as_string, v].join(' ') unless heading.plain_caption?
1283
+ f = heading.output_file_name(:relative => invoker)
1284
+ d = [f, @deplate.elt_label(prefix, heading.level_as_string)].join('#')
1285
+ b = format_url(invoker, v, d, nil, true)
1286
+ s = Deplate::ListItem.new(nil, b, 'Itemize', 'Itemize', level, 0, true)
1287
+ s.style = get_html_class(invoker, args)
1288
+ s
1289
+ end
1290
+
1291
+ def format_the_index(invoker, name, data, prefix='', flat=false, other_args={})
1292
+ style = other_args[:style] || 'index'
1189
1293
  accum = []
1190
1294
  chars = []
1191
1295
 
@@ -1196,41 +1300,43 @@ EOH
1196
1300
  chars << cht
1197
1301
  lab = format_label(invoker, :string, [format_index_hd_label(cht)])
1198
1302
  accum << format_list_env(invoker, "Description", 0, :close) unless accum.empty?
1199
- accum << %{<h2 class="%s">%s%s</h2>} % [html_class, lab, cht]
1303
+ accum << %{<h2 class="%s">%s%s</h2>} % [style, lab, cht]
1200
1304
  accum << format_list_env(invoker, "Description", 0, :open)
1201
1305
  end
1202
1306
  acc = []
1203
1307
  for i in arr
1204
1308
  ff = @deplate.dest
1205
- if i.file or i.level_as_string
1206
- f = i.file || invoker.output_file_name(:level_as_string => i.level_as_string,
1207
- :relative => invoker)
1309
+ xf = i.file(invoker)
1310
+ xl = i.level_as_string
1311
+ if xf or xl
1312
+ f = xf || invoker.output_file_name(:level_as_string => xl,
1313
+ :relative => invoker)
1208
1314
  if f == ff
1209
- f = ""
1210
- l = i.level_as_string
1315
+ f = ''
1316
+ l = xl
1211
1317
  if l and !l.empty?
1212
1318
  t = l
1213
1319
  elsif @deplate.options.multi_file_output
1214
- t = @variables["refButton"] || "[&rArr;]"
1320
+ t = @variables['refButton'] || '[&rArr;]'
1215
1321
  else
1216
- t = "I"
1322
+ t = 'I'
1217
1323
  end
1218
1324
  else
1219
- t = @deplate.file_with_suffix(f, "", true)
1325
+ t = @deplate.file_with_suffix(f, '', true)
1220
1326
  end
1221
1327
  acc << format_url(invoker, t, f, i.label, true)
1222
1328
  else
1223
- log(["Index: Neither file nor level defined: dropping", i.label], :error)
1329
+ invoker.log(['Index: Neither file nor level defined: dropping', n, i.label], :error)
1224
1330
  end
1225
1331
  end
1226
1332
  l = format_label(invoker, :string, [format_index_entry_label(invoker, n)])
1227
- s = Deplate::ListItem.new(l + plain_text(n), acc.join(", "))
1228
- accum += format_list_item(invoker, "Description", 0, s)
1333
+ s = Deplate::ListItem.new(l + plain_text(n), acc.join(', '))
1334
+ accum += format_list_item(invoker, 'Description', 0, s)
1229
1335
  end
1230
- accum << format_list_env(invoker, "Description", 0, :close)
1336
+ accum << format_list_env(invoker, 'Description', 0, :close)
1231
1337
 
1232
1338
  acc = []
1233
- acc << %{<p class="%stoc">} % html_class
1339
+ acc << %{<p class="%stoc">} % style
1234
1340
  for c in chars
1235
1341
  l = format_url(invoker, c, "", format_index_hd_label(c), true)
1236
1342
  acc << l
@@ -1256,21 +1362,21 @@ EOH
1256
1362
  opts = [nil]
1257
1363
  align = float_align(invoker)
1258
1364
  case align
1259
- when "center"
1260
- when "right"
1261
- when "left"
1365
+ when 'center'
1366
+ when 'right'
1367
+ when 'left'
1262
1368
  end
1263
1369
  opts << %{align="#{align}"} if align
1264
- width = args["width"] || @variables["tableWidth"]
1370
+ width = args['width'] || @variables['tableWidth']
1265
1371
  opts << %{width="#{width}"} if width
1266
1372
  opts << %{summary="#{caption.elt}"} if caption and caption.elt
1267
- return opts.join(" ")
1373
+ return opts.join(' ')
1268
1374
  end
1269
1375
 
1270
1376
  def float_align(invoker)
1271
1377
  args = invoker.args
1272
- args["align"] || @variables["floatAlign"]
1273
- # || "center"
1378
+ args['align'] || @variables['floatAlign']
1379
+ # || 'center'
1274
1380
  end
1275
1381
 
1276
1382
  def float_align_caption(invoker)
@@ -1284,9 +1390,9 @@ EOH
1284
1390
  end
1285
1391
 
1286
1392
  def formatted_table_row(n, row, args, indent, html_class=nil, thistag=nil)
1287
- colwidths = Deplate::Core.props(args["cols"], "w")
1288
- coljusts = Deplate::Core.props(args["cols"], "j")
1289
- rowheight = Deplate::Core.props(args["rows"], "h")
1393
+ colwidths = Deplate::Core.props(args['cols'], 'w')
1394
+ coljusts = Deplate::Core.props(args['cols'], 'j')
1395
+ rowheight = Deplate::Core.props(args['rows'], 'h')
1290
1396
  t = []
1291
1397
  row.cols.each_with_index do |cell, i|
1292
1398
  case cell
@@ -1299,9 +1405,9 @@ EOH
1299
1405
  tag = thistag
1300
1406
  else
1301
1407
  if row.head
1302
- tag = "th"
1408
+ tag = 'th'
1303
1409
  else
1304
- tag = "td"
1410
+ tag = 'td'
1305
1411
  end
1306
1412
  end
1307
1413
 
@@ -1333,7 +1439,7 @@ EOH
1333
1439
  if styles.empty?
1334
1440
  styles = ""
1335
1441
  else
1336
- opts << %{style="%s"} % styles.join("; ")
1442
+ opts << %{style="%s"} % styles.join('; ')
1337
1443
  end
1338
1444
 
1339
1445
  if cell.span_x > 1
@@ -1344,7 +1450,7 @@ EOH
1344
1450
  end
1345
1451
 
1346
1452
  # t << "<#{tag}#{opts.join(" ")}>#{indented(c, indent)}\n#{indent}</#{tag}>"
1347
- t << "<#{tag}#{opts.join(" ")}>#{c}</#{tag}>"
1453
+ t << "<#{tag}#{opts.join(' ')}>#{c}</#{tag}>"
1348
1454
  end
1349
1455
  end
1350
1456
  t
@@ -1359,7 +1465,7 @@ EOH
1359
1465
 
1360
1466
  public
1361
1467
  ################################################ navigation bar {{{1
1362
- def format_navigation_bar(invoker, type, slot, bartype, first=false, last=false)
1468
+ def format_navigation_bar(invoker, type, slot, bartype, first=nil, last=nil)
1363
1469
  idx, first, last = navbar_output_index(invoker, first, last)
1364
1470
 
1365
1471
  nomenu = invoker.args['noNavMenu'] || @variables['noNavMenu']
@@ -1392,76 +1498,85 @@ EOH
1392
1498
  link_up = head_link_tag(%{rel="up" href="#{url}" title="#{clean_tags(tit)}"})
1393
1499
  set_at(:pre, :htmlsite_up, link_up)
1394
1500
  end
1395
- unless bartype == :inline or @variables["noBindKeys"]
1396
- output_at(:body, :navbar_js, html_navigation_keys({"next" => urlspace}, ""))
1501
+ unless bartype == :inline or @variables['noBindKeys']
1502
+ output_at(:body, :navbar_js, invoke_service('navigation_keys', 'next' => urlspace))
1397
1503
  end
1398
1504
  else
1399
- if (first or idx == 0) and !@variables["noNavigationNote"]
1400
- output_at(type, slot, @deplate.invoke_service("navigation_note"))
1505
+ if (first or idx == 0) and !@variables['noNavigationNote']
1506
+ output_at(type, slot, invoke_service('navigation_note'))
1401
1507
  end
1402
1508
  end
1403
1509
  end
1404
1510
  navbar_end(type, slot, idx)
1405
1511
  end
1406
1512
 
1513
+ def format_navigation_buttons(invoker, type, slot, bartype, first=false, last=false)
1514
+ idx, first, last = navbar_output_index(invoker, first, last)
1515
+ urlp, prv = navbar_button_prev(type, slot, idx, bartype, !first && idx > 0)
1516
+ url, home = navbar_button_home(type, slot, idx, bartype, idx > 0)
1517
+ urln, nxt = navbar_button_next(type, slot, idx, bartype, !last)
1518
+ output_at(type, slot, [urlp, url, urln].join)
1519
+ end
1520
+
1407
1521
  def navbar_button_prev(type, slot, idx, bartype, ok)
1408
1522
  if ok
1409
- text = @variables["prevButton"] || @deplate.formatter.plain_text("<<")
1523
+ text = @variables['prevButton'] || plain_text('<<')
1410
1524
  urlp = navbar_guess_file_name(idx - 1, idx, bartype)
1411
- ak = bartype == :top ? %{ accesskey="B"} : ""
1412
- prv = %{<a class="navbarUrl" title="Previous" href="#{urlp}"#{ak}>#{text}</a>}
1525
+ ak = bartype == :top ? %{ accesskey="B"} : ''
1526
+ prv = %{<a class="navbarUrl" title="Previous" href="#{urlp}"#{ak}>#{text}</a>}
1413
1527
  else
1414
1528
  urlp = nil
1415
1529
  end
1416
1530
  unless urlp
1417
- prv = "&nbsp;"
1531
+ prv = '&nbsp;'
1418
1532
  end
1419
- navbar_add_element(type, slot, idx, prv, "navbar")
1533
+ navbar_add_element(type, slot, idx, prv, 'navbar')
1420
1534
  return urlp, prv
1421
1535
  end
1422
-
1536
+
1423
1537
  def navbar_button_home(type, slot, idx, bartype, ok)
1424
- if ok or @variables["homeShowAlways"]
1425
- text = @variables["homeButton"] || "[-]"
1426
- url = navbar_guess_file_name(0, idx, bartype) || "#pagetop"
1427
- ak = [:top, "navbar"].include?(bartype) ? %{ accesskey="H"} : ""
1428
- hc = ["navbar"].include?(bartype) ? "navBar" : "navbarUrl"
1538
+ if ok or @variables['homeShowAlways']
1539
+ text = @variables['homeButton'] || '[-]'
1540
+ url = navbar_guess_file_name(@deplate.home_index, idx, bartype) || '#pagetop'
1541
+ ak = [:top, 'navbar'].include?(bartype) ? %{ accesskey='H'} : ''
1542
+ hc = ['navbar'].include?(bartype) ? 'navBar' : 'navbarUrl'
1429
1543
  home = %{<a class="#{hc}" title="Home" href="#{url}"#{ak}>#{text}</a>}
1430
1544
  else
1431
1545
  url = nil
1432
1546
  end
1433
1547
  unless url
1434
- home = "&nbsp;"
1548
+ home = '&nbsp;'
1435
1549
  end
1436
- navbar_add_element(type, slot, idx, home, "navbar")
1550
+ navbar_add_element(type, slot, idx, home, 'navbar')
1437
1551
  return url, home
1438
1552
  end
1439
1553
 
1440
1554
  def navbar_button_next(type, slot, idx, bartype, ok)
1441
1555
  if ok
1442
- text = @variables["nextButton"] || @deplate.formatter.plain_text(">>")
1556
+ text = @variables['nextButton'] || plain_text('>>')
1443
1557
  urln = navbar_guess_file_name(idx + 1, idx, bartype)
1444
- ak = bartype == :top ? %{ accesskey="N"} : ""
1558
+ ak = bartype == :top ? %{ accesskey='N'} : ''
1445
1559
  nxt = %{<a class="navbarUrl" title="Next" href="#{urln}"#{ak}>#{text}</a>}
1446
1560
  else
1447
1561
  urln = nil
1448
1562
  end
1449
1563
  unless urln
1450
- nxt = "&nbsp;"
1564
+ nxt = '&nbsp;'
1451
1565
  end
1452
- navbar_add_element(type, slot, idx, nxt, "navbar")
1566
+ navbar_add_element(type, slot, idx, nxt, 'navbar')
1453
1567
  return urln, nxt
1454
1568
  end
1455
1569
 
1456
1570
  def navbar_menu(type, slot, idx, bartype)
1457
- unless @deplate.options.navmenu
1571
+ # unless @deplate.options.navmenu
1458
1572
  navmenu = [%{<form action=""><select class="navmenu" name="Contents"
1459
1573
  onChange="self.location.href=this.form.Contents.options[this.form.Contents.options.selectedIndex].value">},
1460
1574
  %{<option value="">[ #{@deplate.msg("Contents")} ]</option>},
1461
1575
  %{<option value="">------------------------</option>}]
1462
1576
 
1463
1577
  acc = []
1464
- @variables["@contents"] ||= acc
1578
+ @variables['@contents'] ||= acc
1579
+ th = @deplate.output.top_heading
1465
1580
  @deplate.each_heading(:top) do |hd, title|
1466
1581
  file = hd.output_file_name(:basename => true)
1467
1582
  unless hd.kind_of?(Deplate::NullTop)
@@ -1471,7 +1586,16 @@ EOH
1471
1586
  end
1472
1587
  acc << [title, file]
1473
1588
  end
1474
- navmenu << %{<option value="#{file}">#{title}</option>}
1589
+ pre = (hd.level and hd.level > 1) ? ('&nbsp;' * hd.level) : nil
1590
+ o = []
1591
+ o << 'selected' if hd == th
1592
+ if o.empty?
1593
+ o = nil
1594
+ else
1595
+ o << nil unless o.empty?
1596
+ o = o.join(' ')
1597
+ end
1598
+ navmenu << %{<option #{o}value="#{file}">#{pre}#{title}</option>}
1475
1599
  end
1476
1600
 
1477
1601
  navmenu << %{</select>}
@@ -1480,8 +1604,8 @@ EOH
1480
1604
  # navmenu << %{</button>}
1481
1605
  navmenu << %{</form>}
1482
1606
  @deplate.options.navmenu = navmenu.join("\n")
1483
- end
1484
- navbar_add_element(type, slot, idx, @deplate.options.navmenu, "navmenu")
1607
+ # end
1608
+ navbar_add_element(type, slot, idx, @deplate.options.navmenu, 'navmenu')
1485
1609
  end
1486
1610
 
1487
1611
 
@@ -1489,88 +1613,56 @@ EOH
1489
1613
  def format_navigation_links(depth)
1490
1614
  acc = []
1491
1615
  start = navbar_guess_file_name(0, nil, :inline)
1492
- if start and start != ""
1493
- title = @deplate.msg("Frontpage")
1616
+ if start and start != ''
1617
+ title = @deplate.msg('Frontpage')
1494
1618
  acc << head_link_tag(%{rel="start" href="#{start}" title="#{clean_tags(title)}"})
1495
1619
  end
1496
- tags = ["", "chapter", "section", "subsection"]
1497
- @deplate.each_heading(depth || 2) do |hd, title|
1620
+ tags = ['', 'chapter', 'section', 'subsection']
1621
+ @deplate.each_heading(depth || @deplate.options.split_level) do |hd, title|
1498
1622
  ref = tags[hd.level]
1499
1623
  anchor = hd.args[:id] || hd.label.first
1500
1624
  file = hd.output_file_name(:basename => true)
1501
- file = [file, "#", anchor].join if anchor
1625
+ file = escape_filename(file)
1626
+ file = [file, '#', anchor].join if anchor
1502
1627
  acc << head_link_tag(%{rel="#{ref}" href="#{file}" title="#{clean_tags(title)}"})
1503
1628
  end
1504
1629
  acc.join("\n")
1505
1630
  end
1631
+
1632
+ def escape_filename(fname)
1633
+ fname.split(/\//).collect {|p| URI.escape(p)}.join('/')
1634
+ end
1506
1635
 
1507
- def navbar_guess_file_name(idx, base, bartype, section=nil)
1636
+ def navbar_guess_file_name(idx, base=nil, bartype=nil, section=nil)
1508
1637
  b = @deplate.output_filename_by_idx(base)
1509
1638
  ff = @deplate.output_filename_by_idx(idx)
1510
1639
  f = @deplate.relative_path_by_file(ff, b)
1640
+ f = escape_filename(f)
1511
1641
  if bartype == :inline
1512
1642
  section ||= @deplate.top_heading_by_idx(idx)
1513
1643
  if section
1514
1644
  anchor = section.args[:id] || section.label.first
1515
- if anchor and anchor != "deplateNullTop"
1516
- f = [f, "#", anchor].join
1645
+ if anchor and anchor != 'deplateNullTop'
1646
+ f = [f, '#', anchor].join
1517
1647
  end
1518
1648
  end
1519
1649
  end
1520
1650
  return f
1521
1651
  end
1522
1652
 
1523
-
1524
- private
1525
- def navbar_begin(type, slot, idx)
1526
- output_at(type, slot, %{<table class="navbar"><tr class="navbar">})
1527
- end
1528
-
1529
- def navbar_end(type, slot, idx)
1530
- output_at(type, slot, %{</tr></table>})
1531
- end
1532
-
1533
- def navbar_add_element(type, slot, idx, element, htmlclass)
1534
- if !@variables["noTabBarButtons"] and type and slot
1535
- output_at(type, slot, %{<td class="#{htmlclass}">#{element}</td>})
1536
- end
1653
+ def handle_key(key, function)
1654
+ key = ',%s,' % key.split(/\s*,\s*/).join(',')
1655
+ @deplate.output.attributes[:handle_keys] ||= {}
1656
+ @deplate.output.attributes[:handle_keys][key] = function
1537
1657
  end
1538
1658
 
1539
- def navbar_output_index(invoker, first=false, last=false)
1540
- acc = []
1541
- if invoker.respond_to?(:top_heading)
1542
- th = invoker.top_heading
1543
- acc << @deplate.output_index(th)
1544
- acc << first || th.first_top
1545
- acc << last || th.last_top
1546
- else
1547
- idx = @deplate.output_index
1548
- acc << idx
1549
- acc << (first || (idx == 0))
1550
- acc << (last || (@deplate.number_of_outputs == idx + 1))
1551
- end
1552
- return acc
1553
- end
1554
-
1555
- end
1556
-
1557
-
1558
- class Deplate::Core
1559
- def formatter_initialize_html
1560
- @doc_services["navigation_bar"] = :html_navigation_bar
1561
- @doc_services["navigation_note"] = :html_navigation_note
1562
- @doc_services["navigation_keys"] = :html_navigation_keys
1563
- @doc_services["navigation_links"] = :html_navigation_links
1564
- @html_navigation_note = nil
1565
- end
1566
-
1567
- def html_navigation_links(args, text)
1568
- depth = args["depth"]
1659
+ def_service('navigation_links') do |args, text|
1660
+ depth = args['depth']
1569
1661
  depth &&= depth.to_i
1570
- @formatter.format_navigation_links(depth)
1662
+ format_navigation_links(depth)
1571
1663
  end
1572
1664
 
1573
- def html_navigation_bar(args, text)
1665
+ def_service('navigation_bar') do |args, text|
1574
1666
  type = :array
1575
1667
  slot = []
1576
1668
  invoker = args[:invoker]
@@ -1579,7 +1671,14 @@ class Deplate::Core
1579
1671
  else
1580
1672
  invoker = Deplate::PseudoContainer.new(@deplate, :args => args)
1581
1673
  end
1582
- @formatter.format_navigation_bar(invoker, type, slot, :inline)
1674
+ bartype = if args['top']
1675
+ :top
1676
+ elsif args['bottom']
1677
+ :bottom
1678
+ else
1679
+ :inline
1680
+ end
1681
+ format_navigation_bar(invoker, type, slot, bartype)
1583
1682
  slot.join("\n")
1584
1683
  end
1585
1684
 
@@ -1589,49 +1688,133 @@ class Deplate::Core
1589
1688
  # 16 ... shift
1590
1689
  # 17 ... ctrl
1591
1690
  # 18 ... alt
1691
+ # 19 ... pause
1592
1692
  # 27 ... esc
1593
1693
  # 32 ... space
1694
+ # 33 ... page up
1695
+ # 34 ... page down
1594
1696
  # 37 ... left
1595
1697
  # 39 ... right
1596
1698
  # 78 ... n
1699
+ # 109 ... -
1700
+ # 112 ... F1
1701
+ # ..
1702
+ # 121 ... F10
1703
+ # 188 ... ,
1704
+ # 190 ... .
1597
1705
  # 191 ... #
1598
- def html_navigation_keys(args, text)
1599
- nextKey = @variables["nextKey"] || "16"
1600
- nextKey = ",%s," % nextKey.split(/\s*,\s*/).join(",")
1601
- prevKey = @variables["prevKey"] || "8"
1602
- prevKey = ",%s," % prevKey.split(/\s*,\s*/).join(",")
1603
- acc = []
1604
- if nextKey.to_i > 0
1605
- acc << <<-EOJS
1606
- <script type="text/javascript">
1607
- <!--
1608
- function HandleSpace() {
1609
- this.event = function(e) {
1610
- if (!e) { e = window.event; }
1611
- EOJS
1612
- if args["next"]
1613
- acc << <<-EOJS
1614
- if ("#{nextKey}".indexOf(","+ e.keyCode +",") != -1) {
1615
- window.location="#{args["next"]}";
1616
- }
1617
- EOJS
1618
- end
1619
- acc << <<-EOJS
1620
- };
1621
- var self = this;
1622
- }
1623
- var k = new HandleSpace();
1624
- document.onkeydown = k.event;
1625
- //-->
1626
- </script>
1627
- EOJS
1706
+ def_service('navigation_keys') do |args, text|
1707
+ urln = args['next']
1708
+ if urln
1709
+ last = false
1710
+ else
1711
+ idx, first, last = navbar_output_index(args[:invoker])
1712
+ urln = navbar_guess_file_name(idx + 1, idx)
1713
+ end
1714
+ # prevKey = @variables['prevKey'] || '8'
1715
+ acc = []
1716
+ if urln and !last
1717
+ nextKey = @variables['nextKey'] || '16'
1718
+ handle_key(nextKey, 'NavigationNextPage();') if nextKey.to_i > 0
1719
+ acc << <<EOJS
1720
+ <script type="text/javascript">
1721
+ <!--
1722
+ function NavigationNextPage() {
1723
+ window.location="#{urln}";
1724
+ }
1725
+ //-->
1726
+ </script>
1727
+ EOJS
1628
1728
  end
1629
1729
  acc.join
1630
1730
  end
1731
+
1732
+ def_service('navigation_handle_keys') do |args, text|
1733
+ keys = @deplate.output.attributes[:handle_keys]
1734
+ if keys
1735
+ acc = [<<EOJS
1736
+ <script type="text/javascript">
1737
+ <!--
1738
+ function HandleKeys() {
1739
+ this.event = function(e) {
1740
+ if (!e) { e = window.event; }
1741
+ EOJS
1742
+ ]
1743
+ cmd = nil
1744
+ keys.each do |key, fn|
1745
+ cmd = cmd ? '} else if' : 'if'
1746
+ acc << <<EOJS
1747
+ #{cmd} ("#{key}".indexOf(","+ e.keyCode +",") != -1) {
1748
+ #{fn}
1749
+ EOJS
1750
+ end
1751
+ # } else {
1752
+ # alert('DBG key code='+ e.keyCode);
1753
+ acc << <<EOJS
1754
+ }
1755
+ };
1756
+ var self = this;
1757
+ }
1758
+ var k = new HandleKeys();
1759
+ document.onkeydown = k.event;
1760
+ //-->
1761
+ </script>
1762
+ EOJS
1763
+ acc.join
1764
+ else
1765
+ ''
1766
+ end
1767
+ end
1631
1768
 
1632
- def html_navigation_note(args, text)
1769
+ def_service('stepwise_display') do |args, text|
1770
+ stepKey = @variables['stepwiseKey'] || '34'
1771
+ if @variables['stepwiseDisplay'] and stepKey
1772
+ handle_key(stepKey, 'StepwiseDisplayNext();')
1773
+ stepInit = @variables['stepwiseBegin'] || '1'
1774
+ acc = []
1775
+ acc << <<EOJS
1776
+ <script type="text/javascript">
1777
+ <!--
1778
+ var StepwiseCounter = #{stepInit};
1779
+ function StepwiseDisplayNext() {
1780
+ StepwiseCounter = StepwiseCounter + 1;
1781
+ var Elt = document.getElementById('Step' + StepwiseCounter);
1782
+ if (Elt)
1783
+ Elt.style.visibility = 'visible';
1784
+ EOJS
1785
+ if @variables['stepwiseContinous']
1786
+ acc << <<EOJS
1787
+ else
1788
+ NavigationNextPage();
1789
+ EOJS
1790
+ end
1791
+ acc << <<EOJS
1792
+ }
1793
+ //-->
1794
+ </script>
1795
+ EOJS
1796
+ acc.join
1797
+ else
1798
+ ''
1799
+ end
1800
+ end
1801
+
1802
+ def_service('navigation_buttons') do |args, text|
1803
+ type = :array
1804
+ slot = []
1805
+ invoker = args[:invoker]
1806
+ if invoker
1807
+ invoker.args.update(args)
1808
+ else
1809
+ invoker = Deplate::PseudoContainer.new(self, :args => args)
1810
+ end
1811
+ format_navigation_buttons(invoker, type, slot, :inline)
1812
+ slot.join("\n")
1813
+ end
1814
+
1815
+ def_service('navigation_note') do |args, text|
1633
1816
  unless @html_navigation_note
1634
- @html_navigation_note = msg(:htmlnavigation_note)
1817
+ @html_navigation_note = @deplate.msg(:htmlnavigation_note)
1635
1818
  unless @html_navigation_note
1636
1819
  @html_navigation_note = [
1637
1820
  %{<p class="htmlnavigationnote" />},
@@ -1651,12 +1834,64 @@ class Deplate::Core
1651
1834
  ].join("\n")
1652
1835
  end
1653
1836
  end
1654
- return @html_navigation_note
1837
+ @html_navigation_note
1838
+ end
1839
+
1840
+
1841
+ private
1842
+ def navbar_begin(type, slot, idx)
1843
+ output_at(type, slot, %{<table class="navbar"><tr class="navbar">})
1844
+ end
1845
+
1846
+ def navbar_end(type, slot, idx)
1847
+ output_at(type, slot, %{</tr></table>})
1848
+ end
1849
+
1850
+ def navbar_add_element(type, slot, idx, element, htmlclass)
1851
+ if !@variables['noTabBarButtons'] and type and slot
1852
+ output_at(type, slot, %{<td class="#{htmlclass}">#{element}</td>})
1853
+ end
1655
1854
  end
1855
+
1856
+ # Return [idx, first, last]
1857
+ def navbar_output_index(invoker, first=nil, last=nil)
1858
+ acc = []
1859
+ if invoker.respond_to?(:top_heading) and !invoker.kind_of?(Deplate::PseudoContainer)
1860
+ th = invoker.top_heading
1861
+ else
1862
+ th = @deplate.output.top_heading
1863
+ end
1864
+ if th
1865
+ idx = @deplate.output_index(th)
1866
+ end
1867
+ acc << idx
1868
+ gf = th.first_top
1869
+ gl = th.last_top
1870
+ # else
1871
+ # out = @deplate.output
1872
+ # acc << idx
1873
+ # gf = (idx == @deplate.home_index)
1874
+ # gl = (idx == @deplate.top_heading_idx)
1875
+ # end
1876
+ case first
1877
+ when true, false
1878
+ acc << first
1879
+ else
1880
+ acc << gf
1881
+ end
1882
+ case last
1883
+ when true, false
1884
+ acc << last
1885
+ else
1886
+ acc << gl
1887
+ end
1888
+ return acc
1889
+ end
1890
+
1656
1891
  end
1657
1892
 
1658
1893
 
1659
- class Deplate::Element
1894
+ class Deplate::Base
1660
1895
  attr_accessor :html_class, :html_args
1661
1896
 
1662
1897
  def hook_pre_setup_html
@@ -1692,5 +1927,3 @@ class Deplate::Command::LIST
1692
1927
  end
1693
1928
  end
1694
1929
 
1695
-
1696
- # vim: ff=unix