asciidoctor 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +10 -0
  3. data/Guardfile +18 -0
  4. data/LICENSE +1 -1
  5. data/README.adoc +65 -21
  6. data/Rakefile +10 -0
  7. data/asciidoctor.gemspec +17 -35
  8. data/compat/asciidoc.conf +130 -13
  9. data/lib/asciidoctor.rb +107 -87
  10. data/lib/asciidoctor/abstract_block.rb +6 -2
  11. data/lib/asciidoctor/abstract_node.rb +21 -13
  12. data/lib/asciidoctor/attribute_list.rb +2 -5
  13. data/{stylesheets/asciidoctor.css → lib/asciidoctor/backends/_stylesheets.rb} +96 -46
  14. data/lib/asciidoctor/backends/base_template.rb +9 -4
  15. data/lib/asciidoctor/backends/docbook45.rb +246 -138
  16. data/lib/asciidoctor/backends/html5.rb +580 -381
  17. data/lib/asciidoctor/block.rb +2 -50
  18. data/lib/asciidoctor/cli/options.rb +9 -8
  19. data/lib/asciidoctor/document.rb +35 -45
  20. data/lib/asciidoctor/helpers.rb +10 -0
  21. data/lib/asciidoctor/lexer.rb +456 -148
  22. data/lib/asciidoctor/list_item.rb +0 -21
  23. data/lib/asciidoctor/path_resolver.rb +18 -12
  24. data/lib/asciidoctor/reader.rb +71 -26
  25. data/lib/asciidoctor/renderer.rb +2 -19
  26. data/lib/asciidoctor/section.rb +0 -1
  27. data/lib/asciidoctor/substituters.rb +150 -36
  28. data/lib/asciidoctor/table.rb +30 -24
  29. data/lib/asciidoctor/version.rb +1 -1
  30. data/man/asciidoctor.1 +22 -16
  31. data/man/asciidoctor.ad +24 -16
  32. data/test/attributes_test.rb +50 -0
  33. data/test/blocks_test.rb +660 -9
  34. data/test/document_test.rb +191 -14
  35. data/test/fixtures/encoding.asciidoc +8 -0
  36. data/test/invoker_test.rb +47 -0
  37. data/test/lexer_test.rb +172 -0
  38. data/test/links_test.rb +28 -0
  39. data/test/lists_test.rb +172 -13
  40. data/test/options_test.rb +29 -2
  41. data/test/paragraphs_test.rb +105 -47
  42. data/test/paths_test.rb +3 -3
  43. data/test/reader_test.rb +46 -0
  44. data/test/sections_test.rb +365 -12
  45. data/test/substitutions_test.rb +127 -11
  46. data/test/tables_test.rb +81 -14
  47. data/test/test_helper.rb +18 -7
  48. data/test/text_test.rb +17 -5
  49. metadata +9 -36
@@ -45,9 +45,6 @@ class AttributeList
45
45
  # TODO named attributes cannot contain dash characters
46
46
  NAME_PATTERN = /[A-Za-z:_][A-Za-z:_\-\.]*/
47
47
 
48
- # Public: A regular expression for splitting a comma-separated string
49
- CSV_SPLIT_PATTERN = /[ \t]*,[ \t]*/
50
-
51
48
  def initialize(source, block = nil, quotes = ['\'', '"'], delimiter = ',', escape_char = '\\')
52
49
  @scanner = ::StringScanner.new source
53
50
  @block = block
@@ -170,8 +167,8 @@ class AttributeList
170
167
  # opts is an alias for options
171
168
  if name == 'options' || name == 'opts'
172
169
  name = 'options'
173
- resolved_value.split(CSV_SPLIT_PATTERN).each do |o|
174
- @attributes[o + '-option'] = ''
170
+ resolved_value.split(',').each do |o|
171
+ @attributes[o.strip + '-option'] = ''
175
172
  end
176
173
  elsif single_quoted_value && !@block.nil?
177
174
  resolved_value = @block.apply_normal_subs(value)
@@ -1,3 +1,18 @@
1
+ module Asciidoctor
2
+ module HTML5
3
+ # Internal: Generate the default stylesheet for CodeRay
4
+ #
5
+ # returns the default CodeRay stylesheet as a String
6
+ def self.default_coderay_stylesheet
7
+ ::Asciidoctor::Helpers.require_library 'coderay'
8
+ ::CodeRay::Encoders[:html]::CSS.new(:default).stylesheet
9
+ end
10
+
11
+ # Internal: Generate the default stylesheet for Asciidoctor
12
+ #
13
+ # returns the default Asciidoctor stylesheet as a String
14
+ def self.default_asciidoctor_stylesheet
15
+ <<'DEFAULT_ASCIIDOCTOR_STYLESHEET'
1
16
  /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
2
17
  article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
3
18
  audio, canvas, video { display: inline-block; }
@@ -55,7 +70,7 @@ img { -ms-interpolation-mode: bicubic; }
55
70
  img { display: inline-block; }
56
71
  textarea { height: auto; min-height: 50px; }
57
72
  select { width: 100%; }
58
- p.lead, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
73
+ p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
59
74
  .subheader, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .ulist > .title, .olist > .title, .dlist > .title, .qlist > .title, .tableblock > caption { line-height: 1.4; color: #7a2518; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }
60
75
  div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }
61
76
  a { color: #005498; text-decoration: underline; line-height: inherit; }
@@ -63,7 +78,7 @@ a:hover, a:focus { color: #00467f; }
63
78
  a img { border: none; }
64
79
  p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
65
80
  p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
66
- h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Lucida Grande", Georgia, Verdana, "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; color: #ba3925; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.2125em; }
81
+ h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Georgia, "URW Bookman L", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; color: #ba3925; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.2125em; }
67
82
  h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #e99b8f; line-height: 0; }
68
83
  h1 { font-size: 2.125em; }
69
84
  h2 { font-size: 1.6875em; }
@@ -128,6 +143,11 @@ table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; }
128
143
  table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.6; }
129
144
  pre > code, pre > tt { color: #222222; }
130
145
  tt { font-size: 0.9375em; padding: 1px 3px 0; white-space: nowrap; background-color: #f2f2f2; border: 1px solid #cccccc; -webkit-border-radius: 4px; border-radius: 4px; text-shadow: none; }
146
+ kbd.keyseq { color: #555555; }
147
+ kbd:not(.keyseq) { display: inline-block; color: #222222; font-size: 0.75em; line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }
148
+ kbd kbd:first-child { margin-left: 0; }
149
+ kbd kbd:last-child { margin-right: 0; }
150
+ .menuseq, .menu { color: #090909; }
131
151
  p a > tt { text-decoration: underline; }
132
152
  p a > tt:hover { color: #561309; }
133
153
  #header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
@@ -142,12 +162,25 @@ p a > tt:hover { color: #561309; }
142
162
  #header br + span:before { content: "\2013 \0020"; }
143
163
  #toc { border-bottom: 3px double #ebebeb; padding-bottom: 1.25em; }
144
164
  #toc > ol { margin-left: 0.25em; }
165
+ #toc ol.sectlevel0 > li > a { font-style: italic; }
166
+ #toc ol.sectlevel0 ol.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
145
167
  #toc ol { list-style-type: none; }
146
168
  #toctitle { color: #7a2518; }
169
+ @media only screen and (min-width: 80em) { body.toc2 { padding-left: 20em; }
170
+ #toc.toc2 { position: fixed; width: 20em; left: 0; top: 0; border-right: 1px solid #ebebeb; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; overflow: auto; }
171
+ #toc.toc2 #toctitle { margin-top: 0; }
172
+ #toc.toc2 > ol { font-size: .95em; }
173
+ #toc.toc2 ol ol { margin-left: 0; padding-left: 1em; }
174
+ #toc.toc2 ol.sectlevel0 ol.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } }
147
175
  #footer { max-width: 100%; background-color: #222222; padding: 1.25em; }
148
176
  #footer-text { color: #dddddd; line-height: 1.44; }
149
177
  .sect1 { border-bottom: 3px double #ebebeb; padding-bottom: 1.25em; }
150
178
  .sect1:last-of-type { border-bottom: 0; }
179
+ #content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; text-decoration: none; visibility: hidden; text-align: center; font-weight: normal; }
180
+ #content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; display: block; margin-top: 0.05em; }
181
+ #content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
182
+ #content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #ba3925; text-decoration: none; }
183
+ #content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #a53221; }
151
184
  .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .ulist > .title, .olist > .title, .dlist > .title, .qlist > .title { text-align: left; font-weight: bold; }
152
185
  .tableblock > caption { text-align: left; font-weight: bold; white-space: nowrap; overflow: visible; max-width: 0; }
153
186
  table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; }
@@ -163,7 +196,7 @@ table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-si
163
196
  .exampleblock > .content > :last-child { margin-bottom: 0; }
164
197
  .exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
165
198
  .exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; }
166
- .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child { margin-bottom: 0; }
199
+ .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }
167
200
  .exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; box-shadow: 0 1px 8px #d9d9d9; }
168
201
  .imageblock { margin-bottom: 1.25em; }
169
202
  .sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; -webkit-border-radius: 4px; border-radius: 4px; }
@@ -174,6 +207,8 @@ table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-si
174
207
  .sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; }
175
208
  .sidebarblock > .content > .title { color: #7a2518; margin-top: 0; line-height: 1.6; }
176
209
  .sidebarblock > .content > .paragraph:last-child p { margin-bottom: 0; }
210
+ pre { color: inherit; font-family: Consolas, "Liberation Mono", Courier, monospace; overflow-x: auto; line-height: 1.6; }
211
+ .verseblock { margin-bottom: 1.25em; }
177
212
  .literalblock, .listingblock { margin-bottom: 1.25em; }
178
213
  .literalblock > .content > pre, .listingblock > .content > pre { background: none; color: inherit; font-family: Consolas, "Liberation Mono", Courier, monospace; border-width: 1px 0; border-style: dotted; border-color: #bfbfbf; -webkit-border-radius: 4px; border-radius: 4px; padding: 0.75em 0.75em 0.5em 0.75em; white-space: pre; overflow-x: auto; line-height: 1.6; }
179
214
  .literalblock > .content > pre > code, .literalblock > .content > pre > tt, .listingblock > .content > pre > code, .listingblock > .content > pre > tt { color: inherit; font-family: Consolas, "Liberation Mono", Courier, monospace; padding: 0; background: none; font-weight: normal; }
@@ -185,12 +220,13 @@ table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-si
185
220
  .listingblock:hover .ruby:before { content: "ruby"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
186
221
  .listingblock:hover .asciidoc:before { content: "asciidoc"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
187
222
  .listingblock:hover .java:before { content: "java"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
223
+ .listingblock:hover .javascript:before { content: "javascript"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
188
224
  .listingblock:hover .css:before { content: "css"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
189
225
  .listingblock:hover .scss:before { content: "scss"; text-transform: uppercase; float: right; font-size: 0.9em; color: #999; }
190
226
  .quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
191
- .quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0; border: 0; }
227
+ .quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; border: 0; }
192
228
  .quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
193
- .quoteblock .attribution { padding-bottom: 0.5625em; font-size: inherit; color: #555555; }
229
+ .quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; font-size: inherit; color: #555555; }
194
230
  .quoteblock .attribution br { display: none; }
195
231
  .quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }
196
232
  table thead th, table tfoot th { font-weight: bold; }
@@ -222,53 +258,67 @@ ol.upperroman { list-style-type: upper-roman; }
222
258
  .literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
223
259
  .colist > table tr > td:first-of-type { padding: 0 .8em; line-height: 1; }
224
260
  .colist > table tr > td:last-of-type { padding: 0.25em 0; }
225
- td.hdlist1 { vertical-align: top; padding-right: .8em; }
261
+ td.hdlist1 { vertical-align: top; padding-right: .8em; font-weight: bold; }
226
262
  .qanda > ol > li > p:first-child { color: #00467f; }
227
263
  span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
228
264
  span.footnote a, span.footnoteref a { text-decoration: none; }
229
- #footnotes { padding: 0.75em 0.375em; margin-bottom: 1.25em; border-top: 1px solid #dddddd; }
230
- #footnotes hr { display: none; }
265
+ #footnotes { padding: 0.75em 0.375em; margin-bottom: 1.25em; #border-top: 1px solid #dddddd; }
266
+ #footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; }
231
267
  #footnotes .footnote { line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
232
268
  #footnotes .footnote a { font-weight: bold; text-decoration: none; }
233
269
  #footnotes .footnote:last-of-type { margin-bottom: 0; }
234
270
  .gist .file-data > table { border: none; background: #fff; width: 100%; margin-bottom: 0; }
235
271
  .gist .file-data > table td.line-data { width: 99%; }
236
- .unbreakable { page-break-inside: avoid; }
237
- span.big { font-size: larger; }
238
- span.small { font-size: smaller; }
239
- span.underline { text-decoration: underline; }
240
- span.overline { text-decoration: overline; }
241
- span.line-through { text-decoration: line-through; }
242
- span.aqua { color: #00bfbf; }
243
- span.aqua-background { background-color: #00fafa; }
244
- span.black { color: black; }
245
- span.black-background { background-color: black; }
246
- span.blue { color: #0000bf; }
247
- span.blue-background { background-color: #0000fa; }
248
- span.fuchsia { color: #bf00bf; }
249
- span.fuchsia-background { background-color: #fa00fa; }
250
- span.gray { color: #606060; }
251
- span.gray-background { background-color: #7d7d7d; }
252
- span.green { color: #006000; }
253
- span.green-background { background-color: #007d00; }
254
- span.lime { color: #00bf00; }
255
- span.lime-background { background-color: #00fa00; }
256
- span.maroon { color: #600000; }
257
- span.maroon-background { background-color: #7d0000; }
258
- span.navy { color: #000060; }
259
- span.navy-background { background-color: #00007d; }
260
- span.olive { color: #606000; }
261
- span.olive-background { background-color: #7d7d00; }
262
- span.purple { color: #600060; }
263
- span.purple-background { background-color: #7d007d; }
264
- span.red { color: #bf0000; }
265
- span.red-background { background-color: #fa0000; }
266
- span.silver { color: #909090; }
267
- span.silver-background { background-color: #bcbcbc; }
268
- span.teal { color: #006060; }
269
- span.teal-background { background-color: #007d7d; }
270
- span.white { color: #bfbfbf; }
271
- span.white-background { background-color: #fafafa; }
272
- span.yellow { color: #bfbf00; }
273
- span.yellow-background { background-color: #fafa00; }
272
+ div.unbreakable { page-break-inside: avoid; }
273
+ .big { font-size: larger; }
274
+ .small { font-size: smaller; }
275
+ .underline { text-decoration: underline; }
276
+ .overline { text-decoration: overline; }
277
+ .line-through { text-decoration: line-through; }
278
+ .aqua { color: #00bfbf; }
279
+ .aqua-background { background-color: #00fafa; }
280
+ .black { color: black; }
281
+ .black-background { background-color: black; }
282
+ .blue { color: #0000bf; }
283
+ .blue-background { background-color: #0000fa; }
284
+ .fuchsia { color: #bf00bf; }
285
+ .fuchsia-background { background-color: #fa00fa; }
286
+ .gray { color: #606060; }
287
+ .gray-background { background-color: #7d7d7d; }
288
+ .green { color: #006000; }
289
+ .green-background { background-color: #007d00; }
290
+ .lime { color: #00bf00; }
291
+ .lime-background { background-color: #00fa00; }
292
+ .maroon { color: #600000; }
293
+ .maroon-background { background-color: #7d0000; }
294
+ .navy { color: #000060; }
295
+ .navy-background { background-color: #00007d; }
296
+ .olive { color: #606000; }
297
+ .olive-background { background-color: #7d7d00; }
298
+ .purple { color: #600060; }
299
+ .purple-background { background-color: #7d007d; }
300
+ .red { color: #bf0000; }
301
+ .red-background { background-color: #fa0000; }
302
+ .silver { color: #909090; }
303
+ .silver-background { background-color: #bcbcbc; }
304
+ .teal { color: #006060; }
305
+ .teal-background { background-color: #007d7d; }
306
+ .white { color: #bfbfbf; }
307
+ .white-background { background-color: #fafafa; }
308
+ .yellow { color: #bfbf00; }
309
+ .yellow-background { background-color: #fafa00; }
310
+ .admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
311
+ .admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #005498; color: #003f72; }
312
+ .admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
313
+ .admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
314
+ .admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
315
+ .admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }
316
+ .conum { display: inline-block; color: white !important; background-color: #222222; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 20px; font-family: Arial, sans-serif; font-style: normal; position: relative; top: -2px; letter-spacing: -1px; }
317
+ .conum * { color: white !important; }
318
+ .conum:empty { display: none; }
319
+ pre .comment .conum { left: -20px; }
274
320
  .literalblock > .content > pre, .listingblock > .content > pre { -webkit-border-radius: 0; border-radius: 0; }
321
+ DEFAULT_ASCIIDOCTOR_STYLESHEET
322
+ end
323
+ end
324
+ end
@@ -65,7 +65,7 @@ class BaseTemplate
65
65
  # returns the text with blank lines removed and HTML line feed entities
66
66
  # converted to an endline character.
67
67
  def compact(str)
68
- str.gsub(BLANK_LINES_PATTERN, '').gsub(LINE_FEED_ENTITY, "\n")
68
+ str.gsub(BLANK_LINE_PATTERN, '').gsub(LINE_FEED_ENTITY, "\n")
69
69
  end
70
70
 
71
71
  # Public: Preserve endlines by replacing them with the HTML line feed entity.
@@ -96,10 +96,15 @@ class BaseTemplate
96
96
  end
97
97
 
98
98
  # create template matter to insert a style class if the variable has a value
99
- def attrvalue(key, sibling = true)
99
+ def attrvalue(key, sibling = true, inherit = true)
100
100
  delimiter = sibling ? ' ' : ''
101
- # example: <% if attr? 'foo' %><%= attr 'foo' %><% end %>
102
- %(<% if attr? '#{key}' %>#{delimiter}<%= attr '#{key}' %><% end %>)
101
+ if inherit
102
+ # example: <% if attr? 'foo' %><%= attr 'foo' %><% end %>
103
+ %(<% if attr? '#{key}' %>#{delimiter}<%= attr '#{key}' %><% end %>)
104
+ else
105
+ # example: <% if attr? 'foo', nil, false %><%= attr 'foo', nil, false %><% end %>
106
+ %(<% if attr? '#{key}', nil, false %>#{delimiter}<%= attr '#{key}', nil, false %><% end %>)
107
+ end
103
108
  end
104
109
 
105
110
  # create template matter to insert an id if one is specified for the block
@@ -15,9 +15,9 @@ module Asciidoctor
15
15
 
16
16
  def title_tag(optional = true)
17
17
  if optional
18
- %q{<%= title? ? "<title>#{title}</title>" : '' %>}
18
+ %(<%= title? ? "\n<title>\#{title}</title>" : nil %>)
19
19
  else
20
- %q{<title><%= title %></title>}
20
+ %(\n<title><%= title %></title>)
21
21
  end
22
22
  end
23
23
 
@@ -26,7 +26,15 @@ module Asciidoctor
26
26
  end
27
27
 
28
28
  def common_attrs_erb
29
- %q{<%= template.common_attrs(@id, (attr 'role'), (attr 'reftext')) %>}
29
+ %q(<%= template.common_attrs(@id, (attr 'role'), (attr 'reftext')) %>)
30
+ end
31
+
32
+ def content(node)
33
+ node.blocks? ? node.content.chomp : "<simpara>#{node.content.chomp}</simpara>"
34
+ end
35
+
36
+ def content_erb
37
+ %q(<%= blocks? ? content.chomp : "<simpara>#{content.chomp}</simpara>" %>)
30
38
  end
31
39
  end
32
40
 
@@ -54,7 +62,7 @@ class DocumentTemplate < BaseTemplate
54
62
  <% end %>
55
63
  <% if has_header? %>
56
64
  <% if attr? :author %>
57
- <% if attr? :authorcount, 1 %>
65
+ <% if (attr :authorcount).to_i < 2 %>
58
66
  <author>
59
67
  #{tag 'firstname', :firstname}
60
68
  #{tag 'othername', :middlename}
@@ -64,7 +72,7 @@ class DocumentTemplate < BaseTemplate
64
72
  #{tag 'authorinitials', :authorinitials}
65
73
  <% else %>
66
74
  <authorgroup>
67
- <% (1..(attr(:authorcount))).each do |idx| %>
75
+ <% (1..((attr :authorcount).to_i)).each do |idx| %>
68
76
  <author>
69
77
  #{tag 'firstname', :"firstname_\#{idx}", true}
70
78
  #{tag 'othername', :"middlename_\#{idx}", true}
@@ -102,14 +110,14 @@ class DocumentTemplate < BaseTemplate
102
110
  <bookinfo>
103
111
  #{docinfo}
104
112
  </bookinfo>
105
- <%= content %>
113
+ <%= content.chomp %>
106
114
  </book>
107
115
  <% else %>
108
116
  <article<% unless attr? :nolang %> lang="<%= attr :lang, 'en' %>"<% end %>>
109
117
  <articleinfo>
110
118
  #{docinfo}
111
119
  </articleinfo>
112
- <%= content %>
120
+ <%= content.chomp %>
113
121
  </article>
114
122
  <% end %>
115
123
  EOF
@@ -135,14 +143,13 @@ end
135
143
  class BlockPreambleTemplate < BaseTemplate
136
144
  def template
137
145
  @template ||= @eruby.new <<-EOF
138
- <%#encoding:UTF-8%><% if @document.doctype == 'book' %>
139
- <preface#{common_attrs_erb}>
140
- #{title_tag false}
141
- <%= content %>
142
- </preface>
143
- <% else %>
144
- <%= content %>
145
- <% end %>
146
+ <%#encoding:UTF-8%><%
147
+ if @document.doctype == 'book' %><preface#{common_attrs_erb}>#{title_tag false}
148
+ <%= content.chomp %>
149
+ </preface><%
150
+ else %>
151
+ <%= content.chomp %><%
152
+ end %>
146
153
  EOF
147
154
  end
148
155
  end
@@ -155,9 +162,9 @@ class SectionTemplate < BaseTemplate
155
162
  tag = sec.document.doctype == 'book' && sec.level <= 1 ? (sec.level == 0 ? 'part' : 'chapter') : 'section'
156
163
  end
157
164
  %(<#{tag}#{common_attrs(sec.id, (sec.attr 'role'), (sec.attr 'reftext'))}>
158
- #{sec.title? ? "<title>#{sec.title}</title>" : nil}
159
- #{sec.content}
160
- </#{tag}>)
165
+ #{sec.title? ? "<title>#{sec.title}</title>" : nil}
166
+ #{sec.content.chomp}
167
+ </#{tag}>\n)
161
168
  end
162
169
 
163
170
  def template
@@ -175,32 +182,18 @@ end
175
182
 
176
183
  class BlockParagraphTemplate < BaseTemplate
177
184
  def paragraph(id, style, role, reftext, title, content)
178
- # FIXME temporary hack until I can generalize this feature
179
- if style == 'partintro'
180
- if title
181
- %(<partintro#{common_attrs(id, role, reftext)}>
182
- <title>#{title}</title>
183
- <simpara>#{content}</simpara>
184
- </partintro>)
185
- else
186
- %(<partintro#{common_attrs(id, role, reftext)}>
187
- <simpara>#{content}</simpara>
188
- </partintro>)
189
- end
185
+ if !title.nil?
186
+ %(<formalpara#{common_attrs(id, role, reftext)}>
187
+ <title>#{title}</title>
188
+ <para>#{content}</para>
189
+ </formalpara>\n)
190
190
  else
191
- if title
192
- %(<formalpara#{common_attrs(id, role, reftext)}>
193
- <title>#{title}</title>
194
- <para>#{content}</para>
195
- </formalpara>)
196
- else
197
- %(<simpara#{common_attrs(id, role, reftext)}>#{content}</simpara>)
198
- end
191
+ %(<simpara#{common_attrs(id, role, reftext)}>#{content}</simpara>\n)
199
192
  end
200
193
  end
201
194
 
202
195
  def result(node)
203
- paragraph(node.id, node.attr('style'), node.attr('role'), node.attr('reftext'), (node.title? ? node.title : nil), node.content)
196
+ paragraph(node.id, (node.attr 'style', nil, false), (node.attr 'role'), (node.attr 'reftext'), (node.title? ? node.title : nil), node.content)
204
197
  end
205
198
 
206
199
  def template
@@ -211,13 +204,8 @@ end
211
204
  class BlockAdmonitionTemplate < BaseTemplate
212
205
  def template
213
206
  @template ||= @eruby.new <<-EOF
214
- <%#encoding:UTF-8%><<%= attr :name %>#{common_attrs_erb}>
215
- #{title_tag}
216
- <% if blocks? %>
217
- <%= content %>
218
- <% else %>
219
- <simpara><%= content.chomp %></simpara>
220
- <% end %>
207
+ <%#encoding:UTF-8%><<%= attr :name %>#{common_attrs_erb}>#{title_tag}
208
+ #{content_erb}
221
209
  </<%= attr :name %>>
222
210
  EOF
223
211
  end
@@ -227,8 +215,7 @@ class BlockUlistTemplate < BaseTemplate
227
215
  def template
228
216
  @template ||= @eruby.new <<-EOF
229
217
  <%#encoding:UTF-8%><% if attr? :style, 'bibliography' %>
230
- <bibliodiv#{common_attrs_erb}>
231
- #{title_tag}
218
+ <bibliodiv#{common_attrs_erb}>#{title_tag}
232
219
  <% content.each do |li| %>
233
220
  <bibliomixed>
234
221
  <bibliomisc><%= li.text %></bibliomisc>
@@ -239,8 +226,7 @@ class BlockUlistTemplate < BaseTemplate
239
226
  <% end %>
240
227
  </bibliodiv>
241
228
  <% else %>
242
- <itemizedlist#{common_attrs_erb}>
243
- #{title_tag}
229
+ <itemizedlist#{common_attrs_erb}>#{title_tag}
244
230
  <% content.each do |li| %>
245
231
  <listitem>
246
232
  <simpara><%= li.text %></simpara>
@@ -258,8 +244,7 @@ end
258
244
  class BlockOlistTemplate < BaseTemplate
259
245
  def template
260
246
  @template ||= @eruby.new <<-EOF
261
- <%#encoding:UTF-8%><orderedlist#{common_attrs_erb}#{attribute('numeration', :style)}>
262
- #{title_tag}
247
+ <%#encoding:UTF-8%><orderedlist#{common_attrs_erb}#{attribute('numeration', :style)}>#{title_tag}
263
248
  <% content.each do |li| %>
264
249
  <listitem>
265
250
  <simpara><%= li.text %></simpara>
@@ -276,8 +261,7 @@ end
276
261
  class BlockColistTemplate < BaseTemplate
277
262
  def template
278
263
  @template ||= @eruby.new <<-EOF
279
- <%#encoding:UTF-8%><calloutlist#{common_attrs_erb}>
280
- #{title_tag}
264
+ <%#encoding:UTF-8%><calloutlist#{common_attrs_erb}>#{title_tag}
281
265
  <% content.each do |li| %>
282
266
  <callout arearefs="<%= li.attr :coids %>">
283
267
  <para><%= li.text %></para>
@@ -315,67 +299,154 @@ class BlockDlistTemplate < BaseTemplate
315
299
  }
316
300
 
317
301
  def template
302
+ # TODO may want to refactor ListItem content to hold multiple terms
303
+ # that change would drastically simplify this template
318
304
  @template ||= @eruby.new <<-EOF
319
- <%#encoding:UTF-8%><% tags = (template.class::LIST_TAGS[attr :style] || template.class::LIST_TAGS['labeled']) %>
320
- <% if tags[:list] %><<%= tags[:list] %>#{common_attrs_erb}><% end %>
321
- #{title_tag}
322
- <% content.each do |dt, dd| %>
323
- <<%= tags[:entry] %>>
324
- <% if tags.has_key?(:label) %>
325
- <<%= tags[:label] %>>
326
- <<%= tags[:term] %>>
327
- <%= dt.text %>
328
- </<%= tags[:term] %>>
329
- </<%= tags[:label] %>>
330
- <% else %>
331
- <<%= tags[:term] %>>
332
- <%= dt.text %>
333
- </<%= tags[:term] %>>
334
- <% end %>
335
- <% unless dd.nil? %>
336
- <<%= tags[:item] %>>
337
- <% if dd.text? %>
338
- <simpara><%= dd.text %></simpara>
339
- <% end %>
340
- <% if dd.blocks? %>
341
- <%= dd.content %>
342
- <% end %>
343
- </<%= tags[:item] %>>
344
- <% end %>
345
- </<%= tags[:entry] %>>
346
- <% end %>
347
- <% if tags[:list] %></<%= tags[:list] %>><% end %>
305
+ <%#encoding:UTF-8%><%
306
+ continuing = false;
307
+ entries = content
308
+ last_index = entries.length - 1
309
+ if attr? :style, 'horizontal'
310
+ %><<%= (tag = title? ? 'table' : 'informaltable') %>#{common_attrs_erb} tabstyle="horizontal" frame="none" colsep="0" rowsep="0">#{title_tag}
311
+ <tgroup cols="2">
312
+ <colspec colwidth="<%= attr :labelwidth, 15 %>*"/>
313
+ <colspec colwidth="<%= attr :labelwidth, 85 %>*"/>
314
+ <tbody valign="top"><%
315
+ entries.each_with_index do |(dt, dd), index|
316
+ last = (index == last_index)
317
+ unless continuing %>
318
+ <row>
319
+ <entry><%
320
+ end %>
321
+ <simpara><%= dt.text %></simpara><%
322
+ if !last && dd.nil?
323
+ continuing = true
324
+ next
325
+ else
326
+ continuing = false
327
+ end %>
328
+ </entry>
329
+ <entry><%
330
+ unless dd.nil?
331
+ if dd.text? %>
332
+ <simpara><%= dd.text %></simpara><%
333
+ end
334
+ if dd.blocks? %>
335
+ <%= dd.content.chomp %><%
336
+ end
337
+ end %>
338
+ </entry><%
339
+ if last || !dd.nil? %>
340
+ </row><%
341
+ end %><%
342
+ end %>
343
+ </tbody>
344
+ </tgroup>
345
+ </<%= tag %>><%
346
+ else
347
+ tags = (template.class::LIST_TAGS[attr :style] || template.class::LIST_TAGS['labeled'])
348
+ if tags[:list]
349
+ %><<%= tags[:list] %>#{common_attrs_erb}>#{title_tag}<%
350
+ end
351
+ entries.each_with_index do |(dt, dd), index|
352
+ last = (index == last_index)
353
+ unless continuing %>
354
+ <<%= tags[:entry] %>><%
355
+ end
356
+ if tags.has_key?(:label)
357
+ unless continuing %>
358
+ <<%= tags[:label] %>><%
359
+ end %>
360
+ <<%= tags[:term] %>><%= dt.text %></<%= tags[:term] %>><%
361
+ if last || !dd.nil? %>
362
+ </<%= tags[:label] %>><%
363
+ end
364
+ else %>
365
+ <<%= tags[:term] %>><%= dt.text %></<%= tags[:term] %>><%
366
+ end
367
+ if !last && dd.nil?
368
+ continuing = true
369
+ next
370
+ else
371
+ continuing = false
372
+ end %>
373
+ <<%= tags[:item] %>><%
374
+ unless dd.nil?
375
+ if dd.text? %>
376
+ <simpara><%= dd.text %></simpara><%
377
+ end
378
+ if dd.blocks? %>
379
+ <%= dd.content %><%
380
+ end
381
+ end %>
382
+ </<%= tags[:item] %>>
383
+ </<%= tags[:entry] %>><%
384
+ end
385
+ if tags[:list] %>
386
+ </<%= tags[:list] %>><%
387
+ end
388
+ end %>
348
389
  EOF
349
390
  end
350
391
  end
351
392
 
352
393
  class BlockOpenTemplate < BaseTemplate
394
+ def result(node)
395
+ open_block(node, node.id, (node.attr 'style', nil, false),
396
+ (node.attr 'role'), (node.attr 'reftext'), node.title? ? node.title : nil)
397
+ end
398
+
399
+ def open_block(node, id, style, role, reftext, title)
400
+ case style
401
+ when 'abstract'
402
+ if node.parent == node.document && node.document.attr?('doctype', 'book')
403
+ puts 'asciidoctor: WARNING: abstract block cannot be used in a document without a title when doctype is book. Excluding block content.'
404
+ ''
405
+ else
406
+ %(<abstract>#{title && "\n<title>#{title}</title>"}
407
+ #{content node}
408
+ </abstract>\n)
409
+ end
410
+ when 'partintro'
411
+ unless node.document.attr?('doctype', 'book') && node.parent.is_a?(Asciidoctor::Section) && node.level == 0
412
+ puts 'asciidoctor: ERROR: partintro block can only be used when doctype is book and it\'s a child of a part section. Excluding block content.'
413
+ ''
414
+ else
415
+ %(<partintro#{common_attrs id, role, reftext}>#{title && "\n<title>#{title}</title>"}
416
+ #{content node}
417
+ </partintro>\n)
418
+ end
419
+ else
420
+ node.content
421
+ end
422
+ end
423
+
353
424
  def template
354
- :content
425
+ :invoke_result
355
426
  end
356
427
  end
357
428
 
358
429
  class BlockListingTemplate < BaseTemplate
359
430
  def template
360
431
  @template ||= @eruby.new <<-EOF
361
- <%#encoding:UTF-8%><% if !title? %>
362
- <% if attr? :style, 'source' %>
363
- <programlisting#{common_attrs_erb}#{attribute('language', :language)} linenumbering="<%= (attr? :linenums) ? 'numbered' : 'unnumbered' %>"><%= template.preserve_endlines(content, self) %></programlisting>
364
- <% else %>
365
- <screen#{common_attrs_erb}><%= template.preserve_endlines(content, self) %></screen>
366
- <% end %>
367
- <% else %>
368
- <formalpara#{common_attrs_erb}>
369
- #{title_tag false}
370
- <para>
371
- <% if attr :style, 'source' %>
372
- <programlisting language="<%= attr :language %>" linenumbering="<%= (attr? :linenums) ? 'numbered' : 'unnumbered' %>"><%= template.preserve_endlines(content, self) %></programlisting>
373
- <% else %>
374
- <screen><%= template.preserve_endlines(content, self) %></screen>
375
- <% end %>
376
- </para>
377
- </formalpara>
378
- <% end %>
432
+ <%#encoding:UTF-8%><%
433
+ if !title?
434
+ if (attr? 'style', 'source') && (attr? 'language')
435
+ %><programlisting#{common_attrs_erb}#{attribute('language', :language)} linenumbering="<%= (attr? :linenums) ? 'numbered' : 'unnumbered' %>"><%= template.preserve_endlines(content, self) %></programlisting><%
436
+ else
437
+ %><screen#{common_attrs_erb}><%= template.preserve_endlines(content, self) %></screen><%
438
+ end
439
+ else
440
+ %><formalpara#{common_attrs_erb}>#{title_tag false}
441
+ <para><%
442
+ if (attr? 'style', 'source') && (attr? 'language') %>
443
+ <programlisting language="<%= attr 'language' %>" linenumbering="<%= (attr? :linenums) ? 'numbered' : 'unnumbered' %>"><%= template.preserve_endlines(content, self) %></programlisting><%
444
+ else %>
445
+ <screen><%= template.preserve_endlines(content, self) %></screen><%
446
+ end %>
447
+ </para>
448
+ </formalpara><%
449
+ end %>
379
450
  EOF
380
451
  end
381
452
  end
@@ -386,8 +457,7 @@ class BlockLiteralTemplate < BaseTemplate
386
457
  <%#encoding:UTF-8%><% if !title? %>
387
458
  <literallayout#{common_attrs_erb} class="monospaced"><%= template.preserve_endlines(content, self) %></literallayout>
388
459
  <% else %>
389
- <formalpara#{common_attrs_erb}>
390
- #{title_tag false}
460
+ <formalpara#{common_attrs_erb}>#{title_tag false}
391
461
  <para>
392
462
  <literallayout class="monospaced"><%= template.preserve_endlines(content, self) %></literallayout>
393
463
  </para>
@@ -400,10 +470,9 @@ end
400
470
  class BlockExampleTemplate < BaseTemplate
401
471
  def template
402
472
  @template ||= @eruby.new <<-EOF
403
- <%#encoding:UTF-8%><example#{common_attrs_erb}>
404
- #{title_tag}
405
- <%= content %>
406
- </example>
473
+ <%#encoding:UTF-8%><<%= (tag_name = title? ? 'example' : 'informalexample') %>#{common_attrs_erb}>#{title_tag}
474
+ #{content_erb}
475
+ </<%= tag_name %>>
407
476
  EOF
408
477
  end
409
478
  end
@@ -411,9 +480,8 @@ end
411
480
  class BlockSidebarTemplate < BaseTemplate
412
481
  def template
413
482
  @template ||= @eruby.new <<-EOF
414
- <%#encoding:UTF-8%><sidebar#{common_attrs_erb}>
415
- #{title_tag}
416
- <%= content %>
483
+ <%#encoding:UTF-8%><sidebar#{common_attrs_erb}>#{title_tag}
484
+ #{content_erb}
417
485
  </sidebar>
418
486
  EOF
419
487
  end
@@ -422,21 +490,16 @@ end
422
490
  class BlockQuoteTemplate < BaseTemplate
423
491
  def template
424
492
  @template ||= @eruby.new <<-EOF
425
- <%#encoding:UTF-8%><blockquote#{common_attrs_erb}>
426
- #{title_tag}
493
+ <%#encoding:UTF-8%><blockquote#{common_attrs_erb}>#{title_tag}
427
494
  <% if (attr? :attribution) || (attr? :citetitle) %>
428
495
  <attribution>
429
496
  <% if attr? :attribution %>
430
- <%= attr(:attribution) %>
497
+ <%= (attr :attribution) %>
431
498
  <% end %>
432
499
  #{tag 'citetitle', :citetitle}
433
500
  </attribution>
434
501
  <% end %>
435
- <% if !@buffer.nil? %>
436
- <simpara><%= content %></simpara>
437
- <% else %>
438
- <%= content %>
439
- <% end %>
502
+ #{content_erb}
440
503
  </blockquote>
441
504
  EOF
442
505
  end
@@ -445,12 +508,11 @@ end
445
508
  class BlockVerseTemplate < BaseTemplate
446
509
  def template
447
510
  @template ||= @eruby.new <<-EOF
448
- <%#encoding:UTF-8%><blockquote#{common_attrs_erb}>
449
- #{title_tag}
511
+ <%#encoding:UTF-8%><blockquote#{common_attrs_erb}>#{title_tag}
450
512
  <% if (attr? :attribution) || (attr? :citetitle) %>
451
513
  <attribution>
452
514
  <% if attr? :attribution %>
453
- <%= attr(:attribution) %>
515
+ <%= (attr :attribution) %>
454
516
  <% end %>
455
517
  #{tag 'citetitle', :citetitle}
456
518
  </attribution>
@@ -470,9 +532,8 @@ end
470
532
  class BlockTableTemplate < BaseTemplate
471
533
  def template
472
534
  @template ||= @eruby.new <<-EOS
473
- <%#encoding:UTF-8%><<%= title? ? 'table' : 'informaltable'%>#{common_attrs_erb} frame="<%= attr :frame, 'all'%>"
474
- rowsep="<%= ['none', 'cols'].include?(attr :grid) ? 0 : 1 %>" colsep="<%= ['none', 'rows'].include?(attr :grid) ? 0 : 1 %>">
475
- #{title_tag}
535
+ <%#encoding:UTF-8%><<%= (tag_name = title? ? 'table' : 'informaltable') %>#{common_attrs_erb} frame="<%= attr :frame, 'all'%>"
536
+ rowsep="<%= ['none', 'cols'].include?(attr :grid) ? 0 : 1 %>" colsep="<%= ['none', 'rows'].include?(attr :grid) ? 0 : 1 %>">#{title_tag}
476
537
  <% if attr? :width %>
477
538
  <?dbhtml table-width="<%= attr :width %>"?>
478
539
  <?dbfo table-width="<%= attr :width %>"?>
@@ -480,7 +541,7 @@ class BlockTableTemplate < BaseTemplate
480
541
  <% end %>
481
542
  <tgroup cols="<%= attr :colcount %>">
482
543
  <% @columns.each do |col| %>
483
- <colspec colname="col_<%= col.attr :colnumber %>" colwidth="<%= col.attr((attr? :width) ? :colabswidth : :colpcwidth) %>*"/>
544
+ <colspec colname="col_<%= col.attr :colnumber %>" colwidth="<%= (col.attr (attr? :width) ? :colabswidth : :colpcwidth) %>*"/>
484
545
  <% end %>
485
546
  <% [:head, :foot, :body].select {|tblsec| !rows[tblsec].empty? }.each do |tblsec| %>
486
547
  <t<%= tblsec %>>
@@ -490,22 +551,23 @@ class BlockTableTemplate < BaseTemplate
490
551
  <entry#{attribute('align', 'cell.attr :halign')}#{attribute('valign', 'cell.attr :valign')}<%
491
552
  if cell.colspan %> namest="col_<%= cell.column.attr :colnumber %>" nameend="col_<%= (cell.column.attr :colnumber) + cell.colspan - 1 %>"<%
492
553
  end %><% if cell.rowspan %> morerows="<%= cell.rowspan - 1 %>"<% end %>><%
493
- if tblsec == :head %><%= cell.text %><%
554
+ cell_content = ''
555
+ if tblsec == :head %><% cell_content = cell.text %><%
494
556
  else %><%
495
- case cell.attr(:style)
496
- when :asciidoc %><%= cell.content %><%
497
- when :verse %><literallayout><%= template.preserve_endlines(cell.text, self) %></literallayout><%
498
- when :literal %><literallayout class="monospaced"><%= template.preserve_endlines(cell.text, self) %></literallayout><%
499
- when :header %><% cell.content.each do |text| %><simpara><emphasis role="strong"><%= text %></emphasis></simpara><% end %><%
500
- else %><% cell.content.each do |text| %><simpara><%= text %></simpara><% end %><%
501
- %><% end %><% end %></entry>
557
+ case (cell.attr :style)
558
+ when :asciidoc %><% cell_content = cell.content %><%
559
+ when :verse %><% cell_content = %(<literallayout>\#{template.preserve_endlines(cell.text, self)}</literallayout>) %><%
560
+ when :literal %><% cell_content = %(<literallayout class="monospaced">\#{template.preserve_endlines(cell.text, self)}</literallayout>) %><%
561
+ when :header %><% cell.content.each do |text| %><% cell_content = %(\#{cell_content\}<simpara><emphasis role="strong">\#{text}</emphasis></simpara>) %><% end %><%
562
+ else %><% cell.content.each do |text| %><% cell_content = %(\#{cell_content}<simpara>\#{text}</simpara>) %><% end %><%
563
+ %><% end %><% end %><%= (@document.attr? 'cellbgcolor') ? %(<?dbfo bgcolor="\#{@document.attr 'cellbgcolor'}"?>) : nil %><%= cell_content %></entry>
502
564
  <% end %>
503
565
  </row>
504
566
  <% end %>
505
567
  </t<%= tblsec %>>
506
568
  <% end %>
507
569
  </tgroup>
508
- </<%= title? ? 'table' : 'informaltable'%>>
570
+ </<%= tag_name %>>
509
571
  EOS
510
572
  end
511
573
  end
@@ -513,8 +575,7 @@ end
513
575
  class BlockImageTemplate < BaseTemplate
514
576
  def template
515
577
  @template ||= @eruby.new <<-EOF
516
- <%#encoding:UTF-8%><%#encoding:UTF-8%><figure#{common_attrs_erb}>
517
- #{title_tag}
578
+ <%#encoding:UTF-8%><%#encoding:UTF-8%><figure#{common_attrs_erb}>#{title_tag}
518
579
  <mediaobject>
519
580
  <imageobject>
520
581
  <imagedata fileref="<%= image_uri(attr :target) %>"#{attribute('contentwidth', :width)}#{attribute('contentdepth', :height)}/>
@@ -581,7 +642,54 @@ class InlineQuotedTemplate < BaseTemplate
581
642
  end
582
643
 
583
644
  def result(node)
584
- quote_text(node.text, node.type, node.attr('role'))
645
+ quote_text(node.text, node.type, (node.attr 'role'))
646
+ end
647
+
648
+ def template
649
+ :invoke_result
650
+ end
651
+ end
652
+
653
+ class InlineButtonTemplate < BaseTemplate
654
+ def result(node)
655
+ %(<guibutton>#{node.text}</guibutton>)
656
+ end
657
+
658
+ def template
659
+ :invoke_result
660
+ end
661
+ end
662
+
663
+ class InlineKbdTemplate < BaseTemplate
664
+ def result(node)
665
+ keys = node.attr 'keys'
666
+ if keys.size == 1
667
+ %(<keycap>#{keys.first}</keycap>)
668
+ else
669
+ key_combo = keys.map{|key| %(<keycap>#{key}</keycap>) }.join
670
+ %(<keycombo>#{key_combo}</keycombo>)
671
+ end
672
+ end
673
+
674
+ def template
675
+ :invoke_result
676
+ end
677
+ end
678
+
679
+ class InlineMenuTemplate < BaseTemplate
680
+ def menu(menu, submenus, menuitem)
681
+ if !submenus.empty?
682
+ submenu_path = submenus.map{|submenu| %(<guisubmenu>#{submenu}</guisubmenu> ) }.join.chop
683
+ %(<menuchoice><guimenu>#{menu}</guimenu> #{submenu_path} <guimenuitem>#{menuitem}</guimenuitem></menuchoice>)
684
+ elsif !menuitem.nil?
685
+ %(<menuchoice><guimenu>#{menu}</guimenu> <guimenuitem>#{menuitem}</guimenuitem></menuchoice>)
686
+ else
687
+ %(<guimenu>#{menu}</guimenu>)
688
+ end
689
+ end
690
+
691
+ def result(node)
692
+ menu(node.attr('menu'), node.attr('submenus'), node.attr('menuitem'))
585
693
  end
586
694
 
587
695
  def template