asciidoctor 0.1.4 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of asciidoctor might be problematic. Click here for more details.

Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +209 -25
  3. data/{LICENSE → LICENSE.adoc} +4 -3
  4. data/README.adoc +392 -395
  5. data/Rakefile +94 -137
  6. data/benchmark/benchmark.rb +127 -0
  7. data/benchmark/sample-data/mdbasics.adoc +334 -0
  8. data/bin/asciidoctor +5 -8
  9. data/bin/asciidoctor-safe +4 -8
  10. data/compat/asciidoc.conf +78 -11
  11. data/compat/font-awesome-3-compat.css +397 -0
  12. data/data/stylesheets/asciidoctor-default.css +399 -0
  13. data/data/stylesheets/coderay-asciidoctor.css +89 -0
  14. data/features/open_block.feature +92 -0
  15. data/features/pass_block.feature +66 -0
  16. data/features/step_definitions.rb +42 -0
  17. data/features/text_formatting.feature +55 -0
  18. data/features/xref.feature +116 -0
  19. data/lib/asciidoctor.rb +1155 -605
  20. data/lib/asciidoctor/abstract_block.rb +157 -71
  21. data/lib/asciidoctor/abstract_node.rb +150 -93
  22. data/lib/asciidoctor/attribute_list.rb +85 -90
  23. data/lib/asciidoctor/block.rb +51 -24
  24. data/lib/asciidoctor/callouts.rb +4 -7
  25. data/lib/asciidoctor/cli.rb +3 -0
  26. data/lib/asciidoctor/cli/invoker.rb +86 -76
  27. data/lib/asciidoctor/cli/options.rb +111 -61
  28. data/lib/asciidoctor/converter.rb +232 -0
  29. data/lib/asciidoctor/converter/base.rb +58 -0
  30. data/lib/asciidoctor/converter/composite.rb +66 -0
  31. data/lib/asciidoctor/converter/docbook45.rb +94 -0
  32. data/lib/asciidoctor/converter/docbook5.rb +684 -0
  33. data/lib/asciidoctor/converter/factory.rb +225 -0
  34. data/lib/asciidoctor/converter/html5.rb +1081 -0
  35. data/lib/asciidoctor/converter/template.rb +296 -0
  36. data/lib/asciidoctor/core_ext.rb +7 -0
  37. data/lib/asciidoctor/core_ext/object/nil_or_empty.rb +23 -0
  38. data/lib/asciidoctor/core_ext/string/chr.rb +6 -0
  39. data/lib/asciidoctor/core_ext/symbol/length.rb +6 -0
  40. data/lib/asciidoctor/document.rb +590 -304
  41. data/lib/asciidoctor/extensions.rb +1100 -308
  42. data/lib/asciidoctor/helpers.rb +109 -46
  43. data/lib/asciidoctor/inline.rb +16 -9
  44. data/lib/asciidoctor/list.rb +23 -15
  45. data/lib/asciidoctor/opal_ext.rb +4 -0
  46. data/lib/asciidoctor/opal_ext/comparable.rb +38 -0
  47. data/lib/asciidoctor/opal_ext/dir.rb +13 -0
  48. data/lib/asciidoctor/opal_ext/error.rb +2 -0
  49. data/lib/asciidoctor/opal_ext/file.rb +125 -0
  50. data/lib/asciidoctor/{lexer.rb → parser.rb} +646 -455
  51. data/lib/asciidoctor/path_resolver.rb +141 -77
  52. data/lib/asciidoctor/reader.rb +257 -187
  53. data/lib/asciidoctor/section.rb +12 -16
  54. data/lib/asciidoctor/stylesheets.rb +91 -0
  55. data/lib/asciidoctor/substitutors.rb +1548 -0
  56. data/lib/asciidoctor/table.rb +73 -57
  57. data/lib/asciidoctor/timings.rb +39 -0
  58. data/lib/asciidoctor/version.rb +1 -1
  59. data/man/asciidoctor.1 +22 -14
  60. data/man/asciidoctor.adoc +18 -10
  61. data/test/attributes_test.rb +314 -14
  62. data/test/blocks_test.rb +763 -118
  63. data/test/converter_test.rb +352 -0
  64. data/test/document_test.rb +518 -199
  65. data/test/extensions_test.rb +273 -103
  66. data/test/fixtures/asciidoc_index.txt +27 -13
  67. data/test/fixtures/basic-docinfo.xml +1 -1
  68. data/test/fixtures/chapter-a.adoc +3 -0
  69. data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +6 -0
  70. data/test/fixtures/docinfo.xml +1 -1
  71. data/test/fixtures/include-file.asciidoc +2 -0
  72. data/test/fixtures/master.adoc +5 -0
  73. data/test/invoker_test.rb +173 -61
  74. data/test/links_test.rb +97 -21
  75. data/test/lists_test.rb +181 -22
  76. data/test/options_test.rb +86 -2
  77. data/test/paragraphs_test.rb +47 -5
  78. data/test/{lexer_test.rb → parser_test.rb} +128 -57
  79. data/test/paths_test.rb +36 -1
  80. data/test/preamble_test.rb +25 -17
  81. data/test/reader_test.rb +404 -249
  82. data/test/sections_test.rb +623 -58
  83. data/test/substitutions_test.rb +609 -132
  84. data/test/tables_test.rb +198 -24
  85. data/test/test_helper.rb +101 -31
  86. data/test/text_test.rb +88 -31
  87. metadata +160 -64
  88. data/Gemfile +0 -12
  89. data/Guardfile +0 -18
  90. data/asciidoctor.gemspec +0 -143
  91. data/lib/asciidoctor/backends/_stylesheets.rb +0 -466
  92. data/lib/asciidoctor/backends/base_template.rb +0 -114
  93. data/lib/asciidoctor/backends/docbook45.rb +0 -774
  94. data/lib/asciidoctor/backends/docbook5.rb +0 -103
  95. data/lib/asciidoctor/backends/html5.rb +0 -1214
  96. data/lib/asciidoctor/renderer.rb +0 -259
  97. data/lib/asciidoctor/substituters.rb +0 -1083
  98. data/test/fixtures/asciidoc.txt +0 -105
  99. data/test/fixtures/ascshort.txt +0 -32
  100. data/test/fixtures/list_elements.asciidoc +0 -10
  101. data/test/renderer_test.rb +0 -162
@@ -3,6 +3,19 @@ module Asciidoctor
3
3
  # It supports all three of AsciiDoc's table formats: psv, dsv and csv.
4
4
  class Table < AbstractBlock
5
5
 
6
+ # Public: A data object that encapsulates the collection of rows (head, foot, body) for a table
7
+ class Rows
8
+ attr_accessor :head, :foot, :body
9
+
10
+ def initialize head = [], foot = [], body = []
11
+ @head = head
12
+ @foot = foot
13
+ @body = body
14
+ end
15
+
16
+ alias :[] :send
17
+ end
18
+
6
19
  # Public: A String key that specifies the default table format in AsciiDoc (psv)
7
20
  DEFAULT_DATA_FORMAT = 'psv'
8
21
 
@@ -54,9 +67,9 @@ class Table < AbstractBlock
54
67
  # Public: Boolean specifies whether this table has a header row
55
68
  attr_accessor :has_header_option
56
69
 
57
- def initialize(parent, attributes)
58
- super(parent, :table)
59
- @rows = Rows.new([], [], [])
70
+ def initialize parent, attributes
71
+ super parent, :table
72
+ @rows = Rows.new
60
73
  @columns = []
61
74
 
62
75
  @has_header_option = attributes.has_key? 'header-option'
@@ -65,7 +78,7 @@ class Table < AbstractBlock
65
78
  # to resolve an integer width from potential bogus input
66
79
  pcwidth = attributes['width']
67
80
  pcwidth_intval = pcwidth.to_i.abs
68
- if pcwidth_intval == 0 && pcwidth != "0" || pcwidth_intval > 100
81
+ if pcwidth_intval == 0 && pcwidth != '0' || pcwidth_intval > 100
69
82
  pcwidth_intval = 100
70
83
  end
71
84
  @attributes['tablepcwidth'] = pcwidth_intval
@@ -79,7 +92,7 @@ class Table < AbstractBlock
79
92
  # Internal: Returns whether the current row being processed is
80
93
  # the header row
81
94
  def header_row?
82
- @has_header_option && @rows.body.size == 0
95
+ @has_header_option && @rows.body.empty?
83
96
  end
84
97
 
85
98
  # Internal: Creates the Column objects from the column spec
@@ -87,18 +100,19 @@ class Table < AbstractBlock
87
100
  # returns nothing
88
101
  def create_columns(col_specs)
89
102
  total_width = 0
90
- @columns = col_specs.inject([]) {|collector, col_spec|
103
+ cols = []
104
+ col_specs.each do |col_spec|
91
105
  total_width += col_spec['width']
92
- collector << Column.new(self, collector.size, col_spec)
93
- collector
94
- }
106
+ cols << Column.new(self, cols.size, col_spec)
107
+ end
95
108
 
96
- if !@columns.empty?
97
- @attributes['colcount'] = @columns.size
98
- even_width = (100.0 / @columns.size).floor
99
- @columns.each {|c| c.assign_width(total_width, even_width) }
109
+ unless cols.empty?
110
+ @attributes['colcount'] = cols.size
111
+ even_width = (100.0 / cols.size).floor
112
+ cols.each {|c| c.assign_width(total_width, even_width) }
100
113
  end
101
114
 
115
+ @columns = cols
102
116
  nil
103
117
  end
104
118
 
@@ -110,34 +124,33 @@ class Table < AbstractBlock
110
124
  # set rowcount before splitting up body rows
111
125
  @attributes['rowcount'] = @rows.body.size
112
126
 
113
- if !rows.body.empty? && @has_header_option
114
- head = rows.body.shift
127
+ num_body_rows = @rows.body.size
128
+ if num_body_rows > 0 && @has_header_option
129
+ head = @rows.body.shift
130
+ num_body_rows -= 1
115
131
  # styles aren't applied to header row
116
132
  head.each {|c| c.style = nil }
117
133
  # QUESTION why does AsciiDoc use an array for head? is it
118
134
  # possible to have more than one based on the syntax?
119
- rows.head = [head]
135
+ @rows.head = [head]
120
136
  end
121
137
 
122
- if !rows.body.empty? && attributes.has_key?('footer-option')
123
- rows.foot = [rows.body.pop]
138
+ if num_body_rows > 0 && attributes.has_key?('footer-option')
139
+ @rows.foot = [@rows.body.pop]
124
140
  end
125
141
 
126
142
  nil
127
143
  end
128
144
  end
129
145
 
130
- # Public: A struct that encapsulates the collection of rows (head, foot, body) for a table
131
- Table::Rows = Struct.new(:head, :foot, :body)
132
-
133
146
  # Public: Methods to manage the columns of an AsciiDoc table. In particular, it
134
147
  # keeps track of the column specs
135
148
  class Table::Column < AbstractNode
136
149
  # Public: Get/Set the Symbol style for this column.
137
150
  attr_accessor :style
138
151
 
139
- def initialize(table, index, attributes = {})
140
- super(table, :column)
152
+ def initialize table, index, attributes = {}
153
+ super table, :column
141
154
  @style = attributes['style']
142
155
  attributes['colnumber'] = index + 1
143
156
  attributes['width'] ||= 1
@@ -186,18 +199,18 @@ class Table::Cell < AbstractNode
186
199
  # Public: The internal Asciidoctor::Document for a cell that has the asciidoc style
187
200
  attr_reader :inner_document
188
201
 
189
- def initialize(column, text, attributes = {}, cursor = nil)
190
- super(column, :cell)
202
+ def initialize column, text, attributes = {}, cursor = nil
203
+ super column, :cell
191
204
  @text = text
192
205
  @style = nil
193
206
  @colspan = nil
194
207
  @rowspan = nil
195
208
  # TODO feels hacky
196
- if !column.nil?
209
+ if column
197
210
  @style = column.attributes['style']
198
211
  update_attributes(column.attributes)
199
212
  end
200
- if !attributes.nil?
213
+ if attributes
201
214
  @colspan = attributes.delete('colspan')
202
215
  @rowspan = attributes.delete('rowspan')
203
216
  # TODO eventualy remove the style attribute from the attributes hash
@@ -213,9 +226,9 @@ class Table::Cell < AbstractNode
213
226
  # NOTE we need to process the first line of content as it may not have been processed
214
227
  # the included content cannot expect to match conditional terminators in the remaining
215
228
  # lines of table cell content, it must be self-contained logic
216
- inner_document_lines = @text.each_line.to_a
217
- unless inner_document_lines.empty? || !inner_document_lines.first.include?('::')
218
- unprocessed_lines = inner_document_lines[0..0]
229
+ inner_document_lines = @text.split(EOL)
230
+ unless inner_document_lines.empty? || !inner_document_lines[0].include?('::')
231
+ unprocessed_lines = inner_document_lines[0]
219
232
  processed_lines = PreprocessorReader.new(@document, unprocessed_lines).readlines
220
233
  if processed_lines != unprocessed_lines
221
234
  inner_document_lines.shift
@@ -235,11 +248,11 @@ class Table::Cell < AbstractNode
235
248
  # Public: Handles the body data (tbody, tfoot), applying styles and partitioning into paragraphs
236
249
  def content
237
250
  if @style == :asciidoc
238
- @inner_document.render
251
+ @inner_document.convert
239
252
  else
240
- text.split(BLANK_LINE_PATTERN).map {|p|
241
- !@style || @style == :header ? p : Inline.new(parent, :quoted, p, :type => @style).render
242
- }
253
+ text.split(BlankLineRx).map do |p|
254
+ !@style || @style == :header ? p : Inline.new(parent, :quoted, p, :type => @style).convert
255
+ end
243
256
  end
244
257
  end
245
258
 
@@ -283,19 +296,18 @@ class Table::ParserContext
283
296
  @table = table
284
297
  # TODO if reader.cursor becomes a reference, this would require .dup
285
298
  @last_cursor = reader.cursor
286
- if attributes.has_key? 'format'
287
- @format = attributes['format']
288
- if !Table::DATA_FORMATS.include? @format
289
- raise "Illegal table format: #@format"
299
+ if (@format = attributes['format'])
300
+ unless Table::DATA_FORMATS.include? @format
301
+ raise %(Illegal table format: #{@format})
290
302
  end
291
303
  else
292
304
  @format = Table::DEFAULT_DATA_FORMAT
293
305
  end
294
306
 
295
- if @format == 'psv' && !attributes.has_key?('separator') && table.document.nested?
296
- @delimiter = '!'
307
+ @delimiter = if @format == 'psv' && !(attributes.has_key? 'separator') && table.document.nested?
308
+ '!'
297
309
  else
298
- @delimiter = attributes.fetch('separator', Table::DEFAULT_DELIMITERS[@format])
310
+ attributes['separator'] || Table::DEFAULT_DELIMITERS[@format]
299
311
  end
300
312
  @delimiter_re = /#{Regexp.escape @delimiter}/
301
313
  @col_count = table.columns.empty? ? -1 : table.columns.size
@@ -319,9 +331,9 @@ class Table::ParserContext
319
331
  # Public: Checks whether the line provided contains the cell delimiter
320
332
  # used by this table.
321
333
  #
322
- # returns MatchData if the line contains the delimiter, false otherwise
334
+ # returns Regexp MatchData if the line contains the delimiter, false otherwise
323
335
  def match_delimiter(line)
324
- line.match @delimiter_re
336
+ @delimiter_re.match(line)
325
337
  end
326
338
 
327
339
  # Public: Skip beyond the matched delimiter because it was a false positive
@@ -329,7 +341,7 @@ class Table::ParserContext
329
341
  #
330
342
  # returns the String after the match
331
343
  def skip_matched_delimiter(match, escaped = false)
332
- @buffer = %(#@buffer#{escaped ? match.pre_match.chop : match.pre_match}#@delimiter)
344
+ @buffer = %(#{@buffer}#{escaped ? match.pre_match.chop : match.pre_match}#{@delimiter})
333
345
  match.post_match
334
346
  end
335
347
 
@@ -338,7 +350,7 @@ class Table::ParserContext
338
350
  # returns true if the buffer has unclosed quotes, false if it doesn't or it
339
351
  # isn't quoted data
340
352
  def buffer_has_unclosed_quotes?(append = nil)
341
- record = "#@buffer#{append}".strip
353
+ record = %(#{@buffer}#{append}).strip
342
354
  record.start_with?('"') && !record.start_with?('""') && !record.end_with?('"')
343
355
  end
344
356
 
@@ -347,7 +359,7 @@ class Table::ParserContext
347
359
  # returns true if the buffer starts with a double quote (and not an escaped double quote),
348
360
  # false otherwise
349
361
  def buffer_quoted?
350
- @buffer.lstrip!
362
+ @buffer = @buffer.lstrip
351
363
  @buffer.start_with?('"') && !@buffer.start_with?('""')
352
364
  end
353
365
 
@@ -422,7 +434,7 @@ class Table::ParserContext
422
434
  def close_cell(eol = false)
423
435
  cell_text = @buffer.strip
424
436
  @buffer = ''
425
- if format == 'psv'
437
+ if @format == 'psv'
426
438
  cell_spec = take_cell_spec
427
439
  if cell_spec.nil?
428
440
  warn "asciidoctor: ERROR: #{@last_cursor.line_info}: table missing leading separator, recovering automatically"
@@ -435,12 +447,12 @@ class Table::ParserContext
435
447
  else
436
448
  cell_spec = nil
437
449
  repeat = 1
438
- if format == 'csv'
450
+ if @format == 'csv'
439
451
  if !cell_text.empty? && cell_text.include?('"')
440
452
  # this may not be perfect logic, but it hits the 99%
441
453
  if cell_text.start_with?('"') && cell_text.end_with?('"')
442
454
  # unquote
443
- cell_text = cell_text[1..-2].strip
455
+ cell_text = cell_text[1...-1].strip
444
456
  end
445
457
 
446
458
  # collapses escaped quotes
@@ -449,11 +461,15 @@ class Table::ParserContext
449
461
  end
450
462
  end
451
463
 
452
- 1.upto(repeat) {|i|
464
+ 1.upto(repeat) do |i|
453
465
  # make column resolving an operation
454
466
  if @col_count == -1
455
- @table.columns << Table::Column.new(@table, @current_row.size + i - 1)
456
- column = @table.columns.last
467
+ @table.columns << (column = Table::Column.new(@table, @current_row.size + i - 1))
468
+ if cell_spec && (cell_spec.has_key? 'colspan') && (extra_cols = cell_spec['colspan'].to_i - 1) > 0
469
+ extra_cols.times do |j|
470
+ @table.columns << Table::Column.new(@table, @current_row.size + i + j - 1)
471
+ end
472
+ end
457
473
  else
458
474
  # QUESTION is this right for cells that span columns?
459
475
  column = @table.columns[@current_row.size]
@@ -461,7 +477,7 @@ class Table::ParserContext
461
477
 
462
478
  cell = Table::Cell.new(column, cell_text, cell_spec, @last_cursor)
463
479
  @last_cursor = @reader.cursor
464
- unless cell.rowspan.nil? || cell.rowspan == 1
480
+ unless !cell.rowspan || cell.rowspan == 1
465
481
  activate_rowspan(cell.rowspan, (cell.colspan || 1))
466
482
  end
467
483
  @col_visits += (cell.colspan || 1)
@@ -469,7 +485,7 @@ class Table::ParserContext
469
485
  # don't close the row if we're on the first line and the column count has not been set explicitly
470
486
  # TODO perhaps the col_count/linenum logic should be in end_of_row? (or a should_end_row? method)
471
487
  close_row if end_of_row? && (@col_count != -1 || @linenum > 0 || (eol && i == repeat))
472
- }
488
+ end
473
489
  @open_cell = false
474
490
  nil
475
491
  end
@@ -496,8 +512,8 @@ class Table::ParserContext
496
512
  # returns nothing
497
513
  def activate_rowspan(rowspan, colspan)
498
514
  1.upto(rowspan - 1).each {|i|
499
- @active_rowspans[i] ||= 0
500
- @active_rowspans[i] += colspan
515
+ # longhand assignment used for Opal compatibility
516
+ @active_rowspans[i] = (@active_rowspans[i] || 0) + colspan
501
517
  }
502
518
  nil
503
519
  end
@@ -510,7 +526,7 @@ class Table::ParserContext
510
526
  # Public: Calculate the effective column visits, which consists of the number of
511
527
  # cells plus any active rowspans.
512
528
  def effective_col_visits
513
- @col_visits + @active_rowspans.first
529
+ @col_visits + @active_rowspans[0]
514
530
  end
515
531
 
516
532
  # Internal: Advance to the next line (which may come after the parser begins processing
@@ -0,0 +1,39 @@
1
+ module Asciidoctor
2
+ class Timings
3
+ def initialize
4
+ @log = {}
5
+ @timers = {}
6
+ end
7
+
8
+ def start key
9
+ @timers[key] = ::Time.now
10
+ end
11
+
12
+ def record key
13
+ @log[key] = (::Time.now - (@timers.delete key))
14
+ end
15
+
16
+ def read_parse
17
+ (time = (@log[:read] || 0) + (@log[:parse] || 0)) > 0 ? time : nil
18
+ end
19
+
20
+ def convert
21
+ @log[:convert] || 0
22
+ end
23
+
24
+ def read_parse_convert
25
+ (time = (@log[:read] || 0) + (@log[:parse] || 0) + (@log[:convert] || 0)) > 0 ? time : nil
26
+ end
27
+
28
+ def total
29
+ (time = (@log[:read] || 0) + (@log[:parse] || 0) + (@log[:convert] || 0) + (@log[:write] || 0)) > 0 ? time : nil
30
+ end
31
+
32
+ def print_report to = $stdout, subject = nil
33
+ to.puts %(Input file: #{subject}) if subject
34
+ to.puts %( Time to read and parse source: #{'%05.5f' % read_parse.to_i})
35
+ to.puts %( Time to convert document: #{'%05.5f' % convert.to_i})
36
+ to.puts %( Total time (read, parse and convert): #{'%05.5f' % read_parse_convert.to_i})
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module Asciidoctor
2
- VERSION = '0.1.4'
2
+ VERSION = '1.5.0'
3
3
  end
@@ -1,23 +1,23 @@
1
1
  '\" t
2
2
  .\" Title: asciidoctor
3
3
  .\" Author: Dan Allen
4
- .\" Generator: Asciidoctor 0.1.4
5
- .\" Date: 2013-09-05
4
+ .\" Generator: Asciidoctor 1.5.0
5
+ .\" Date: 2014-05-19
6
6
  .\" Manual: Asciidoctor Manual
7
- .\" Source: Asciidoctor 0.1.4
7
+ .\" Source: Asciidoctor 1.5.0
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "ASCIIDOCTOR" "1" "2013-09-05" "Asciidoctor 0\&.1\&.4" "Asciidoctor Manual"
10
+ .TH "ASCIIDOCTOR" "1" "2014-08-12" "Asciidoctor 1\&.5\&.0" "Asciidoctor Manual"
11
11
  .ie \n(.g .ds Aq \(aq
12
12
  .el .ds Aq '
13
13
  .nh
14
14
  .ad l
15
15
  .SH "SYNOPSIS"
16
16
  .sp
17
- \fBasciidoctor\fR [\fIOPTION\fR]\&... \fIFILE\fR\&...
17
+ \fBasciidoctor\fR [\fIOPTION\fR]... \fIFILE\fR...
18
18
  .SH "DESCRIPTION"
19
19
  .sp
20
- The asciidoctor(1) command converts the AsciiDoc source file(s) \fIFILE\fR to HTML 5, DocBook 4\&.5, DocBook 5\&.0 and other custom output formats\&.
20
+ The asciidoctor(1) command converts the AsciiDoc source file(s) \fIFILE\fR to HTML5, DocBook 4\&.5, DocBook 5\&.0 and other custom output formats\&.
21
21
  .sp
22
22
  If \fIFILE\fR is \fI\-\fR then the AsciiDoc source is read from standard input\&.
23
23
  .SH "OPTIONS"
@@ -50,7 +50,7 @@ This option may be specified more than once\&.
50
50
  .PP
51
51
  \fB\-b, \-\-backend\fR=\fIBACKEND\fR
52
52
  .RS 4
53
- Backend output file format: \fIhtml5\fR, \fIdocbook45\fR and \fIdocbook5\fR supported out of the box\&. You can also use the backend alias names \fIhtml\fR (aliased to \fIhtml5\fR) or \fIdocbook\fR (aliased to \fIdocbook45\fR)\&. Defaults to \fIhtml5\fR\&. Other options can be passed, but if Asciidoctor cannot find the backend, it will fail during rendering\&.
53
+ Backend output file format: \fIhtml5\fR, \fIdocbook45\fR and \fIdocbook5\fR supported out of the box\&. You can also use the backend alias names \fIhtml\fR (aliased to \fIhtml5\fR) or \fIdocbook\fR (aliased to \fIdocbook5\fR)\&. Defaults to \fIhtml5\fR\&. Other options can be passed, but if Asciidoctor cannot find the backend, it will fail during rendering\&.
54
54
  .RE
55
55
  .PP
56
56
  \fB\-d, \-\-doctype\fR=\fIDOCTYPE\fR
@@ -61,7 +61,7 @@ Document type: \fIarticle\fR, \fIbook\fR, \fImanpage\fR or \fIinline\fR\&. Sets
61
61
  .PP
62
62
  \fB\-C, \-\-compact\fR
63
63
  .RS 4
64
- Compact the output by removing blank lines\&. Not enabled by default\&.
64
+ Compact the output by removing blank lines\&. (No longer in use)\&.
65
65
  .RE
66
66
  .PP
67
67
  \fB\-D, \-\-destination\-dir\fR=\fIDIR\fR
@@ -71,12 +71,12 @@ Destination output directory\&. Defaults to the directory containing the source
71
71
  .PP
72
72
  \fB\-E, \-\-template\-engine\fR=\fINAME\fR
73
73
  .RS 4
74
- Template engine to use for the custom render templates\&. The gem with the same name as the engine will be loaded automatically\&. This name is also used to build the full path to the custom templates\&.
74
+ Template engine to use for the custom render templates\&. The gem with the same name as the engine will be loaded automatically\&. This name is also used to build the full path to the custom templates\&. If a template engine is not specified, it will be auto\-detected based on the file extension of the custom templates found\&.
75
75
  .RE
76
76
  .PP
77
77
  \fB\-e, \-\-eruby\fR
78
78
  .RS 4
79
- Specifies the eRuby implementation to use for rendering the built\-in templates\&. Supported values are \fIerb\fR and \fIerubis\fR\&. Defaults to \fIerb\fR\&.
79
+ Specifies the eRuby implementation to use for rendering the custom ERB templates\&. Supported values are \fIerb\fR and \fIerubis\fR\&. Defaults to \fIerb\fR\&.
80
80
  .RE
81
81
  .PP
82
82
  \fB\-n, \-\-section\-numbers\fR
@@ -104,6 +104,11 @@ This option may be specified more than once\&. Matching templates found in subse
104
104
  .RE
105
105
  .SS "Processing Information"
106
106
  .PP
107
+ \fB\-q, \-\-quiet\fR
108
+ .RS 4
109
+ Silence warnings\&.
110
+ .RE
111
+ .PP
107
112
  \fB\-\-trace\fR
108
113
  .RS 4
109
114
  Include backtrace information on errors\&. Not enabled by default\&.
@@ -113,6 +118,11 @@ Include backtrace information on errors\&. Not enabled by default\&.
113
118
  .RS 4
114
119
  Verbosely print processing information and configuration file checks to stderr\&.
115
120
  .RE
121
+ .PP
122
+ \fB\-t, \-\-timings\fR
123
+ .RS 4
124
+ Display timings information (time to read, parse and convert)
125
+ .RE
116
126
  .SS "Program Information"
117
127
  .PP
118
128
  \fB\-h, \-\-help\fR
@@ -149,15 +159,13 @@ Git source repository on GitHub: <\fBhttps://github\&.com/asciidoctor/asciidocto
149
159
  .sp
150
160
  Project web site: <\fBhttp://asciidoctor\&.org\fR>
151
161
  .sp
152
- GitHub organization: <\fBhttp://github\&.com/asciidoctor\fR>
162
+ GitHub organization: <\fBhttps://github\&.com/asciidoctor\fR>
153
163
  .sp
154
164
  Mailinglist / forum: <\fBhttp://discuss\&.asciidoctor\&.org\fR>
155
165
  .SH "COPYING"
156
166
  .sp
157
- Copyright (C) 2012\-2013 Dan Allen and Ryan Waldron\&. Free use of this software is granted under the terms of the MIT License\&.
167
+ Copyright (C) 2012\-2014 Dan Allen, Ryan Waldron and the Asciidoctor Project\&. Free use of this software is granted under the terms of the MIT License\&.
158
168
  .SH "AUTHOR"
159
169
  .PP
160
170
  \fBDan Allen\fR
161
- .RS 4
162
- Author.
163
171
  .RE