def initialize data = nil, options = {}
super self, :document
if (parent_doc = options.delete :parent)
@parent_document = parent_doc
options[:base_dir] ||= parent_doc.base_dir
@catalog = parent_doc.catalog.inject({}) do |accum, (key, table)|
accum[key] = (key == :footnotes ? [] : table)
accum
end
@callouts = parent_doc.callouts
@attribute_overrides = attr_overrides = parent_doc.attributes.dup
parent_doctype = attr_overrides.delete 'doctype'
attr_overrides.delete 'compat-mode'
attr_overrides.delete 'toc'
attr_overrides.delete 'toc-placement'
attr_overrides.delete 'toc-position'
@safe = parent_doc.safe
@attributes['compat-mode'] = '' if (@compat_mode = parent_doc.compat_mode)
@sourcemap = parent_doc.sourcemap
@converter = parent_doc.converter
initialize_extensions = false
@extensions = parent_doc.extensions
else
@parent_document = nil
@catalog = {
:ids => {},
:refs => {},
:footnotes => [],
:links => [],
:images => [],
:indexterms => [],
:includes => ::Set.new,
}
@callouts = Callouts.new
attr_overrides = {}
(options[:attributes] || {}).each do |key, value|
if key.start_with? '!'
key = key[1..-1]
value = nil
elsif key.end_with? '!'
key = key.chop
value = nil
end
attr_overrides[key.downcase] = value
end
@attribute_overrides = attr_overrides
if !(safe_mode = options[:safe])
@safe = SafeMode::SECURE
elsif ::Integer === safe_mode
@safe = safe_mode
else
begin
@safe = SafeMode.value_for_name safe_mode.to_s
rescue
@safe = SafeMode::SECURE
end
end
@compat_mode = attr_overrides.key? 'compat-mode'
@sourcemap = options[:sourcemap]
@converter = nil
initialize_extensions = defined? ::Asciidoctor::Extensions
@extensions = nil
end
@parsed = false
@header = nil
@counters = {}
@attributes_modified = ::Set.new
@docinfo_processor_extensions = {}
header_footer = (options[:header_footer] ||= false)
(@options = options).freeze
attrs = @attributes
attrs['sectids'] = ''
attrs['toc-placement'] = 'auto'
if header_footer
attrs['copycss'] = ''
attr_overrides['embedded'] = nil
else
attrs['notitle'] = ''
attr_overrides['embedded'] = ''
end
attrs['stylesheet'] = ''
attrs['webfonts'] = ''
attrs['prewrap'] = ''
attrs['attribute-undefined'] = Compliance.attribute_undefined
attrs['attribute-missing'] = Compliance.attribute_missing
attrs['iconfont-remote'] = ''
attrs['caution-caption'] = 'Caution'
attrs['important-caption'] = 'Important'
attrs['note-caption'] = 'Note'
attrs['tip-caption'] = 'Tip'
attrs['warning-caption'] = 'Warning'
attrs['example-caption'] = 'Example'
attrs['figure-caption'] = 'Figure'
attrs['table-caption'] = 'Table'
attrs['toc-title'] = 'Table of Contents'
attrs['manname-title'] = 'NAME'
attrs['section-refsig'] = 'Section'
attrs['chapter-refsig'] = 'Chapter'
attrs['appendix-caption'] = attrs['appendix-refsig'] = 'Appendix'
attrs['untitled-label'] = 'Untitled'
attrs['version-label'] = 'Version'
attrs['last-update-label'] = 'Last updated'
attr_overrides['asciidoctor'] = ''
attr_overrides['asciidoctor-version'] = VERSION
attr_overrides['safe-mode-name'] = (safe_mode_name = SafeMode.name_for_value @safe)
attr_overrides["safe-mode-#{safe_mode_name}"] = ''
attr_overrides['safe-mode-level'] = @safe
attr_overrides['max-include-depth'] ||= 64
attr_overrides['allow-uri-read'] ||= nil
attr_overrides['user-home'] = USER_HOME
attr_overrides['sectnums'] = attr_overrides.delete 'numbered' if attr_overrides.key? 'numbered'
if options[:base_dir]
@base_dir = attr_overrides['docdir'] = ::File.expand_path(options[:base_dir])
else
if attr_overrides['docdir']
@base_dir = attr_overrides['docdir'] = ::File.expand_path(attr_overrides['docdir'])
else
@base_dir = attr_overrides['docdir'] = ::File.expand_path(::Dir.pwd)
end
end
if (backend_val = options[:backend])
attr_overrides['backend'] = %(#{backend_val})
end
if (doctype_val = options[:doctype])
attr_overrides['doctype'] = %(#{doctype_val})
end
if @safe >= SafeMode::SERVER
attr_overrides['copycss'] ||= nil
attr_overrides['source-highlighter'] ||= nil
attr_overrides['backend'] ||= DEFAULT_BACKEND
if !parent_doc && attr_overrides.key?('docfile')
attr_overrides['docfile'] = attr_overrides['docfile'][(attr_overrides['docdir'].length + 1)..-1]
end
attr_overrides['docdir'] = ''
attr_overrides['user-home'] = '.'
if @safe >= SafeMode::SECURE
attr_overrides['max-attribute-value-size'] = 4096 unless attr_overrides.key? 'max-attribute-value-size'
unless attr_overrides.fetch('linkcss', '').nil?
attr_overrides['linkcss'] = ''
end
attr_overrides['icons'] ||= nil
end
end
@max_attribute_value_size = (size = (attr_overrides['max-attribute-value-size'] ||= nil)) ? size.to_i.abs : nil
attr_overrides.delete_if do |key, val|
verdict = false
if val.nil?
attrs.delete(key)
else
if ::String === val && (val.end_with? '@')
val = val.chop
verdict = true
end
attrs[key] = val
end
verdict
end
if parent_doc
@backend = attrs['backend']
unless (@doctype = attrs['doctype'] = parent_doctype) == DEFAULT_DOCTYPE
update_doctype_attributes DEFAULT_DOCTYPE
end
@reader = Reader.new data, options[:cursor]
Parser.parse @reader, self
restore_attributes
@parsed = true
else
@backend = nil
if (attrs['backend'] ||= DEFAULT_BACKEND) == 'manpage'
@doctype = attrs['doctype'] = attr_overrides['doctype'] = 'manpage'
else
@doctype = (attrs['doctype'] ||= DEFAULT_DOCTYPE)
end
update_backend_attributes attrs['backend'], true
now = ::ENV['SOURCE_DATE_EPOCH'] ? ::Time.at(Integer ::ENV['SOURCE_DATE_EPOCH']).utc : ::Time.now
if (localdate = attrs['localdate'])
localyear = (attrs['localyear'] ||= ((localdate.index '-') == 4 ? (localdate.slice 0, 4) : nil))
else
localdate = attrs['localdate'] = (now.strftime '%Y-%m-%d')
localyear = (attrs['localyear'] ||= now.year.to_s)
end
localtime = (attrs['localtime'] ||= begin
now.strftime '%H:%M:%S %Z'
rescue
now.strftime '%H:%M:%S %z'
end)
attrs['localdatetime'] ||= %(#{localdate} #{localtime})
attrs['docdate'] ||= localdate
attrs['docyear'] ||= localyear
attrs['doctime'] ||= localtime
attrs['docdatetime'] ||= %(#{localdate} #{localtime})
attrs['stylesdir'] ||= '.'
attrs['iconsdir'] ||= ::File.join(attrs.fetch('imagesdir', './images'), 'icons')
if initialize_extensions
if (ext_registry = options[:extension_registry])
unless Extensions::Registry === ext_registry || (::RUBY_ENGINE_JRUBY &&
::AsciidoctorJ::Extensions::ExtensionRegistry === ext_registry)
ext_registry = Extensions::Registry.new
end
elsif ::Proc === (ext_block = options[:extensions])
ext_registry = Extensions.create(&ext_block)
else
ext_registry = Extensions::Registry.new
end
@extensions = ext_registry.activate self
end
@reader = PreprocessorReader.new self, data, (Reader::Cursor.new attrs['docfile'], @base_dir), :normalize => true
end
end