erbook 4.0.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/README +3 -3
  2. data/Rakefile +6 -3
  3. data/bin/erbook +285 -251
  4. data/doc/README +2 -2
  5. data/doc/api/classes/ERBook.html +2 -2
  6. data/doc/api/classes/RDoc/AnyMethod.html +20 -20
  7. data/doc/api/classes/RDoc/AnyMethod.src/M000003.html +18 -0
  8. data/doc/api/classes/RDoc/AnyMethod.src/M000004.html +23 -0
  9. data/doc/api/classes/RDoc/AnyMethod.src/M000005.html +4 -4
  10. data/doc/api/classes/RDoc/AnyMethod.src/M000006.html +7 -8
  11. data/doc/api/classes/RDoc/TopLevel.html +30 -30
  12. data/doc/api/classes/RDoc/{AnyMethod.src → TopLevel.src}/M000007.html +4 -4
  13. data/doc/api/classes/RDoc/TopLevel.src/{M000014.html → M000008.html} +4 -4
  14. data/doc/api/classes/RDoc/TopLevel.src/M000009.html +4 -4
  15. data/doc/api/classes/RDoc/TopLevel.src/M000010.html +15 -4
  16. data/doc/api/classes/RDoc/TopLevel.src/M000011.html +11 -4
  17. data/doc/api/classes/RDoc/TopLevel.src/M000012.html +4 -15
  18. data/doc/api/classes/String.html +17 -82
  19. data/doc/api/classes/String.src/M000001.html +4 -4
  20. data/doc/api/classes/String.src/M000002.html +3 -6
  21. data/doc/api/created.rid +1 -1
  22. data/doc/api/files/lib/erbook/rdoc_rb.html +1 -1
  23. data/doc/api/files/lib/erbook/{html_rb.html → to_xhtml_rb.html} +7 -7
  24. data/doc/api/files/lib/erbook_rb.html +1 -1
  25. data/doc/api/fr_file_index.html +1 -1
  26. data/doc/api/fr_method_index.html +12 -14
  27. data/doc/api/index.html +1 -1
  28. data/doc/index.xhtml +2277 -0
  29. data/doc/manual.erb +198 -155
  30. data/fmt/xhtml.icons/index.yaml +20 -0
  31. data/fmt/xhtml.icons/mediawiki-1.13.2/COPYING +340 -0
  32. data/fmt/xhtml.icons/mediawiki-1.13.2/README +103 -0
  33. data/fmt/xhtml.icons/mediawiki-1.13.2/skins/simple/external.png +0 -0
  34. data/fmt/xhtml.icons/tango-icon-theme-0.8.1/48x48/README +2 -0
  35. data/fmt/{html.icons/note.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/apps/accessories-text-editor.png} +0 -0
  36. data/fmt/{html.icons/quote.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/apps/internet-group-chat.png} +0 -0
  37. data/fmt/{html.icons/important.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/emblems/emblem-important.png} +0 -0
  38. data/fmt/{html.icons/warning.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/status/dialog-error.png} +0 -0
  39. data/fmt/{html.icons/tip.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/status/dialog-information.png} +0 -0
  40. data/fmt/{html.icons/caution.png → xhtml.icons/tango-icon-theme-0.8.1/48x48/status/dialog-warning.png} +0 -0
  41. data/fmt/{html.icons/LICENSE → xhtml.icons/tango-icon-theme-0.8.1/COPYING} +0 -0
  42. data/fmt/xhtml.icons/tango-icon-theme-0.8.1/README +12 -0
  43. data/fmt/{html.yaml → xhtml.yaml} +305 -247
  44. data/lib/erbook.rb +2 -2
  45. data/lib/erbook/{html.rb → to_xhtml.rb} +18 -24
  46. metadata +42 -21
  47. data/doc/api/classes/RDoc/AnyMethod.src/M000008.html +0 -22
  48. data/doc/api/classes/RDoc/TopLevel.src/M000013.html +0 -25
  49. data/doc/api/classes/String.src/M000003.html +0 -20
  50. data/doc/api/classes/String.src/M000004.html +0 -26
  51. data/doc/index.html +0 -2663
  52. data/fmt/html.icons/README +0 -31
@@ -0,0 +1,2 @@
1
+ The 48x48 images in this subtree were generated from their SVG
2
+ sources in ../scalable/ using Inkscape <http://inkscape.org>.
@@ -0,0 +1,12 @@
1
+ Tango Icon Theme
2
+ ----------------
3
+
4
+ This is an icon theme that follows the Tango visual guidelines [1]. Currently
5
+ it depends on Imagemagick for creation of 24x24 bitmaps by adding a 1px padding
6
+ around the 22x22px version. For GNOME and KDE you will also need
7
+ icon-naming-utils that allow the theme to work in these environments before
8
+ they follow the new naming scheme [2].
9
+
10
+
11
+ [1] http://tango-project.org/Tango_Icon_Theme_Guidelines
12
+ [2] http://tango-project.org/Standard_Icon_Naming_Specification
@@ -1,19 +1,19 @@
1
1
  desc: web page for the Internet
2
2
 
3
3
  code: |
4
- # load the String#to_html and String#to_inline_html methods
5
- require 'erbook/html'
4
+ # load the String#to_xhtml and String#to_inline_xhtml methods
5
+ require 'erbook/to_xhtml'
6
6
 
7
7
  class String
8
- # Transforms this UTF-8 string into HTML entities.
9
- def to_html_entities
8
+ # Transforms this UTF-8 string into XML entities.
9
+ def to_xml_entities
10
10
  unpack('U*').map! {|c| "&##{c};"}.join
11
11
  end
12
12
 
13
13
  # Transforms this string into a valid URI fragment.
14
14
  # See http://www.nmt.edu/tcc/help/pubs/xhtml/id-type.html
15
15
  def to_uri_fragment
16
- # remove HTML tags from the input
16
+ # remove XML tags from the input
17
17
  buf = gsub(/<.*?>/, '')
18
18
 
19
19
  # The first or only character must be a letter.
@@ -32,168 +32,230 @@ code: |
32
32
  end
33
33
 
34
34
  class Hash
35
- # Transforms this hash into a string of HTML attribute key=value pairs.
36
- def to_html_atts
35
+ # Transforms this hash into a string of XML attribute key="value" pairs.
36
+ def to_xml_atts
37
37
  inject([]) {|s,(k,v)| s << %( #{k}="#{v}") }.join
38
38
  end
39
39
  end
40
40
 
41
- class Node
42
- # Returns the user-defined title for this node's content.
43
- def title
44
- @title ||= args[0]
45
- end
41
+ module ERBook
42
+ class Template
43
+ # Protects the given content from the text-to-XHTML conversion process.
44
+ def verbatim aContent
45
+ ERB::Util.html_escape aContent
46
+ end
46
47
 
47
- # Returns the user-defined indentifer for this node.
48
- def id
49
- @id ||= args[1]
50
- end
48
+ # Returns XHTML for a hyperlink to the given
49
+ # URL of the given label and mouse-hover title.
50
+ def hyperlink aUrl, aLabel = aUrl, aTitle = nil
51
+ %{<a href="#{aUrl}"#{%{ title="#{aTitle}"} if aTitle}>#{aLabel}</a>}
52
+ end
51
53
 
52
- def type_label
53
- type.to_s.capitalize
54
- end
54
+ # Returns an <img/> tag that embeds the given image file.
55
+ #
56
+ # aPath:: path to the image file
57
+ # aFormat:: format of the image file (e.g. PNG, JPEG, GIF, etc.)
58
+ # aAtts:: additional attributes for the <img> tag
59
+ #
60
+ def embed_image_file aPath, aFormat = aPath[/\w+/], aAtts = {}
61
+ data = ERBook.base_64_encode File.read(aPath)
62
+ embed_image_data data, aFormat, aAtts
63
+ end
55
64
 
56
- def type_atts
57
- { :class => type }.to_html_atts
65
+ # Returns an <img/> tag that embeds the given raw image data.
66
+ #
67
+ # aData:: raw image data
68
+ # aFormat:: format of the image file (e.g. PNG, JPEG, GIF, etc.)
69
+ # aAtts:: additional attributes for the <img> tag
70
+ #
71
+ def embed_image_data aData, aFormat, aAtts = {}
72
+ aAtts[:src] = ERBook.base_64_embed_image_data(aData, aFormat)
73
+ "<img#{aAtts.to_xml_atts}/>"
74
+ end
58
75
  end
59
76
 
60
- def title_atts
61
- { :class => :title, :id => here_frag }.to_html_atts
62
- end
77
+ class Node
78
+ # Returns the user-defined title for this node's content.
79
+ def title
80
+ @title ||= args[0]
81
+ end
63
82
 
64
- def title_html
65
- title.to_s.to_inline_html
66
- end
83
+ # Returns the user-defined indentifer for this node.
84
+ def id
85
+ @id ||= args[1]
86
+ end
67
87
 
68
- def content_html
69
- content.to_s.to_html
70
- end
71
88
 
72
- def title_link aTitle = nil
73
- here_link here_frag, aTitle || title_html
74
- # %{#{aTitle || title_html}&nbsp;&nbsp;&nbsp;&nbsp;#{here_link here_frag, '&para;'}&nbsp;#{list_link here_frag, list_frag, '&equiv;'}}
75
- end
89
+ ##
90
+ # utility methods
91
+ #
76
92
 
77
- def index_link
78
- list_link here_frag, list_frag, index
79
- # %{<span id="#{here_frag}">#{index}</span>}
80
- end
93
+ def type_label #:nodoc:
94
+ type.to_s.capitalize
95
+ end
81
96
 
82
- def number_link
83
- list_link here_frag, list_frag, [type_label, number].compact.join(' ')
84
- # %{<span id="#{here_frag}">#{[type_label, number].compact.join(' ')}</span>}
85
- end
97
+ def type_label_here_link #:nodoc:
98
+ s = type_label
99
+ here_link s, s
100
+ end
86
101
 
87
- def number_and_title_link
88
- "#{number_link}.&nbsp;&nbsp;#{title_link}"
89
- end
102
+ # Returns the title of this node as XHTML.
103
+ def title_xhtml
104
+ title.to_s.to_inline_xhtml
105
+ end
90
106
 
91
- def index_and_title_link
92
- "#{index_link}&nbsp;&nbsp;#{title_link}"
93
- end
107
+ # Returns the content of this node as XHTML.
108
+ def content_xhtml
109
+ content.to_s.to_xhtml
110
+ end
94
111
 
95
- def content_div
96
- %{<div class="content">#{content_html}</div>}
97
- end
112
+ # Returns the content of this node as XHTML inside a <div/>.
113
+ def content_xhtml_div #:nodoc:
114
+ %{<div class="content">#{content_xhtml}</div>}
115
+ end
116
+
117
+ # Returns a hyperlink to this node containing its title.
118
+ def title_link aTitle = nil
119
+ here_link here_frag, aTitle || title_xhtml
120
+ end
98
121
 
99
- @@frags = []
122
+ # Returns a hyperlink to this node
123
+ # containing its LaTeX-style index number.
124
+ def index_link
125
+ list_link here_frag, list_frag, index
126
+ end
100
127
 
101
- # Returns a unique URI fragment for this node.
102
- def here_frag
103
- unless defined? @here_frag
104
- salt = object_id.abs
105
- frag = (id || title || salt).to_s.to_uri_fragment
128
+ # Returns a hyperlink to this node containing its occurrence number.
129
+ def number_link
130
+ list_link here_frag, list_frag, [type_label, number].compact.join(' ')
131
+ end
106
132
 
107
- # make it unique
108
- while @@frags.include? frag
109
- frag << '-' << (index || number || salt).to_s
133
+ # Returns a hyperlink to this node containing
134
+ # its ocurrence number and its title.
135
+ def number_and_title_link #:nodoc:
136
+ "#{number_link}.&nbsp;&nbsp;#{title_link}"
137
+ end
138
+
139
+ # Returns a hyperlink to this node containing
140
+ # its LaTeX-style index number and its title.
141
+ def index_and_title_link #:nodoc:
142
+ "#{index_link}&nbsp;&nbsp;#{title_link}"
143
+ end
144
+
145
+
146
+ ##
147
+ # URI fragments
148
+ #
149
+
150
+ @@frags = []
151
+
152
+ # Returns a unique URI fragment for this node.
153
+ def here_frag #:nodoc:
154
+ unless defined? @here_frag
155
+ salt = object_id.abs
156
+ frag = (id || title || salt).to_s.to_uri_fragment
157
+
158
+ # make it unique
159
+ while @@frags.include? frag
160
+ frag << '-' << (index || number || salt).to_s
161
+ end
162
+
163
+ @@frags << frag
164
+ @here_frag = frag
110
165
  end
111
166
 
112
- @@frags << frag
113
- @here_frag = frag
167
+ @here_frag
168
+ end
169
+
170
+ # Returns the URI fragment for the location in the table
171
+ # of contents / list of figures that points this node.
172
+ def list_frag #:nodoc:
173
+ @list_frag ||= "rev:#{here_frag}"
114
174
  end
115
175
 
116
- @here_frag
117
- end
118
176
 
119
- # Returns the URI fragment for the location in the table
120
- # of contents / list of figures that points this node.
121
- def list_frag
122
- @list_frag ||= "rev:#{here_frag}"
177
+ private
178
+
179
+ def here_link aHereFrag, aLabel #:nodoc:
180
+ %{<a class="here" title="Permanent link to this section" href="##{aHereFrag}">#{aLabel}</a>}
181
+ end
182
+
183
+ def list_link aHereFrag, aListFrag, aLabel #:nodoc:
184
+ %{<a class="list" title="Return to table of contents" id="#{aHereFrag}" href="##{aListFrag}">#{aLabel}</a>}
185
+ end
123
186
  end
124
- end
125
187
 
126
- def here_link aHereFrag, aLabel
127
- %{<a class="here" title="Permanent link to this section" href="##{aHereFrag}">#{aLabel}</a>}
128
- end
188
+ # Encodes the given input in base64 format.
189
+ def ERBook.base_64_encode aInput #:nodoc:
190
+ [aInput].pack('m')
191
+ end
129
192
 
130
- def list_link aHereFrag, aListFrag, aLabel
131
- %{<a class="list" title="Return to table of contents" href="##{aListFrag}">#{aLabel}</a>}
132
- end
193
+ # Returns a string denoting embedded, base64 encoded data.
194
+ def ERBook.base_64_embed aData, aFormat #:nodoc:
195
+ "data:#{aFormat.to_s.downcase};base64,#{aData.tr("\n", '')}"
196
+ end
133
197
 
134
- # Returns a hyperlink to the given URL of
135
- # the given label and mouse-hover title.
136
- def link aUrl, aLabel = aUrl, aTitle = nil
137
- %{<a href="#{h aUrl}"#{%{ title="#{aTitle}"} if aTitle}>#{aLabel}</a>}
138
- end
198
+ # Returns a string denoting embedded, base64 encoded image data.
199
+ # aFormat:: format of the image data (e.g. PNG, JPEG, GIF, etc.)
200
+ def ERBook.base_64_embed_image_data aData, aFormat #:nodoc:
201
+ base_64_embed aData, "image/#{aFormat}"
202
+ end
139
203
 
140
- # Encodes the given input in base64 format.
141
- def base_64_encode aInput
142
- [aInput].pack('m')
143
- end
204
+ ##
205
+ # load admonition icons
206
+ #
144
207
 
145
- # Returns a string denoting embedded, base64 encoded data.
146
- def base_64_embed aData, aFormat
147
- "data:#{aFormat.to_s.downcase};base64,#{aData.tr("\n", '')}"
148
- end
208
+ ICONS_DIR = File.join(ERBook::FORMATS_DIR, 'xhtml.icons')
209
+ ICON_DEFS = YAML.load_file File.join(ICONS_DIR, 'index.yaml')
149
210
 
150
- # Returns a string denoting embedded, base64 encoded image data.
151
- # aFormat:: format of the image data (e.g. PNG, JPG, GIF, etc.)
152
- def base_64_embed_image_data aData, aFormat
153
- base_64_embed aData, "image/#{aFormat}"
154
- end
211
+ Icon = Struct.new(:origin, :path, :name, :format, :data)
212
+ class Icon #:nodoc:
213
+ # Returns a data URI containing embedded image data.
214
+ def data_uri
215
+ ERBook.base_64_embed_image_data self.data, self.format
216
+ end
155
217
 
156
- # Returns a HTML <img> tag that embeds the given image file.
157
- #
158
- # aPath:: path to the image file
159
- # aFormat:: format of the image file (e.g. PNG, JPG, GIF, etc.)
160
- # aAtts:: additional attributes for the <img> tag
161
- #
162
- def embed_image_file aPath, aFormat = aPath[/\w+/], aAtts = {}
163
- data = base_64_encode File.read(aPath)
164
- aAtts['src'] = base_64_embed_image_data(data, aFormat)
165
- "<img#{aAtts.to_html_atts}/>"
166
- end
218
+ # Returns a CSS url() containing embedded image data.
219
+ def data_css
220
+ %{url("#{data_uri}")}
221
+ end
167
222
 
168
- ##
169
- # load admonition icons
170
- #
223
+ # Returns a XML entity reference (to this icon's
224
+ # embedded image data) ready for insertion into XML.
225
+ def entity_xml
226
+ "&#{entity_name};"
227
+ end
171
228
 
172
- Icon = Struct.new(:path, :name, :format, :data)
229
+ # Returns the name of the XML entity whose
230
+ # value contains embedded image data.
231
+ def entity_name
232
+ "icon_#{name}"
233
+ end
173
234
 
174
- class Icon
175
- # Returns the CSS class for this icon.
176
- def css_class
177
- @css_class ||= "icon-#{name}"
235
+ # Returns an <img/> tag that renders the image
236
+ # data embedded as an ENTITY in the html DOCTYPE.
237
+ def to_xhtml aAtts = {}
238
+ aAtts[:alt] ||= name
239
+ aAtts[:src] = entity_xml
240
+ aAtts[:class] = :icon
241
+ "<img#{aAtts.to_xml_atts}/>"
242
+ end
178
243
  end
179
244
 
180
- # Returns a CSS url() containing embedded image data.
181
- def css_image
182
- "url(#{base_64_embed_image_data self.data, self.format})"
183
- end
184
- end
245
+ ICON_BY_NAME = {}
185
246
 
186
- ICONS = {}
247
+ ICON_DEFS.each_pair do |name, path|
248
+ format = File.extname(path).sub('.', '')
249
+ origin = path[/^\w+/]
187
250
 
188
- Dir[File.join(ERBook::FORMATS_DIR, 'html.icons', '*.*')].each do |path|
189
- ext = File.extname(path)
190
- name = File.basename(path, ext)
191
- data = base_64_encode File.open(path, 'rb') {|f| f.read }
251
+ path = File.join(ICONS_DIR, path) # make the path absolute
252
+ data = base_64_encode File.open(path, 'rb') {|f| f.read }
192
253
 
193
- ICONS[name] = Icon.new(path, name, ext.sub('.', ''), data)
194
- end
254
+ ICON_BY_NAME[name] = Icon.new(origin, path, name, format, data)
255
+ end
195
256
 
196
- # STDERR.puts ICONS.inspect
257
+ ICONS = ICON_BY_NAME.values
258
+ end
197
259
 
198
260
 
199
261
  nodes:
@@ -207,7 +269,7 @@ nodes:
207
269
  index: false
208
270
  number: false
209
271
  silent: true
210
- output: <%= @node.content_html %>
272
+ output: <%= @node.content_xhtml %>
211
273
 
212
274
  header_outside_above: &header_insert
213
275
  toc: false
@@ -215,7 +277,7 @@ nodes:
215
277
  index: false
216
278
  number: false
217
279
  silent: true
218
- output: <div class="<%= @node.type %>"><%= @node.content_html %></div>
280
+ output: <div class="<%= @node.type %>"><%= @node.content_xhtml %></div>
219
281
 
220
282
  header_inside_above: *header_insert
221
283
  header_inside_below: *header_insert
@@ -234,10 +296,9 @@ nodes:
234
296
  number: false
235
297
  silent: true
236
298
  output: |
237
- <% label = @node.type_label %>
238
- <div id="<%= label %>">
239
- <h1 class="title"><%= here_link label, label %></h1>
240
- <%= @node.content_div %>
299
+ <div id="<%= @node.type_label %>">
300
+ <h1 class="title"><%= @node.type_label_here_link %></h1>
301
+ <%= @node.content_xhtml_div %>
241
302
  </div>
242
303
 
243
304
 
@@ -252,12 +313,12 @@ nodes:
252
313
  number: true
253
314
  output: |
254
315
  <div class="<%= @node.type %>">
255
- <h1<%= @node.title_atts %>>
316
+ <h1 class="title">
256
317
  <%= @node.type_label %>&nbsp;<%= @node.index_link %>
257
318
  <br/>
258
319
  <big><%= @node.title_link %></big>
259
320
  </h1>
260
- <%= @node.content_div %>
321
+ <%= @node.content_xhtml_div %>
261
322
  </div>
262
323
 
263
324
  chapter: *latex
@@ -270,10 +331,10 @@ nodes:
270
331
  output: |
271
332
  <% depth = [6, @node.depth + 1].min %>
272
333
  <div class="<%= @node.type %>">
273
- <h<%= depth %><%= @node.title_atts %>>
334
+ <h<%= depth %> class="title">
274
335
  <%= @node.index_and_title_link %>
275
336
  </h<%= depth %>>
276
- <%= @node.content_div %>
337
+ <%= @node.content_xhtml_div %>
277
338
  </div>
278
339
 
279
340
  paragraph:
@@ -282,9 +343,9 @@ nodes:
282
343
  index: false
283
344
  number: false
284
345
  output: |
285
- <div<%= @node.type_atts %>>
286
- <p<%= @node.title_atts %>><%= @node.title_link %></p>
287
- <%= @node.content_div %>
346
+ <div class="<%= @node.type %>">
347
+ <p class="title"><%= @node.title_link %></p>
348
+ <%= @node.content_xhtml_div %>
288
349
  </div>
289
350
 
290
351
 
@@ -298,16 +359,9 @@ nodes:
298
359
  index: false
299
360
  number: true
300
361
  output: |
301
- <div<%= @node.type_atts %>>
302
- <p<%= @node.title_atts %>><%= @node.number_and_title_link %></p>
303
- <div class="content <%=
304
- $use_icons = true unless defined? $use_icons
305
-
306
- if $use_icons and icon = ICONS[@node.type]
307
- ($icons_used ||= []) << icon
308
- icon.css_class
309
- end
310
- %>"><%= @node.content_html %></div>
362
+ <div class="<%= @node.type %>">
363
+ <p class="title"><%= @node.number_and_title_link %></p>
364
+ <div class="content"><%= ICON_BY_NAME[@node.type].to_xhtml %><%= @node.content_xhtml %></div>
311
365
  </div>
312
366
 
313
367
  note: *admonition
@@ -329,7 +383,7 @@ nodes:
329
383
  output: |
330
384
  <div class="<%= @node.type %>">
331
385
  <p class="title"><%= @node.number_and_title_link %></p>
332
- <%= @node.content_div %>
386
+ <%= @node.content_xhtml_div %>
333
387
  </div>
334
388
 
335
389
  table: *formal
@@ -366,16 +420,16 @@ nodes:
366
420
 
367
421
  title_auto = @node.args.length < 2
368
422
 
369
- title_html =
423
+ title_xhtml =
370
424
  if title_auto
371
425
  title_text
372
426
  else
373
427
  @node.args[1].to_s
374
- end.to_inline_html
428
+ end.to_inline_xhtml
375
429
 
376
430
  %{<a class="#{@node.type}" href="##{target.here_frag}"#{
377
431
  %( title="#{title_text}") unless title_auto
378
- }>#{title_html}</a>}
432
+ }>#{title_xhtml}</a>}
379
433
  else
380
434
  raise ArgumentError, "invalid cross-reference to #{@node.title.inspect}", @node.trace
381
435
  end
@@ -440,7 +494,7 @@ output: |
440
494
  (n.index.to_s + '&nbsp;&nbsp;' if n.index),
441
495
  n.list_frag,
442
496
  n.here_frag,
443
- n.title.to_s.to_inline_html
497
+ n.title.to_s.to_inline_xhtml
444
498
  ]
445
499
  nested = n.children.inject('') {|s,c| s << toc_builder[c] }
446
500
 
@@ -466,7 +520,7 @@ output: |
466
520
 
467
521
  lof = lof_enums.sort.map do |(type, nodes)|
468
522
  nested = nodes.map do |n|
469
- %{<li><a id="#{n.list_frag}" href="##{n.here_frag}">#{n.title.to_s.to_inline_html}</a></li>}
523
+ %{<li><a id="#{n.list_frag}" href="##{n.here_frag}">#{n.title.to_s.to_inline_xhtml}</a></li>}
470
524
  end
471
525
 
472
526
  label = type.capitalize << 's' # TODO: pluralize this properly
@@ -475,76 +529,56 @@ output: |
475
529
  %{<h2 id="#{label}" class="title"><a class="here" href="##{label}">#{label}</a></h2> <ol>#{nested}</ol>}
476
530
  end
477
531
  %>
532
+ <?xml version="1.0" encoding="utf-8"?>
478
533
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
479
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
534
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
535
+ <% ICONS.each do |icon| %>
536
+ <!ENTITY <%= icon.entity_name %> "<%= icon.data_uri %>">
537
+ <% end %>
538
+ ]>
480
539
  <html xmlns="http://www.w3.org/1999/xhtml">
481
540
  <head>
482
541
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
483
542
  <meta name="date" content="<%= $date %>"/>
484
543
  <meta name="author" content="<%= $authors.keys.join(', ') %>"/>
485
544
  <meta name="generator" content="<%= ERBook::DISPLAY %>"/>
486
- <% $feeds.each_pair do |here_frag, fmt| %>
487
- <link rel="alternate" type="application/<%= fmt %>+xml" href="<%= here_frag %>"/>
488
- <% end if $feeds %>
489
- <title><%= $title.to_s.to_inline_html %></title>
490
-
491
- <% if $use_icons %>
492
- <style type="text/css" media="screen">
493
- blockquote {
494
- background-image : <%= ICONS['quote'].css_image %>;
495
- background-repeat : no-repeat;
496
- padding-left : 65px;
497
- min-height : 40px;
498
- margin-left : 0;
499
- }
500
- </style>
501
- <% end %>
545
+ <title><%= $title.to_s.to_inline_xhtml %></title>
502
546
 
503
- <% if defined? $icons_used and not $icons_used.empty? %>
504
- <style type="text/css" media="screen">
505
- <% $icons_used.each do |icon| %>
506
- .<%= icon.css_class %> {
507
- background-image: <%= icon.css_image %>;
508
- background-repeat: no-repeat;
509
- padding-left: 4em;
510
- }
511
- <% end %>
512
- </style>
547
+ <% if $feeds %>
548
+ <% $feeds.each_pair do |url, fmt| %>
549
+ <link rel="alternate" type="application/<%= fmt %>+xml" href="<%= url %>"/>
550
+ <% end %>
551
+ <% end %>
513
552
 
514
- <style type="text/css" media="print">
515
- <% $icons_used.each do |icon| %>
516
- .<%= icon.css_class %> {
517
- <%
518
- # we use list-style-image instead of
519
- # background-image because the latter is
520
- # neither printable nor shown in print
521
- # preview by default in most browsers
522
- #
523
- # see http://www.web-graphics.com/mtarchive/001703.php
524
- %>
525
- display: list-item;
526
- list-style-image: <%= icon.css_image %>;
527
- list-style-position: inside;
528
- }
529
-
530
- .<%= icon.css_class %> li {
531
- list-style-image: none;
532
- }
533
- <% end %>
553
+ <% @spec['styles'].each_pair do |media, style| %>
554
+ <style type="text/css" media="<%= media %>">
555
+ <![CDATA[<%= style %>]]>
534
556
  </style>
535
557
  <% end %>
536
558
 
537
- <%
538
- styles = @spec['styles']
539
- (styles.keys - %w[common]).each do |media|
540
- %>
541
- <style type="text/css" media="<%= media %>">
542
- <!--
543
- <%= styles['common'] %>
544
- <%= styles[media] %>
545
- -->
559
+ <style type="text/css" media="screen">
560
+ <![CDATA[
561
+ /* decorate external hyperlinks with a visual indicator */
562
+ a:not([href^="#"])
563
+ {
564
+ color : #3366BB;
565
+ background : <%= ICON_BY_NAME['link'].data_css %>;
566
+ background-position : center right;
567
+ background-repeat : no-repeat;
568
+ padding-right : 13px;
569
+ }
570
+
571
+ /* display icon for blockquote elements */
572
+ blockquote
573
+ {
574
+ background-image : <%= ICON_BY_NAME['quote'].data_css %>;
575
+ background-repeat : no-repeat;
576
+ margin-left : 0;
577
+ padding-left : 65px;
578
+ min-height : 50px;
579
+ }
580
+ ]]>
546
581
  </style>
547
- <% end %>
548
582
  </head>
549
583
  <body>
550
584
  <%
@@ -578,11 +612,11 @@ output: |
578
612
  <%= header.output %>
579
613
  <% else %>
580
614
  <%= $logo if defined? $logo %>
581
- <h1 class="title"><%= $title.to_s.to_inline_html %></h1>
615
+ <h1 class="title"><%= $title.to_s.to_inline_xhtml %></h1>
582
616
  <h2 class="authors"><%=
583
- $authors.map do |(name, here_frag)|
584
- if here_frag
585
- %{<a href="#{here_frag}">#{name}</a>}
617
+ $authors.map do |(name, url)|
618
+ if url
619
+ %{<a href="#{url}">#{name}</a>}
586
620
  else
587
621
  name
588
622
  end
@@ -628,7 +662,7 @@ output: |
628
662
  <h1 class="title" id="References"><a class="here" href="#References">References</a></h1>
629
663
  <ol>
630
664
  <% references.each do |n| %>
631
- <li id="<%= n.here_frag %>"><%= n.content_html %></li>
665
+ <li id="<%= n.here_frag %>"><%= n.content_xhtml %></li>
632
666
  <% end %>
633
667
  </ol>
634
668
  </div>
@@ -642,16 +676,32 @@ output: |
642
676
  <div id="footer">
643
677
  <%= node = @types['footer_inside_above'].first and node.output %>
644
678
  <% if footer = @types['footer'].first %>
645
- <%= footer.content.to_s.to_html %>
679
+ <%= footer.content.to_s.to_xhtml %>
646
680
  <% else %>
647
681
  Generated by <a href="<%= ERBook::WEBSITE %>"><%= ERBook::DISPLAY %></a> on <%= Time.now %>.
648
682
  <% end %>
649
683
 
650
- <% if $icons_used %>
651
- <div id="footer-credits">
652
- The icons used in this document are &copy; 2005 <a href="http://tango.freedesktop.org">Tango Desktop Project</a>. They are part of the <a href="http://tango.freedesktop.org/Tango_Icon_Library">Tango Icon Theme</a> set, which is distributed under the <a href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons Attribution-ShareAlike 2.5 License Agreement</a>.
653
- </div>
654
- <% end %>
684
+ <div id="footer-credits">
685
+ <p>
686
+ <% ICONS.select {|i| i.origin == 'tango' }.each do |icon| %>
687
+ <%= icon.to_xhtml %>
688
+ <% end %>
689
+
690
+ <br/>
691
+
692
+ The icons shown above are &copy; 2005 <a href="http://tango.freedesktop.org">Tango Desktop Project</a>. They are part of the <a href="http://tango.freedesktop.org/Tango_Icon_Library">Tango Icon Theme</a> set, which is distributed under the <a href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons Attribution-ShareAlike 2.5 License Agreement</a>.
693
+ </p>
694
+
695
+ <p>
696
+ <% ICONS.select {|i| i.origin == 'mediawiki' }.each do |icon| %>
697
+ <%= icon.to_xhtml %>
698
+ <% end %>
699
+
700
+ <br/>
701
+
702
+ The icons shown above are &copy; 2007 <a href="https://www.ohloh.net/projects/mediawiki/contributors">MediaWiki contributors</a>. They are part of the <a href="http://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a> software, which is distributed under the <a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2</a>.
703
+ </p>
704
+ </div>
655
705
  <%= node = @types['footer_inside_below'].first and node.output %>
656
706
  </div>
657
707
  <%= node = @types['footer_outside_below'].first and node.output %>
@@ -659,7 +709,7 @@ output: |
659
709
  </html>
660
710
 
661
711
  styles:
662
- common: |
712
+ all: |
663
713
  body
664
714
  {
665
715
  color : #000000;
@@ -672,8 +722,8 @@ styles:
672
722
 
673
723
  blockquote
674
724
  {
675
- font-family : Georgia, serif;
676
- color : #444;
725
+ color : #333;
726
+ font-style : italic;
677
727
  }
678
728
 
679
729
  em
@@ -890,7 +940,7 @@ styles:
890
940
 
891
941
  #footer-credits
892
942
  {
893
- margin-top : 1em;
943
+ margin-top : 2em;
894
944
  margin-bottom : 2em;
895
945
  }
896
946
 
@@ -964,21 +1014,35 @@ styles:
964
1014
  margin : 3em;
965
1015
  }
966
1016
 
967
- .tip > .icon,
968
- .note > .icon,
969
- .caution > .icon,
970
- .warning > .icon,
971
- .important > .icon
1017
+ .tip > .content,
1018
+ .note > .content,
1019
+ .caution > .content,
1020
+ .warning > .content,
1021
+ .important > .content,
1022
+ .figure > .content,
1023
+ .table > .content,
1024
+ .example > .content,
1025
+ .equation > .content,
1026
+ .procedure > .content
1027
+ {
1028
+ min-height : 48px; /* 48px is height of icon */
1029
+ }
1030
+
1031
+ .tip > .content > .icon,
1032
+ .note > .content > .icon,
1033
+ .caution > .content > .icon,
1034
+ .warning > .content > .icon,
1035
+ .important > .content > .icon
972
1036
  {
973
1037
  float : left;
974
1038
  margin : 0 1em 1em 0; /* top right bottom left */
975
1039
  }
976
1040
 
977
- .tip .icon,
978
- .note .icon,
979
- .caution .icon,
980
- .warning .icon,
981
- .important .icon
1041
+ .tip .content .icon,
1042
+ .note .content .icon,
1043
+ .caution .content .icon,
1044
+ .warning .content .icon,
1045
+ .important .content .icon
982
1046
  {
983
1047
  _display : none; /* IE6 cannot display embedded images */
984
1048
  }
@@ -1008,9 +1072,9 @@ styles:
1008
1072
  screen: |
1009
1073
  body
1010
1074
  {
1011
- margin : auto;
1012
- max-width : 36em;
1013
- padding : 0.5em;
1075
+ margin : auto;
1076
+ max-width : 36em;
1077
+ padding : 0.5em;
1014
1078
  }
1015
1079
 
1016
1080
  /* source code */
@@ -1051,18 +1115,12 @@ styles:
1051
1115
 
1052
1116
  a:link
1053
1117
  {
1054
- color : #0000FF;
1118
+ color : #002BB8;
1055
1119
  }
1056
1120
 
1057
1121
  a:visited
1058
1122
  {
1059
- color : #C71585;
1060
- }
1061
-
1062
- /* external hyperlinks */
1063
- a:not([href^="#"]):before
1064
- {
1065
- content : "\2660"; /* &spades; */
1123
+ color : #5A3696;
1066
1124
  }
1067
1125
 
1068
1126
  a.here,