asciidoctor 2.0.9 → 2.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +193 -16
  3. data/LICENSE +1 -1
  4. data/README-de.adoc +12 -13
  5. data/README-fr.adoc +11 -15
  6. data/README-jp.adoc +242 -185
  7. data/README-zh_CN.adoc +17 -18
  8. data/README.adoc +133 -131
  9. data/asciidoctor.gemspec +6 -6
  10. data/data/locale/attributes-ar.adoc +4 -3
  11. data/data/locale/attributes-be.adoc +23 -0
  12. data/data/locale/attributes-bg.adoc +4 -3
  13. data/data/locale/attributes-ca.adoc +6 -5
  14. data/data/locale/attributes-cs.adoc +4 -3
  15. data/data/locale/attributes-da.adoc +6 -5
  16. data/data/locale/attributes-de.adoc +4 -4
  17. data/data/locale/attributes-en.adoc +4 -4
  18. data/data/locale/attributes-es.adoc +6 -5
  19. data/data/locale/attributes-fa.adoc +4 -3
  20. data/data/locale/attributes-fi.adoc +4 -3
  21. data/data/locale/attributes-fr.adoc +6 -5
  22. data/data/locale/attributes-hu.adoc +4 -3
  23. data/data/locale/attributes-id.adoc +4 -3
  24. data/data/locale/attributes-it.adoc +6 -5
  25. data/data/locale/attributes-ja.adoc +4 -3
  26. data/data/locale/{attributes-kr.adoc → attributes-ko.adoc} +4 -3
  27. data/data/locale/attributes-nb.adoc +4 -3
  28. data/data/locale/attributes-nl.adoc +6 -5
  29. data/data/locale/attributes-nn.adoc +4 -3
  30. data/data/locale/attributes-pl.adoc +8 -7
  31. data/data/locale/attributes-pt.adoc +6 -5
  32. data/data/locale/attributes-pt_BR.adoc +6 -5
  33. data/data/locale/attributes-ro.adoc +4 -3
  34. data/data/locale/attributes-ru.adoc +6 -5
  35. data/data/locale/attributes-sr.adoc +4 -4
  36. data/data/locale/attributes-sr_Latn.adoc +4 -4
  37. data/data/locale/attributes-sv.adoc +4 -4
  38. data/data/locale/attributes-tr.adoc +4 -3
  39. data/data/locale/attributes-uk.adoc +6 -5
  40. data/data/locale/attributes-zh_CN.adoc +4 -3
  41. data/data/locale/attributes-zh_TW.adoc +4 -3
  42. data/data/reference/syntax.adoc +14 -7
  43. data/data/stylesheets/asciidoctor-default.css +30 -30
  44. data/lib/asciidoctor.rb +40 -14
  45. data/lib/asciidoctor/abstract_block.rb +9 -4
  46. data/lib/asciidoctor/abstract_node.rb +16 -6
  47. data/lib/asciidoctor/attribute_list.rb +63 -71
  48. data/lib/asciidoctor/cli/invoker.rb +2 -0
  49. data/lib/asciidoctor/cli/options.rb +10 -9
  50. data/lib/asciidoctor/convert.rb +167 -162
  51. data/lib/asciidoctor/converter.rb +13 -12
  52. data/lib/asciidoctor/converter/docbook5.rb +5 -9
  53. data/lib/asciidoctor/converter/html5.rb +58 -45
  54. data/lib/asciidoctor/converter/manpage.rb +61 -38
  55. data/lib/asciidoctor/converter/template.rb +3 -0
  56. data/lib/asciidoctor/document.rb +44 -51
  57. data/lib/asciidoctor/extensions.rb +2 -4
  58. data/lib/asciidoctor/helpers.rb +20 -15
  59. data/lib/asciidoctor/load.rb +102 -101
  60. data/lib/asciidoctor/parser.rb +40 -32
  61. data/lib/asciidoctor/path_resolver.rb +14 -12
  62. data/lib/asciidoctor/reader.rb +20 -13
  63. data/lib/asciidoctor/rx.rb +7 -6
  64. data/lib/asciidoctor/substitutors.rb +69 -50
  65. data/lib/asciidoctor/syntax_highlighter.rb +15 -7
  66. data/lib/asciidoctor/syntax_highlighter/coderay.rb +1 -1
  67. data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +12 -4
  68. data/lib/asciidoctor/syntax_highlighter/prettify.rb +7 -4
  69. data/lib/asciidoctor/syntax_highlighter/pygments.rb +6 -7
  70. data/lib/asciidoctor/syntax_highlighter/rouge.rb +33 -19
  71. data/lib/asciidoctor/table.rb +52 -23
  72. data/lib/asciidoctor/version.rb +1 -1
  73. data/man/asciidoctor.1 +8 -8
  74. data/man/asciidoctor.adoc +4 -4
  75. metadata +16 -15
@@ -39,14 +39,15 @@ module Asciidoctor
39
39
  # NOTE don't use squiggly heredoc to maintain compatibility with Ruby < 2.3
40
40
  opts.banner = <<-'EOS'.gsub ' ', ''
41
41
  Usage: asciidoctor [OPTION]... FILE...
42
- Translate the AsciiDoc source FILE or FILE(s) into the backend output format (e.g., HTML 5, DocBook 5, etc.)
43
- By default, the output is written to a file with the basename of the source file and the appropriate extension.
44
- Example: asciidoctor -b html5 source.asciidoc
42
+ Convert the AsciiDoc input FILE(s) to the backend output format (e.g., HTML 5, DocBook 5, etc.)
43
+ Unless specified otherwise, the output is written to a file whose name is derived from the input file.
44
+ Application log messages are printed to STDERR.
45
+ Example: asciidoctor input.adoc
45
46
 
46
47
  EOS
47
48
 
48
- opts.on('-b', '--backend BACKEND', 'set output format backend: [html5, xhtml5, docbook5, manpage] (default: html5)',
49
- 'additional backends are supported via extensions (e.g., pdf, latex)') do |backend|
49
+ opts.on('-b', '--backend BACKEND', 'set backend output format: [html5, xhtml5, docbook5, manpage] (default: html5)',
50
+ 'additional backends are supported via extended converters (e.g., pdf, epub3)') do |backend|
50
51
  self[:attributes]['backend'] = backend
51
52
  end
52
53
  opts.on('-d', '--doctype DOCTYPE', ['article', 'book', 'manpage', 'inline'],
@@ -76,8 +77,8 @@ module Asciidoctor
76
77
  opts.on('-n', '--section-numbers', 'auto-number section titles in the HTML backend; disabled by default') do
77
78
  self[:attributes]['sectnums'] = ''
78
79
  end
79
- opts.on('--eruby ERUBY', ['erb', 'erubis'],
80
- 'specify eRuby implementation to use when rendering custom ERB templates: [erb, erubis] (default: erb)') do |eruby|
80
+ opts.on('--eruby ERUBY', ['erb', 'erubi', 'erubis'],
81
+ 'specify eRuby implementation to use when rendering custom ERB templates: [erb, erubi, erubis] (default: erb)') do |eruby|
81
82
  self[:eruby] = eruby
82
83
  end
83
84
  opts.on('-a', '--attribute name[=value]', 'a document attribute to set in the form of name, name!, or name=value pair',
@@ -128,7 +129,7 @@ module Asciidoctor
128
129
  opts.on('--trace', 'include backtrace information when reporting errors (default: false)') do |trace|
129
130
  self[:trace] = true
130
131
  end
131
- opts.on('-v', '--verbose', 'enable verbose mode (default: false)') do |verbose|
132
+ opts.on('-v', '--verbose', 'directs application messages logged at DEBUG or INFO level to STDERR (default: false)') do |verbose|
132
133
  self[:verbose] = 2
133
134
  end
134
135
  opts.on('-w', '--warnings', 'turn on script warnings (default: false)') do |warnings|
@@ -205,7 +206,7 @@ module Asciidoctor
205
206
  # shave off the file to process so that options errors appear correctly
206
207
  if args.size == 1 && args[0] == '-'
207
208
  infiles << args.pop
208
- elsif
209
+ else
209
210
  args.each do |file|
210
211
  if file.start_with? '-'
211
212
  # warn, but don't panic; we may have enough to proceed, so we won't force a failure
@@ -1,193 +1,198 @@
1
1
  module Asciidoctor
2
- module_function
2
+ class << self
3
+ # Public: Parse the AsciiDoc source input into an Asciidoctor::Document and
4
+ # convert it to the specified backend format.
5
+ #
6
+ # Accepts input as an IO (or StringIO), String or String Array object. If the
7
+ # input is a File, the object is expected to be opened for reading and is not
8
+ # closed afterwards by this method. Information about the file (filename,
9
+ # directory name, etc) gets assigned to attributes on the Document object.
10
+ #
11
+ # If the :to_file option is true, and the input is a File, the output is
12
+ # written to a file adjacent to the input file, having an extension that
13
+ # corresponds to the backend format. Otherwise, if the :to_file option is
14
+ # specified, the file is written to that file. If :to_file is not an absolute
15
+ # path, it is resolved relative to :to_dir, if given, otherwise the
16
+ # Document#base_dir. If the target directory does not exist, it will not be
17
+ # created unless the :mkdirs option is set to true. If the file cannot be
18
+ # written because the target directory does not exist, or because it falls
19
+ # outside of the Document#base_dir in safe mode, an IOError is raised.
20
+ #
21
+ # If the output is going to be written to a file, the header and footer are
22
+ # included unless specified otherwise (writing to a file implies creating a
23
+ # standalone document). Otherwise, the header and footer are not included by
24
+ # default and the converted result is returned.
25
+ #
26
+ # input - the String AsciiDoc source filename
27
+ # options - a String, Array or Hash of options to control processing (default: {})
28
+ # String and Array values are converted into a Hash.
29
+ # See Asciidoctor::Document#initialize for details about options.
30
+ #
31
+ # Returns the Document object if the converted String is written to a
32
+ # file, otherwise the converted String
33
+ def convert input, options = {}
34
+ (options = options.merge).delete :parse
35
+ to_dir = options.delete :to_dir
36
+ mkdirs = options.delete :mkdirs
3
37
 
4
- # Public: Parse the AsciiDoc source input into an Asciidoctor::Document and
5
- # convert it to the specified backend format.
6
- #
7
- # Accepts input as an IO (or StringIO), String or String Array object. If the
8
- # input is a File, the object is expected to be opened for reading and is not
9
- # closed afterwards by this method. Information about the file (filename,
10
- # directory name, etc) gets assigned to attributes on the Document object.
11
- #
12
- # If the :to_file option is true, and the input is a File, the output is
13
- # written to a file adjacent to the input file, having an extension that
14
- # corresponds to the backend format. Otherwise, if the :to_file option is
15
- # specified, the file is written to that file. If :to_file is not an absolute
16
- # path, it is resolved relative to :to_dir, if given, otherwise the
17
- # Document#base_dir. If the target directory does not exist, it will not be
18
- # created unless the :mkdirs option is set to true. If the file cannot be
19
- # written because the target directory does not exist, or because it falls
20
- # outside of the Document#base_dir in safe mode, an IOError is raised.
21
- #
22
- # If the output is going to be written to a file, the header and footer are
23
- # included unless specified otherwise (writing to a file implies creating a
24
- # standalone document). Otherwise, the header and footer are not included by
25
- # default and the converted result is returned.
26
- #
27
- # input - the String AsciiDoc source filename
28
- # options - a String, Array or Hash of options to control processing (default: {})
29
- # String and Array values are converted into a Hash.
30
- # See Asciidoctor::Document#initialize for details about options.
31
- #
32
- # Returns the Document object if the converted String is written to a
33
- # file, otherwise the converted String
34
- def convert input, options = {}
35
- (options = options.merge).delete :parse
36
- to_dir = options.delete :to_dir
37
- mkdirs = options.delete :mkdirs
38
-
39
- case (to_file = options.delete :to_file)
40
- when true, nil
41
- unless (write_to_target = to_dir)
42
- sibling_path = ::File.absolute_path input.path if ::File === input
38
+ case (to_file = options.delete :to_file)
39
+ when true, nil
40
+ unless (write_to_target = to_dir)
41
+ sibling_path = ::File.absolute_path input.path if ::File === input
42
+ end
43
+ to_file = nil
44
+ when false
45
+ to_file = nil
46
+ when '/dev/null'
47
+ return load input, options
48
+ else
49
+ options[:to_file] = write_to_target = to_file unless (stream_output = to_file.respond_to? :write)
43
50
  end
44
- to_file = nil
45
- when false
46
- to_file = nil
47
- when '/dev/null'
48
- return load input, options
49
- else
50
- options[:to_file] = write_to_target = to_file unless (stream_output = to_file.respond_to? :write)
51
- end
52
51
 
53
- unless options.key? :standalone
54
- if sibling_path || write_to_target
55
- options[:standalone] = true
56
- elsif options.key? :header_footer
57
- options[:standalone] = options[:header_footer]
52
+ unless options.key? :standalone
53
+ if sibling_path || write_to_target
54
+ options[:standalone] = options.fetch :header_footer, true
55
+ elsif options.key? :header_footer
56
+ options[:standalone] = options[:header_footer]
57
+ end
58
58
  end
59
- end
60
59
 
61
- # NOTE outfile may be controlled by document attributes, so resolve outfile after loading
62
- if sibling_path
63
- options[:to_dir] = outdir = ::File.dirname sibling_path
64
- elsif write_to_target
65
- if to_dir
66
- if to_file
67
- options[:to_dir] = ::File.dirname ::File.expand_path ::File.join to_dir, to_file
68
- else
69
- options[:to_dir] = ::File.expand_path to_dir
60
+ # NOTE outfile may be controlled by document attributes, so resolve outfile after loading
61
+ if sibling_path
62
+ options[:to_dir] = outdir = ::File.dirname sibling_path
63
+ elsif write_to_target
64
+ if to_dir
65
+ if to_file
66
+ options[:to_dir] = ::File.dirname ::File.expand_path to_file, to_dir
67
+ else
68
+ options[:to_dir] = ::File.expand_path to_dir
69
+ end
70
+ elsif to_file
71
+ options[:to_dir] = ::File.dirname ::File.expand_path to_file
70
72
  end
71
- elsif to_file
72
- options[:to_dir] = ::File.dirname ::File.expand_path to_file
73
73
  end
74
- end
75
74
 
76
- # NOTE :to_dir is always set when outputting to a file
77
- # NOTE :to_file option only passed if assigned an explicit path
78
- doc = load input, options
75
+ # NOTE :to_dir is always set when outputting to a file
76
+ # NOTE :to_file option only passed if assigned an explicit path
77
+ doc = load input, options
79
78
 
80
- if sibling_path # write to file in same directory
81
- outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
82
- raise ::IOError, %(input file and output file cannot be the same: #{outfile}) if outfile == sibling_path
83
- elsif write_to_target # write to explicit file or directory
84
- working_dir = (options.key? :base_dir) ? (::File.expand_path options[:base_dir]) : ::Dir.pwd
85
- # QUESTION should the jail be the working_dir or doc.base_dir???
86
- jail = doc.safe >= SafeMode::SAFE ? working_dir : nil
87
- if to_dir
88
- outdir = doc.normalize_system_path(to_dir, working_dir, jail, target_name: 'to_dir', recover: false)
89
- if to_file
90
- outfile = doc.normalize_system_path(to_file, outdir, nil, target_name: 'to_dir', recover: false)
91
- # reestablish outdir as the final target directory (in the case to_file had directory segments)
79
+ if sibling_path # write to file in same directory
80
+ outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
81
+ raise ::IOError, %(input file and output file cannot be the same: #{outfile}) if outfile == sibling_path
82
+ elsif write_to_target # write to explicit file or directory
83
+ working_dir = (options.key? :base_dir) ? (::File.expand_path options[:base_dir]) : ::Dir.pwd
84
+ # QUESTION should the jail be the working_dir or doc.base_dir???
85
+ jail = doc.safe >= SafeMode::SAFE ? working_dir : nil
86
+ if to_dir
87
+ outdir = doc.normalize_system_path(to_dir, working_dir, jail, target_name: 'to_dir', recover: false)
88
+ if to_file
89
+ outfile = doc.normalize_system_path(to_file, outdir, nil, target_name: 'to_dir', recover: false)
90
+ # reestablish outdir as the final target directory (in the case to_file had directory segments)
91
+ outdir = ::File.dirname outfile
92
+ else
93
+ outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
94
+ end
95
+ elsif to_file
96
+ outfile = doc.normalize_system_path(to_file, working_dir, jail, target_name: 'to_dir', recover: false)
97
+ # establish outdir as the final target directory (in the case to_file had directory segments)
92
98
  outdir = ::File.dirname outfile
93
- else
94
- outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
95
99
  end
96
- elsif to_file
97
- outfile = doc.normalize_system_path(to_file, working_dir, jail, target_name: 'to_dir', recover: false)
98
- # establish outdir as the final target directory (in the case to_file had directory segments)
99
- outdir = ::File.dirname outfile
100
- end
101
100
 
102
- if ::File === input && outfile == (::File.absolute_path input.path)
103
- raise ::IOError, %(input file and output file cannot be the same: #{outfile})
101
+ if ::File === input && outfile == (::File.absolute_path input.path)
102
+ raise ::IOError, %(input file and output file cannot be the same: #{outfile})
103
+ end
104
+
105
+ if mkdirs
106
+ Helpers.mkdir_p outdir
107
+ else
108
+ # NOTE we intentionally refer to the directory as it was passed to the API
109
+ raise ::IOError, %(target directory does not exist: #{to_dir} (hint: set :mkdirs option)) unless ::File.directory? outdir
110
+ end
111
+ else # write to stream
112
+ outfile = to_file
113
+ outdir = nil
104
114
  end
105
115
 
106
- if mkdirs
107
- Helpers.mkdir_p outdir
116
+ if outfile && !stream_output
117
+ output = doc.convert 'outfile' => outfile, 'outdir' => outdir
108
118
  else
109
- # NOTE we intentionally refer to the directory as it was passed to the API
110
- raise ::IOError, %(target directory does not exist: #{to_dir} (hint: set :mkdirs option)) unless ::File.directory? outdir
119
+ output = doc.convert
111
120
  end
112
- else # write to stream
113
- outfile = to_file
114
- outdir = nil
115
- end
116
-
117
- if outfile && !stream_output
118
- output = doc.convert 'outfile' => outfile, 'outdir' => outdir
119
- else
120
- output = doc.convert
121
- end
122
121
 
123
- if outfile
124
- doc.write output, outfile
122
+ if outfile
123
+ doc.write output, outfile
125
124
 
126
- # NOTE document cannot control this behavior if safe >= SafeMode::SERVER
127
- # NOTE skip if stylesdir is a URI
128
- if !stream_output && doc.safe < SafeMode::SECURE && (doc.attr? 'linkcss') && (doc.attr? 'copycss') &&
129
- (doc.basebackend? 'html') && !((stylesdir = (doc.attr 'stylesdir')) && (Helpers.uriish? stylesdir))
130
- if (stylesheet = doc.attr 'stylesheet')
131
- if DEFAULT_STYLESHEET_KEYS.include? stylesheet
132
- copy_asciidoctor_stylesheet = true
133
- elsif !(Helpers.uriish? stylesheet)
134
- copy_user_stylesheet = true
135
- end
136
- end
137
- copy_syntax_hl_stylesheet = (syntax_hl = doc.syntax_highlighter) && (syntax_hl.write_stylesheet? doc)
138
- if copy_asciidoctor_stylesheet || copy_user_stylesheet || copy_syntax_hl_stylesheet
139
- stylesoutdir = doc.normalize_system_path(stylesdir, outdir, doc.safe >= SafeMode::SAFE ? outdir : nil)
140
- if mkdirs
141
- Helpers.mkdir_p stylesoutdir
142
- else
143
- raise ::IOError, %(target stylesheet directory does not exist: #{stylesoutdir} (hint: set :mkdirs option)) unless ::File.directory? stylesoutdir
125
+ # NOTE document cannot control this behavior if safe >= SafeMode::SERVER
126
+ # NOTE skip if stylesdir is a URI
127
+ if !stream_output && doc.safe < SafeMode::SECURE && (doc.attr? 'linkcss') && (doc.attr? 'copycss') &&
128
+ (doc.basebackend? 'html') && !((stylesdir = (doc.attr 'stylesdir')) && (Helpers.uriish? stylesdir))
129
+ if (stylesheet = doc.attr 'stylesheet')
130
+ if DEFAULT_STYLESHEET_KEYS.include? stylesheet
131
+ copy_asciidoctor_stylesheet = true
132
+ elsif !(Helpers.uriish? stylesheet)
133
+ copy_user_stylesheet = true
134
+ end
144
135
  end
145
-
146
- if copy_asciidoctor_stylesheet
147
- Stylesheets.instance.write_primary_stylesheet stylesoutdir
148
- # FIXME should Stylesheets also handle the user stylesheet?
149
- elsif copy_user_stylesheet
150
- if (stylesheet_src = doc.attr 'copycss').empty?
151
- stylesheet_src = doc.normalize_system_path stylesheet
136
+ copy_syntax_hl_stylesheet = (syntax_hl = doc.syntax_highlighter) && (syntax_hl.write_stylesheet? doc)
137
+ if copy_asciidoctor_stylesheet || copy_user_stylesheet || copy_syntax_hl_stylesheet
138
+ stylesoutdir = doc.normalize_system_path(stylesdir, outdir, doc.safe >= SafeMode::SAFE ? outdir : nil)
139
+ if mkdirs
140
+ Helpers.mkdir_p stylesoutdir
152
141
  else
153
- # NOTE in this case, copycss is a source location (but cannot be a URI)
154
- stylesheet_src = doc.normalize_system_path stylesheet_src
142
+ raise ::IOError, %(target stylesheet directory does not exist: #{stylesoutdir} (hint: set :mkdirs option)) unless ::File.directory? stylesoutdir
155
143
  end
156
- stylesheet_dest = doc.normalize_system_path stylesheet, stylesoutdir, (doc.safe >= SafeMode::SAFE ? outdir : nil)
157
- # NOTE don't warn if src can't be read and dest already exists (see #2323)
158
- if stylesheet_src != stylesheet_dest && (stylesheet_data = doc.read_asset stylesheet_src,
159
- warn_on_failure: !(::File.file? stylesheet_dest), label: 'stylesheet')
160
- ::File.write stylesheet_dest, stylesheet_data, mode: FILE_WRITE_MODE
144
+
145
+ if copy_asciidoctor_stylesheet
146
+ Stylesheets.instance.write_primary_stylesheet stylesoutdir
147
+ # FIXME should Stylesheets also handle the user stylesheet?
148
+ elsif copy_user_stylesheet
149
+ if (stylesheet_src = doc.attr 'copycss') == '' || stylesheet_src == true
150
+ stylesheet_src = doc.normalize_system_path stylesheet
151
+ else
152
+ # NOTE in this case, copycss is a source location (but cannot be a URI)
153
+ stylesheet_src = doc.normalize_system_path stylesheet_src.to_s
154
+ end
155
+ stylesheet_dest = doc.normalize_system_path stylesheet, stylesoutdir, (doc.safe >= SafeMode::SAFE ? outdir : nil)
156
+ # NOTE don't warn if src can't be read and dest already exists (see #2323)
157
+ if stylesheet_src != stylesheet_dest && (stylesheet_data = doc.read_asset stylesheet_src,
158
+ warn_on_failure: !(::File.file? stylesheet_dest), label: 'stylesheet')
159
+ if (stylesheet_outdir = ::File.dirname stylesheet_dest) != stylesoutdir && !(::File.directory? stylesheet_outdir)
160
+ if mkdirs
161
+ Helpers.mkdir_p stylesheet_outdir
162
+ else
163
+ raise ::IOError, %(target stylesheet directory does not exist: #{stylesheet_outdir} (hint: set :mkdirs option))
164
+ end
165
+ end
166
+ ::File.write stylesheet_dest, stylesheet_data, mode: FILE_WRITE_MODE
167
+ end
161
168
  end
169
+ syntax_hl.write_stylesheet doc, stylesoutdir if copy_syntax_hl_stylesheet
162
170
  end
163
- syntax_hl.write_stylesheet doc, stylesoutdir if copy_syntax_hl_stylesheet
164
171
  end
172
+ doc
173
+ else
174
+ output
165
175
  end
166
- doc
167
- else
168
- output
169
176
  end
170
- end
171
177
 
172
- # Public: Parse the contents of the AsciiDoc source file into an
173
- # Asciidoctor::Document and convert it to the specified backend format.
174
- #
175
- # input - the String AsciiDoc source filename
176
- # options - a String, Array or Hash of options to control processing (default: {})
177
- # String and Array values are converted into a Hash.
178
- # See Asciidoctor::Document#initialize for details about options.
179
- #
180
- # Returns the Document object if the converted String is written to a
181
- # file, otherwise the converted String
182
- def convert_file filename, options = {}
183
- ::File.open(filename, FILE_READ_MODE) {|file| convert file, options }
184
- end
178
+ # Public: Parse the contents of the AsciiDoc source file into an
179
+ # Asciidoctor::Document and convert it to the specified backend format.
180
+ #
181
+ # input - the String AsciiDoc source filename
182
+ # options - a String, Array or Hash of options to control processing (default: {})
183
+ # String and Array values are converted into a Hash.
184
+ # See Asciidoctor::Document#initialize for details about options.
185
+ #
186
+ # Returns the Document object if the converted String is written to a
187
+ # file, otherwise the converted String
188
+ def convert_file filename, options = {}
189
+ ::File.open(filename, FILE_READ_MODE) {|file| convert file, options }
190
+ end
185
191
 
186
- # Deprecated: Use {Asciidoctor.convert} instead.
187
- alias render convert
188
- module_function :render
192
+ # Deprecated: Use {Asciidoctor.convert} instead.
193
+ alias render convert
189
194
 
190
- # Deprecated: Use {Asciidoctor.convert_file} instead.
191
- alias render_file convert_file
192
- module_function :render_file
195
+ # Deprecated: Use {Asciidoctor.convert_file} instead.
196
+ alias render_file convert_file
197
+ end
193
198
  end
@@ -85,23 +85,24 @@ module Converter
85
85
  # Public: Derive backend traits (basebackend, filetype, outfilesuffix, htmlsyntax) from the given backend.
86
86
  #
87
87
  # backend - the String backend from which to derive the traits
88
+ # basebackend - the String basebackend to use in favor of deriving one from the backend (optional, default: nil)
88
89
  #
89
90
  # Returns the backend traits for the given backend as a [Hash].
90
- def self.derive_backend_traits backend
91
+ def self.derive_backend_traits backend, basebackend = nil
91
92
  return {} unless backend
92
- if (t_outfilesuffix = DEFAULT_EXTENSIONS[(t_basebackend = backend.sub TrailingDigitsRx, '')])
93
- t_filetype = t_outfilesuffix.slice 1, t_outfilesuffix.length
93
+ if (outfilesuffix = DEFAULT_EXTENSIONS[(basebackend ||= backend.sub TrailingDigitsRx, '')])
94
+ filetype = outfilesuffix.slice 1, outfilesuffix.length
94
95
  else
95
- t_outfilesuffix = %(.#{t_filetype = t_basebackend})
96
+ outfilesuffix = %(.#{filetype = basebackend})
96
97
  end
97
- t_filetype == 'html' ?
98
- { basebackend: t_basebackend, filetype: t_filetype, htmlsyntax: 'html', outfilesuffix: t_outfilesuffix } :
99
- { basebackend: t_basebackend, filetype: t_filetype, outfilesuffix: t_outfilesuffix }
98
+ filetype == 'html' ?
99
+ { basebackend: basebackend, filetype: filetype, htmlsyntax: 'html', outfilesuffix: outfilesuffix } :
100
+ { basebackend: basebackend, filetype: filetype, outfilesuffix: outfilesuffix }
100
101
  end
101
102
 
102
103
  module BackendTraits
103
104
  def basebackend value = nil
104
- value ? (backend_traits[:basebackend] = value) : backend_traits[:basebackend]
105
+ value ? ((backend_traits value)[:basebackend] = value) : backend_traits[:basebackend]
105
106
  end
106
107
 
107
108
  def filetype value = nil
@@ -128,15 +129,15 @@ module Converter
128
129
  @backend_traits = value || {}
129
130
  end
130
131
 
131
- def backend_traits
132
- @backend_traits ||= Converter.derive_backend_traits @backend
132
+ def backend_traits basebackend = nil
133
+ @backend_traits ||= Converter.derive_backend_traits @backend, basebackend
133
134
  end
134
135
 
135
136
  alias backend_info backend_traits
136
137
 
137
138
  # Deprecated: Use {Converter.derive_backend_traits} instead.
138
- def self.derive_backend_traits backend
139
- Converter.derive_backend_traits backend
139
+ def self.derive_backend_traits backend, basebackend = nil
140
+ Converter.derive_backend_traits backend, basebackend
140
141
  end
141
142
  end
142
143