module Asciidoctor
Public: The main application interface (API) for Asciidoctor
. This API provides methods to parse AsciiDoc content and convert it to various output formats using built-in or third-party converters or Tilt-supported templates.
An AsciiDoc document can be as simple as a single line of content, though it more commonly starts with a document header that declares the document title and document attribute definitions. The document header is then followed by zero or more section titles, optionally nested, to organize the paragraphs, blocks, lists, etc. of the document.
By default, the processor converts the AsciiDoc document to HTML 5 using a built-in converter. However, this behavior can be changed by specifying a different backend (e.g., docbook
). A backend is a keyword for an output format (e.g., DocBook). That keyword, in turn, is used to select a converter, which carries out the request to convert the document to that format.
In addition to this API, Asciidoctor
also provides a command-line interface (CLI) named asciidoctor
for converting AsciiDoc content. See the provided man(ual) page for usage and options.
Examples
# Convert an AsciiDoc file Asciidoctor.convert_file 'document.adoc', safe: :safe # Convert an AsciiDoc string puts Asciidoctor.convert "I'm using *Asciidoctor* version {asciidoctor-version}.", safe: :safe # Convert an AsciiDoc file using Tilt-supported templates Asciidoctor.convert_file 'document.adoc', safe: :safe, template_dir: '/path/to/templates' # Parse an AsciiDoc file into a document object doc = Asciidoctor.load_file 'document.adoc', safe: :safe # Parse an AsciiDoc string into a document object doc = Asciidoctor.load "= Document Title\n\nfirst paragraph\n\nsecond paragraph", safe: :safe
Constants
- ADMONITION_STYLES
- ADMONITION_STYLE_HEADS
- ASCIIDOC_EXTENSIONS
A map of file extensions that are recognized as AsciiDoc documents TODO .txt should be deprecated
- ATTR_REF_HEAD
- AdmonitionParagraphRx
Matches an admonition label at the start of a paragraph.
Examples
NOTE: Just a little note. TIP: Don't forget!
- AnyListRx
Detects the start of any list item.
NOTE we only have to check as far as the blank character because we know it means non-whitespace follows. IMPORTANT if this regexp does not agree with the regexp for each list type, the parser will hang.
- AttributeEntryPassMacroRx
NOTE In JavaScript, ^ and $ match the boundaries of the string when the m flag is not set
- AttributeEntryRx
Matches a document attribute entry.
Examples
:foo: bar :First Name: Dan :sectnums!: :!toc: :long-entry: Attribute value lines ending in ' \' \ are joined together as a single value, \ collapsing the line breaks and indentation to \ a single space.
- AttributeReferenceRx
Matches an inline attribute reference.
Examples
{foobar} or {app_name} or {product-version} {counter:sequence-name:1} {set:foo:bar} {set:name!}
- AtxSectionTitleRx
Matches an Atx (single-line) section title.
Examples
== Foo // ^ a level 1 (h2) section title == Foo == // ^ also a level 1 (h2) section title
- AuthorDelimiterRx
Matches the delimiter that separates multiple authors.
Examples
Doc Writer; Junior Writer
- AuthorInfoLineRx
Matches the author info line immediately following the document title.
Examples
Doc Writer <doc@example.com> Mary_Sue Brontë
- BACKEND_ALIASES
Pointers to the preferred version for a given backend.
- BLOCK_MATH_DELIMITERS
- BOM_BYTES_UTF_16BE
- BOM_BYTES_UTF_16LE
- BOM_BYTES_UTF_8
Byte arrays for UTF-* Byte Order Marks
- BlankLineRx
Matches consecutive blank lines.
Examples
one two
- BlockAnchorRx
Matches an anchor (i.e., id + optional reference text) on a line above a block.
Examples
[[idname]] [[idname,Reference Text]]
- BlockAttributeLineRx
A combined pattern that matches either a block anchor or a block attribute list.
TODO this one gets hit a lot, should be optimized as much as possible
- BlockAttributeListRx
Matches an attribute list above a block element.
Examples
# strictly positional [quote, Adam Smith, Wealth of Nations] # name/value pairs [NOTE, caption="Good to know"] # as attribute reference [{lead}]
- BlockMediaMacroRx
Matches an image, video or audio block macro.
Examples
image::filename.png[Caption] video::http://youtube.com/12345[Cats vs Dogs]
- BlockTitleRx
Matches a title above a block.
Examples
.Title goes here
- BlockTocMacroRx
Matches the TOC block macro.
Examples
toc::[] toc::[levels=2]
- CAPTION_ATTRIBUTE_NAMES
NOTE the ‘figure’ key as a string is historical and used by image blocks
- CC_ALL
CC_ALL
is any character, including newlines (must be accompanied by multiline regexp flag)- CC_ALNUM
- CC_ALPHA
- CC_ANY
CC_ANY
is any character except newlines- CC_EOL
- CC_WORD
- CG_BLANK
- CalloutExtractRx
Matches a callout reference inside literal text.
Examples
<1> (optionally prefixed by //, #, -- or ;; line comment chars) <1> <2> (multiple callouts on one line) <!--1--> (for XML-based languages) <.> (auto-numbered)
NOTE extract regexps are applied line-by-line, so we can use $ as end-of-line char
- CalloutExtractRxMap
- CalloutExtractRxt
- CalloutListRx
Matches a callout list item.
Examples
<1> Explanation
or
<.> Explanation with automatic number
NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
- CalloutScanRx
NOTE special characters have not been replaced when scanning
- CalloutSourceRx
NOTE special characters have already been replaced when converting to an SGML format
- CalloutSourceRxMap
- CalloutSourceRxt
- CellSpecEndRx
- CellSpecStartRx
Parses the start and end of a cell spec (i.e., cellspec) for a table.
Examples
2.3+<.>m
FIXME use step-wise scan (or treetop) rather than this mega-regexp
- ColumnSpecRx
Parses the column spec (i.e., colspec) for a table.
Examples
1*h,2*,^3e
- ConditionalDirectiveRx
Matches a conditional preprocessor directive (e.g., ifdef, ifndef, ifeval and endif).
Examples
ifdef::basebackend-html[] ifndef::theme[] ifeval::["{asciidoctor-version}" >= "0.1.0"] ifdef::asciidoctor[Asciidoctor!] endif::theme[] endif::basebackend-html[] endif::[]
- CustomBlockMacroRx
Matches the custom block macro pattern.
Examples
gist::123456[]
- DATA_DIR
The absolute data directory of the
Asciidoctor
RubyGem- DEFAULT_ATTRIBUTES
- DEFAULT_BACKEND
The backend determines the format of the converted output, default to html5
- DEFAULT_DOCTYPE
The default document type Can influence markup generated by the converters
- DEFAULT_EXTENSIONS
Default extensions for the respective base backends
- DEFAULT_PAGE_WIDTHS
Default page widths for calculating absolute widths
- DEFAULT_STYLESHEET_KEYS
- DEFAULT_STYLESHEET_NAME
- DELIMITED_BLOCKS
- DELIMITED_BLOCK_HEADS
- DELIMITED_BLOCK_TAILS
- DescriptionListRx
Matches a description list entry.
Examples
foo:: bar::: baz:::: blah;; # the term may be followed by a description on the same line... foo:: The metasyntactic variable that commonly accompanies 'bar' (see also, <<bar>>). # ...or on a separate line, which may optionally be indented foo:: The metasyntactic variable that commonly accompanies 'bar' (see also, <<bar>>). # attribute references may be used in both the term and the description {foo-term}:: {foo-desc}
NOTE we know trailing (.*) will match at least one character because we strip trailing spaces NOTE must skip line comment when looking for next list item inside list
- DescriptionListSiblingRx
Matches a sibling description list item (excluding the delimiter specified by the key). NOTE must skip line comment when looking for sibling list item
- EscapedSpaceRx
Matches whitespace (space, tab, newline) escaped by a backslash.
Examples
three\ blind\ mice
- EvalExpressionRx
Matches a restricted (read as safe) eval expression.
Examples
"{asciidoctor-version}" >= "0.1.0"
- ExtAtxSectionTitleRx
Matches an extended Atx section title that includes support for the Markdown variant.
- ExtLayoutBreakRx
Matches an AsciiDoc or Markdown horizontal rule or AsciiDoc page break.
Examples
''' (horizontal rule) <<< (page break) --- or - - - (horizontal rule, Markdown) *** or * * * (horizontal rule, Markdown) ___ or _ _ _ (horizontal rule, Markdown)
- FILE_READ_MODE
The mode to use when opening a file for reading
- FILE_WRITE_MODE
The mode to use when opening a file for writing
- FLEXIBLE_ATTRIBUTES
attributes which be changed throughout the flow of the document (e.g., sectnums)
- FONT_AWESOME_VERSION
- HARD_LINE_BREAK
NOTE AsciiDoc.py allows + to be preceded by
TAB
;Asciidoctor
does not- HIGHLIGHT_JS_VERSION
- HYBRID_LAYOUT_BREAK_CHARS
- HardLineBreakRx
NOTE In JavaScript, ^ and $ only match the start and end of line if the multiline flag is present
- INLINE_MATH_DELIMITERS
- INTRINSIC_ATTRIBUTES
- IncludeDirectiveRx
Matches an include preprocessor directive.
Examples
include::chapter1.ad[] include::example.txt[lines=1;2;5..10]
- InlineAnchorRx
Matches an anchor (i.e., id + optional reference text) in the flow of text.
Examples
[[idname]] [[idname,Reference Text]] anchor:idname[] anchor:idname[Reference Text]
- InlineAnchorScanRx
Scans for a non-escaped anchor (i.e., id + optional reference text) in the flow of text.
- InlineBiblioAnchorRx
Matches a bibliography anchor at the start of the list item text (in a bibliography list).
Examples
[[[Fowler_1997]]] Fowler M. ...
- InlineEmailRx
Matches an inline e-mail address.
doc.writer@example.com
- InlineFootnoteMacroRx
Matches an inline footnote macro, which is allowed to span multiple lines.
Examples
footnote:[text] (not referenceable) footnote:id[text] (referenceable) footnote:id[] (reference) footnoteref:[id,text] (legacy) footnoteref:[id] (legacy)
- InlineImageMacroRx
Matches an image or icon inline macro.
Examples
image:filename.png[Alt Text] image:http://example.com/images/filename.png[Alt Text] image:filename.png[More [Alt\] Text] (alt text becomes "More [Alt] Text") icon:github[large]
NOTE be as non-greedy as possible by not allowing newline or left square bracket in target
- InlineIndextermMacroRx
Matches an indexterm inline macro, which may span multiple lines.
Examples
indexterm:[Tigers,Big cats] (((Tigers,Big cats))) indexterm2:[Tigers] ((Tigers))
- InlineKbdBtnMacroRx
Matches either the kbd or btn inline macro.
Examples
kbd:[F3] kbd:[Ctrl+Shift+T] kbd:[Ctrl+\]] kbd:[Ctrl,T] btn:[Save]
- InlineLinkMacroRx
Match a link or e-mail inline macro.
Examples
link:path[label] mailto:doc.writer@example.com[]
NOTE be as non-greedy as possible by not allowing space or left square bracket in target
- InlineLinkRx
Matches an implicit link and some of the link inline macro.
Examples
https://github.com https://github.com[GitHub] <https://github.com> link:https://github.com[] "https://github.com[]"
FIXME revisit! the main issue is we need different rules for implicit vs explicit
- InlineMenuMacroRx
Matches a menu inline macro.
Examples
menu:File[Save As...] menu:Edit[] menu:View[Page Style > No Style] menu:View[Page Style, No Style]
- InlineMenuRx
Matches an implicit menu inline macro.
Examples
"File > New..."
- InlinePassMacroRx
Matches several variants of the passthrough inline macro, which may span multiple lines.
Examples
+++text+++ $$text$$ pass:quotes[text]
NOTE we have to support an empty pass:[] for compatibility with AsciiDoc.py
- InlinePassRx
Matches an inline passthrough, which may span multiple lines.
Examples
+text+ `text` (compat)
NOTE we always capture the attributes so we know when to use compatible (i.e., legacy) behavior
- InlineSectionAnchorRx
Matches an anchor (i.e., id + optional reference text) inside a section title.
Examples
Section Title [[idname]] Section Title [[idname,Reference Text]]
- InlineStemMacroRx
Matches a stem (and alternatives, asciimath and latexmath) inline macro, which may span multiple lines.
Examples
stem:[x != 0] asciimath:[x != 0] latexmath:[\sqrt{4} = 2]
- InlineXrefMacroRx
Matches an xref (i.e., cross-reference) inline macro, which may span multiple lines.
Examples
<<id,reftext>> xref:id[reftext]
NOTE special characters have already been escaped, hence the entity references NOTE { is included in start characters to support target that begins with attribute reference in title content
- InvalidAttributeNameCharsRx
Matches invalid characters in an attribute name.
- InvalidSectionIdCharsRx
Matches invalid ID characters in a section title.
NOTE uppercase chars not included since expression is only run on a lowercase string
- LAYOUT_BREAK_CHARS
- LF
The newline character used for output; stored in constant table as an optimization
- LIB_DIR
The absolute lib directory of the
Asciidoctor
RubyGem- LINE_CONTINUATION
- LINE_CONTINUATION_LEGACY
- LIST_CONTINUATION
- LeadingInlineAnchorRx
Scans for a leading, non-escaped anchor (i.e., id + optional reference text).
- ListRxMap
A
Hash
of regexps for lists used for dynamic access.- LiteralParagraphRx
Matches a literal paragraph, which is a line of text preceded by at least one space.
Examples
<SPACE>Foo <TAB>Foo
- MARKDOWN_THEMATIC_BREAK_CHARS
- MATHJAX_VERSION
- MAX_INT
Maximum integer value for “boundless” operations; equal to MAX_SAFE_INTEGER in JavaScript
- MacroNameRx
Matches the name of a macro.
- ManpageNamePurposeRx
Matches the name and purpose in the manpage doctype.
Examples
asciidoctor - converts AsciiDoc source files to HTML, DocBook and other formats
- ManpageTitleVolnumRx
Matches the title and volnum in the manpage doctype.
Examples
= asciidoctor(1) = asciidoctor ( 1 )
- MarkdownThematicBreakRx
Matches a Markdown horizontal rule.
Examples
--- or - - - *** or * * * ___ or _ _ _
- NESTABLE_LIST_CONTEXTS
LIST_CONTEXTS = [:ulist, :olist, :dlist, :colist]
- NULL
The null character to use for splitting attribute values
- ORDERED_LIST_KEYWORDS
- ORDERED_LIST_STYLES
TODO validate use of explicit style name above ordered list (this list is for selecting an implicit style)
- OrderedListMarkerRxMap
Matches the ordinals for each type of ordered list.
- OrderedListRx
Matches an ordered list item (explicit numbering or up to 5 consecutive dots).
Examples
. Foo .. Foo 1. Foo (arabic, default) a. Foo (loweralpha) A. Foo (upperalpha) i. Foo (lowerroman) I. Foo (upperroman)
NOTE leading space match is not always necessary, but is used for list reader NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
- PARAGRAPH_STYLES
- QUOTE_SUBS
- REPLACEMENTS
NOTE order of replacements is significant
- ROOT_DIR
The absolute root directory of the
Asciidoctor
RubyGem- RUBY_ENGINE_OPAL
alias the RUBY_ENGINE constant inside the
Asciidoctor
namespace and define a precomputed alias for runtime- ReplaceableTextRx
Detects if text is a possible candidate for the replacements substitution.
- RevisionInfoLineRx
Matches the revision info line, which appears immediately following the author info line beneath the document title.
Examples
v1.0 2013-01-01 v1.0, 2013-01-01: Ring in the new year release 1.0, Jan 01, 2013
- SETEXT_SECTION_LEVELS
- STEM_TYPE_ALIASES
- SectionLevelStyleRx
Matches an explicit section level style like sect1
- SetextSectionTitleRx
Matches the title only (first line) of an Setext (two-line) section title. The title cannot begin with a dot and must have at least one alphanumeric character.
- SinglePlusInlinePassRx
Matches an inline plus passthrough spanning multiple lines, but only when it occurs directly inside constrained monospaced formatting in non-compat mode.
Examples
+text+
- SpaceDelimiterRx
Matches a whitespace delimiter, a sequence of spaces, tabs, and/or newlines. Matches the parsing rules of %w strings in Ruby.
Examples
one two three four five six
TODO change to /(?<!\)[ tn]+/ once lookbehind assertions are implemented in all modern browsers
- SubModifierSniffRx
Matches a + or - modifier in a subs list
- TAB
String
for matching tab character- TagDirectiveRx
Matches a trailing tag directive in an include file.
Examples
// tag::try-catch[] try { someMethod(); catch (Exception e) { log(e); } // end::try-catch[]
NOTE m flag is required for Asciidoctor.js
- TrailingDigitsRx
Matches one or more consecutive digits at the end of a line.
Examples
docbook5 html5
- URI_READ_MODE
The mode to use when opening a URI for reading
- USER_HOME
The user’s home directory, as best we can determine it IMPORTANT this rescue is required for running
Asciidoctor
on GitHub.com- UTF_8
Alias
UTF_8
encoding for convenience / speed- UnorderedListRx
Matches an unordered list item (one level for hyphens, up to 5 levels for asterisks).
Examples
* Foo - Foo
NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
- UriSniffRx
- VERBATIM_STYLES
- VERSION
- XmlSanitizeRx
Detects XML tags
Public Class Methods
Internal: Automatically load the Asciidoctor::Extensions
module.
Requires the Asciidoctor::Extensions
module if the name is :Extensions. Otherwise, delegates to the super method.
This method provides the same functionality as using autoload on Asciidoctor::Extensions
, except that the constant isn’t recognized as defined prior to it being loaded.
Returns the resolved constant, if resolved, otherwise nothing.
# File lib/asciidoctor.rb, line 530 def self.const_missing name if name == :Extensions require_relative 'asciidoctor/extensions' Extensions else super end end
Public: Parse the AsciiDoc source input into an Asciidoctor::Document
and convert it to the specified backend format.
Accepts input as an IO (or StringIO), String
or String
Array
object. If the input is a File, the object is expected to be opened for reading and is not closed afterwards by this method. Information about the file (filename, directory name, etc) gets assigned to attributes on the Document
object.
If the :to_file option is true, and the input is a File, the output is written to a file adjacent to the input file, having an extension that corresponds to the backend format. Otherwise, if the :to_file option is specified, the file is written to that file. If :to_file is not an absolute path, it is resolved relative to :to_dir, if given, otherwise the Document#base_dir
. If the target directory does not exist, it will not be created unless the :mkdirs option is set to true. If the file cannot be written because the target directory does not exist, or because it falls outside of the Document#base_dir
in safe mode, an IOError is raised.
If the output is going to be written to a file, the header and footer are included unless specified otherwise (writing to a file implies creating a standalone document). Otherwise, the header and footer are not included by default and the converted result is returned.
input - the String
AsciiDoc source filename options - a String
, Array
or Hash
of options to control processing (default: {})
String and Array values are converted into a Hash. See Asciidoctor::Document#initialize for details about options.
Returns the Document
object if the converted String
is written to a file, otherwise the converted String
# File lib/asciidoctor/convert.rb, line 34 def convert input, options = {} (options = options.merge).delete :parse to_dir = options.delete :to_dir mkdirs = options.delete :mkdirs case (to_file = options.delete :to_file) when true, nil unless (write_to_target = to_dir) sibling_path = ::File.absolute_path input.path if ::File === input end to_file = nil when false to_file = nil when '/dev/null' return load input, options else options[:to_file] = write_to_target = to_file unless (stream_output = to_file.respond_to? :write) end unless options.key? :standalone if sibling_path || write_to_target options[:standalone] = options.fetch :header_footer, true elsif options.key? :header_footer options[:standalone] = options[:header_footer] end end # NOTE outfile may be controlled by document attributes, so resolve outfile after loading if sibling_path options[:to_dir] = outdir = ::File.dirname sibling_path elsif write_to_target if to_dir if to_file options[:to_dir] = ::File.dirname ::File.expand_path to_file, to_dir else options[:to_dir] = ::File.expand_path to_dir end elsif to_file options[:to_dir] = ::File.dirname ::File.expand_path to_file end end # NOTE :to_dir is always set when outputting to a file # NOTE :to_file option only passed if assigned an explicit path doc = load input, options if sibling_path # write to file in same directory outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix}) raise ::IOError, %(input file and output file cannot be the same: #{outfile}) if outfile == sibling_path elsif write_to_target # write to explicit file or directory working_dir = (options.key? :base_dir) ? (::File.expand_path options[:base_dir]) : ::Dir.pwd # QUESTION should the jail be the working_dir or doc.base_dir??? jail = doc.safe >= SafeMode::SAFE ? working_dir : nil if to_dir outdir = doc.normalize_system_path(to_dir, working_dir, jail, target_name: 'to_dir', recover: false) if to_file outfile = doc.normalize_system_path(to_file, outdir, nil, target_name: 'to_dir', recover: false) # reestablish outdir as the final target directory (in the case to_file had directory segments) outdir = ::File.dirname outfile else outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix}) end elsif to_file outfile = doc.normalize_system_path(to_file, working_dir, jail, target_name: 'to_dir', recover: false) # establish outdir as the final target directory (in the case to_file had directory segments) outdir = ::File.dirname outfile end if ::File === input && outfile == (::File.absolute_path input.path) raise ::IOError, %(input file and output file cannot be the same: #{outfile}) end if mkdirs Helpers.mkdir_p outdir else # NOTE we intentionally refer to the directory as it was passed to the API raise ::IOError, %(target directory does not exist: #{to_dir} (hint: set :mkdirs option)) unless ::File.directory? outdir end else # write to stream outfile = to_file outdir = nil end if outfile && !stream_output output = doc.convert 'outfile' => outfile, 'outdir' => outdir else output = doc.convert end if outfile doc.write output, outfile # NOTE document cannot control this behavior if safe >= SafeMode::SERVER # NOTE skip if stylesdir is a URI if !stream_output && doc.safe < SafeMode::SECURE && (doc.attr? 'linkcss') && (doc.attr? 'copycss') && (doc.basebackend? 'html') && !((stylesdir = (doc.attr 'stylesdir')) && (Helpers.uriish? stylesdir)) if (stylesheet = doc.attr 'stylesheet') if DEFAULT_STYLESHEET_KEYS.include? stylesheet copy_asciidoctor_stylesheet = true elsif !(Helpers.uriish? stylesheet) copy_user_stylesheet = true end end copy_syntax_hl_stylesheet = (syntax_hl = doc.syntax_highlighter) && (syntax_hl.write_stylesheet? doc) if copy_asciidoctor_stylesheet || copy_user_stylesheet || copy_syntax_hl_stylesheet stylesoutdir = doc.normalize_system_path(stylesdir, outdir, doc.safe >= SafeMode::SAFE ? outdir : nil) if mkdirs Helpers.mkdir_p stylesoutdir else raise ::IOError, %(target stylesheet directory does not exist: #{stylesoutdir} (hint: set :mkdirs option)) unless ::File.directory? stylesoutdir end if copy_asciidoctor_stylesheet Stylesheets.instance.write_primary_stylesheet stylesoutdir # FIXME should Stylesheets also handle the user stylesheet? elsif copy_user_stylesheet if (stylesheet_src = doc.attr 'copycss') == '' || stylesheet_src == true stylesheet_src = doc.normalize_system_path stylesheet else # NOTE in this case, copycss is a source location (but cannot be a URI) stylesheet_src = doc.normalize_system_path stylesheet_src.to_s end stylesheet_dest = doc.normalize_system_path stylesheet, stylesoutdir, (doc.safe >= SafeMode::SAFE ? outdir : nil) # NOTE don't warn if src can't be read and dest already exists (see #2323) if stylesheet_src != stylesheet_dest && (stylesheet_data = doc.read_asset stylesheet_src, warn_on_failure: !(::File.file? stylesheet_dest), label: 'stylesheet') if (stylesheet_outdir = ::File.dirname stylesheet_dest) != stylesoutdir && !(::File.directory? stylesheet_outdir) if mkdirs Helpers.mkdir_p stylesheet_outdir else raise ::IOError, %(target stylesheet directory does not exist: #{stylesheet_outdir} (hint: set :mkdirs option)) end end ::File.write stylesheet_dest, stylesheet_data, mode: FILE_WRITE_MODE end end syntax_hl.write_stylesheet doc, stylesoutdir if copy_syntax_hl_stylesheet end end doc else output end end
Public: Parse the contents of the AsciiDoc source file into an Asciidoctor::Document
and convert it to the specified backend format.
input - the String
AsciiDoc source filename options - a String
, Array
or Hash
of options to control processing (default: {})
String and Array values are converted into a Hash. See Asciidoctor::Document#initialize for details about options.
Returns the Document
object if the converted String
is written to a file, otherwise the converted String
# File lib/asciidoctor/convert.rb, line 189 def convert_file filename, options = {} ::File.open(filename, FILE_READ_MODE) {|file| convert file, options } end
Public: Parse the AsciiDoc source input into a {Document}
Accepts input as an IO (or StringIO), String
or String
Array
object. If the input is a File, the object is expected to be opened for reading and is not closed afterwards by this method. Information about the file (filename, directory name, etc) gets assigned to attributes on the Document
object.
input - the AsciiDoc source as a IO, String
or Array
. options - a String
, Array
or Hash
of options to control processing (default: {})
String and Array values are converted into a Hash. See {Document#initialize} for details about these options.
Returns the Document
# File lib/asciidoctor/load.rb, line 17 def load input, options = {} options = options.merge if (timings = options[:timings]) timings.start :read end if (options.key? :logger) && (logger = options[:logger]) != LoggerManager.logger LoggerManager.logger = logger || NullLogger.new end if !(attrs = options[:attributes]) attrs = {} elsif ::Hash === attrs attrs = attrs.merge elsif (defined? ::Java::JavaUtil::Map) && ::Java::JavaUtil::Map === attrs attrs = attrs.dup elsif ::Array === attrs attrs = {}.tap do |accum| attrs.each do |entry| k, _, v = entry.partition '=' accum[k] = v end end elsif ::String === attrs # condense and convert non-escaped spaces to null, unescape escaped spaces, then split on null attrs = {}.tap do |accum| attrs.gsub(SpaceDelimiterRx, '\1' + NULL).gsub(EscapedSpaceRx, '\1').split(NULL).each do |entry| k, _, v = entry.partition '=' accum[k] = v end end elsif (attrs.respond_to? :keys) && (attrs.respond_to? :[]) # coerce attrs to a real Hash attrs = {}.tap {|accum| attrs.keys.each {|k| accum[k] = attrs[k] } } else raise ::ArgumentError, %(illegal type for attributes option: #{attrs.class.ancestors.join ' < '}) end if ::File === input # File#mtime on JRuby 9.1 for Windows doesn't honor TZ environment variable; see https://github.com/jruby/jruby/issues/6659 options[:input_mtime] = RUBY_ENGINE == 'jruby' ? (::Time.at input.mtime.to_i) : input.mtime # NOTE defer setting infile and indir until we get a better sense of their purpose # TODO cli checks if input path can be read and is file, but might want to add check to API too attrs['docfile'] = input_path = ::File.absolute_path input.path attrs['docdir'] = ::File.dirname input_path attrs['docname'] = Helpers.basename input_path, (attrs['docfilesuffix'] = Helpers.extname input_path) source = input.read elsif input.respond_to? :read # NOTE tty, pipes & sockets can't be rewound, but can't be sniffed easily either # just fail the rewind operation silently to handle all cases input.rewind rescue nil source = input.read elsif ::String === input source = input elsif ::Array === input source = input.drop 0 elsif input raise ::ArgumentError, %(unsupported input type: #{input.class}) end if timings timings.record :read timings.start :parse end options[:attributes] = attrs doc = options[:parse] == false ? (Document.new source, options) : (Document.new source, options).parse timings.record :parse if timings doc rescue => e begin context = %(asciidoctor: FAILED: #{attrs['docfile'] || '<stdin>'}: Failed to load AsciiDoc document) if e.respond_to? :exception # The original message must be explicitly preserved when wrapping a Ruby exception wrapped_e = e.exception %(#{context} - #{e.message}) # JRuby automatically sets backtrace; MRI did not until 2.6 wrapped_e.set_backtrace e.backtrace else # Likely a Java exception class wrapped_e = e.class.new context, e wrapped_e.stack_trace = e.stack_trace end rescue wrapped_e = e end raise wrapped_e end
Public: Parse the contents of the AsciiDoc source file into an Asciidoctor::Document
input - the String
AsciiDoc source filename options - a String
, Array
or Hash
of options to control processing (default: {})
String and Array values are converted into a Hash. See Asciidoctor::Document#initialize for details about options.
Returns the Asciidoctor::Document
# File lib/asciidoctor/load.rb, line 115 def load_file filename, options = {} ::File.open(filename, FILE_READ_MODE) {|file| load file, options } end
Deprecated: Use {Asciidoctor.convert_file} instead.