def initialize(data = [], options = {}, &block)
super(self, :document)
@renderer = nil
if options[:parent]
@parent_document = options.delete(:parent)
options[:attributes] = @parent_document.attributes
options[:base_dir] ||= @parent_document.base_dir
@safe = @parent_document.safe
@renderer = @parent_document.renderer
else
@parent_document = nil
@safe = nil
end
@header = nil
@references = {
:ids => {},
:footnotes => [],
:links => [],
:images => [],
:indexterms => []
}
@counters = {}
@callouts = Callouts.new
@options = options
if @safe.nil? && !(safe_mode = @options[:safe])
@safe = SafeMode::SECURE
elsif safe_mode.is_a?(Fixnum)
@safe = safe_mode
else
begin
@safe = SafeMode.const_get(safe_mode.to_s.upcase).to_i
rescue
@safe = SafeMode::SECURE.to_i
end
end
@options[:header_footer] = @options.fetch(:header_footer, false)
@attributes['encoding'] = 'UTF-8'
@attributes['sectids'] = ''
@attributes['notitle'] = '' unless @options[:header_footer]
@attributes['toc-placement'] = 'auto'
@attributes['stylesheet'] = ''
@attributes['linkcss'] = ''
@attributes['caution-caption'] = 'Caution'
@attributes['important-caption'] = 'Important'
@attributes['note-caption'] = 'Note'
@attributes['tip-caption'] = 'Tip'
@attributes['warning-caption'] = 'Warning'
@attributes['appendix-caption'] = 'Appendix'
@attributes['example-caption'] = 'Example'
@attributes['figure-caption'] = 'Figure'
@attributes['table-caption'] = 'Table'
@attributes['toc-title'] = 'Table of Contents'
@attribute_overrides = options[:attributes] || {}
@attribute_overrides['asciidoctor'] = ''
@attribute_overrides['asciidoctor-version'] = VERSION
safe_mode_name = SafeMode.constants.detect {|l| SafeMode.const_get(l) == @safe}.to_s.downcase
@attribute_overrides['safe-mode-name'] = safe_mode_name
@attribute_overrides["safe-mode-#{safe_mode_name}"] = ''
@attribute_overrides['safe-mode-level'] = @safe
@attribute_overrides['embedded'] = @options[:header_footer] ? nil : ''
@attribute_overrides['include-depth'] ||= 10
if options[:base_dir].nil?
if @attribute_overrides['docdir']
@base_dir = @attribute_overrides['docdir'] = File.expand_path(@attribute_overrides['docdir'])
else
@base_dir = @attribute_overrides['docdir'] = File.expand_path(Dir.pwd)
end
else
@base_dir = @attribute_overrides['docdir'] = File.expand_path(options[:base_dir])
end
unless @options[:backend].nil?
@attribute_overrides['backend'] = @options[:backend].to_s
end
unless @options[:doctype].nil?
@attribute_overrides['doctype'] = @options[:doctype].to_s
end
if @safe >= SafeMode::SERVER
@attribute_overrides['copycss'] ||= nil
@attribute_overrides['source-highlighter'] ||= nil
@attribute_overrides['backend'] ||= DEFAULT_BACKEND
if @attribute_overrides.has_key?('docfile') && @parent_document.nil?
@attribute_overrides['docfile'] = @attribute_overrides['docfile'][(@attribute_overrides['docdir'].length + 1)..-1]
end
@attribute_overrides['docdir'] = ''
if @safe >= SafeMode::SECURE
unless @attribute_overrides.fetch('linkcss', '').nil? || @attribute_overrides.has_key?('linkcss!')
@attribute_overrides['linkcss'] = ''
end
@attribute_overrides['icons'] ||= nil
end
end
@attribute_overrides.delete_if {|key, val|
verdict = false
if val.nil?
@attributes.delete(key)
elsif key.end_with? '!'
@attributes.delete(key[0..-2])
else
if val.is_a?(String) && val.end_with?('@')
val.chop!
verdict = true
end
@attributes[key] = val
end
verdict
}
@attributes['backend'] ||= DEFAULT_BACKEND
@attributes['doctype'] ||= DEFAULT_DOCTYPE
update_backend_attributes
if !@parent_document.nil?
@reader = Reader.new(data)
else
@reader = Reader.new(data, self, true, &block)
end
now = Time.new
@attributes['localdate'] ||= now.strftime('%Y-%m-%d')
@attributes['localtime'] ||= now.strftime('%H:%M:%S %Z')
@attributes['localdatetime'] ||= [@attributes['localdate'], @attributes['localtime']] * ' '
@attributes['docdate'] ||= @attributes['localdate']
@attributes['doctime'] ||= @attributes['localtime']
@attributes['docdatetime'] ||= @attributes['localdatetime']
@attributes['stylesdir'] ||= '.'
@attributes['iconsdir'] ||= File.join(@attributes.fetch('imagesdir', './images'), 'icons')
Lexer.parse(@reader, self, :header_only => @options.fetch(:parse_header_only, false))
@callouts.rewind
end