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
@references = parent_doc.references.inject({}) do |accum, (key,ref)|
if key == :footnotes
accum[:footnotes] = []
else
accum[key] = ref
end
accum
end
@callouts = parent_doc.callouts
attr_overrides = parent_doc.attributes.dup
['doctype', 'compat-mode', 'toc', 'toc-placement', 'toc-position'].each do |key|
attr_overrides.delete key
end
@attribute_overrides = attr_overrides
@safe = parent_doc.safe
@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
@references = {
:ids => {},
: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 ::Fixnum === safe_mode
@safe = safe_mode
else
begin
@safe = SafeMode.const_get(safe_mode.to_s.upcase)
rescue
@safe = SafeMode::SECURE
end
end
@sourcemap = options[:sourcemap]
@compat_mode = false
@converter = nil
initialize_extensions = defined? ::Asciidoctor::Extensions
@extensions = nil
end
@parsed = false
@header = nil
@counters = {}
@attributes_modified = ::Set.new
@options = options
@docinfo_processor_extensions = {}
header_footer = (options[:header_footer] ||= false)
options.freeze
attrs = @attributes
attrs['sectids'] = ''
attrs['notitle'] = '' unless header_footer
attrs['toc-placement'] = 'auto'
attrs['stylesheet'] = ''
attrs['webfonts'] = ''
attrs['copycss'] = '' if header_footer
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['appendix-caption'] = 'Appendix'
attrs['example-caption'] = 'Example'
attrs['figure-caption'] = 'Figure'
attrs['table-caption'] = 'Table'
attrs['toc-title'] = 'Table of Contents'
attrs['manname-title'] = 'NAME'
attrs['untitled-label'] = 'Untitled'
attrs['version-label'] = 'Version'
attrs['last-update-label'] = 'Last updated'
attr_overrides['asciidoctor'] = ''
attr_overrides['asciidoctor-version'] = VERSION
safe_mode_name = SafeMode.constants.detect {|l| SafeMode.const_get(l) == @safe }.to_s.downcase
attr_overrides['safe-mode-name'] = safe_mode_name
attr_overrides["safe-mode-#{safe_mode_name}"] = ''
attr_overrides['safe-mode-level'] = @safe
attr_overrides['embedded'] = header_footer ? nil : ''
attr_overrides['max-include-depth'] ||= 64
unless !attr_overrides['allow-uri-read'].nil?
attr_overrides['allow-uri-read'] = nil
end
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
unless attr_overrides.fetch('linkcss', '').nil?
attr_overrides['linkcss'] = ''
end
attr_overrides['icons'] ||= nil
end
end
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
@compat_mode = true if attrs.key? 'compat-mode'
if parent_doc
attrs['doctype'] ||= DEFAULT_DOCTYPE
@reader = Reader.new data, options[:cursor]
Parser.parse @reader, self
restore_attributes
@parsed = true
else
if (attrs['backend'] ||= DEFAULT_BACKEND) == 'manpage'
attrs['doctype'] = attr_overrides['doctype'] = 'manpage'
else
attrs['doctype'] ||= DEFAULT_DOCTYPE
end
update_backend_attributes attrs['backend'], true
now = ::Time.now
localdate = (attrs['localdate'] ||= now.strftime('%Y-%m-%d'))
unless (localtime = attrs['localtime'])
begin
localtime = attrs['localtime'] = now.strftime('%H:%M:%S %Z')
rescue
localtime = attrs['localtime'] = now.strftime('%H:%M:%S')
end
end
attrs['localdatetime'] ||= %(#{localdate} #{localtime})
attrs['docdate'] ||= localdate
attrs['doctime'] ||= localtime
attrs['docdatetime'] ||= %(#{localdate} #{localtime})
attrs['stylesdir'] ||= '.'
attrs['iconsdir'] ||= ::File.join(attrs.fetch('imagesdir', './images'), 'icons')
if initialize_extensions
if (registry = options[:extensions_registry])
if Extensions::Registry === registry || (::RUBY_ENGINE_JRUBY &&
::AsciidoctorJ::Extensions::ExtensionRegistry === registry)
else
registry = Extensions::Registry.new
end
elsif ::Proc === (ext_block = options[:extensions])
registry = Extensions.build_registry(&ext_block)
else
registry = Extensions::Registry.new
end
@extensions = registry.activate self
end
@reader = PreprocessorReader.new self, data, Reader::Cursor.new(attrs['docfile'], @base_dir)
end
end