deplate 0.7.3 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
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