)
result << %() if node.attr? 'app-name'
result << %() if node.attr? 'description'
result << %() if node.attr? 'keywords'
result << %() if node.attr? 'authors'
result << %() if node.attr? 'copyright'
result << %(#{node.doctitle :sanitize => true, :use_fallback => true})
if DEFAULT_STYLESHEET_KEYS.include?(node.attr 'stylesheet')
if (webfonts = node.attr 'webfonts')
result << %()
end
if linkcss
result << %()
else
result << @stylesheets.embed_primary_stylesheet
end
elsif node.attr? 'stylesheet'
if linkcss
result << %()
else
result << %()
end
end
if node.attr? 'icons', 'font'
if node.attr? 'iconfont-remote'
result << %()
else
iconfont_stylesheet = %(#{node.attr 'iconfont-name', 'font-awesome'}.css)
result << %()
end
end
case node.attr 'source-highlighter'
when 'coderay'
if (node.attr 'coderay-css', 'class') == 'class'
if linkcss
result << %()
else
result << @stylesheets.embed_coderay_stylesheet
end
end
when 'pygments'
if (node.attr 'pygments-css', 'class') == 'class'
pygments_style = node.attr 'pygments-style'
if linkcss
result << %()
else
result << (@stylesheets.embed_pygments_stylesheet pygments_style)
end
end
when 'highlightjs', 'highlight.js'
highlightjs_path = node.attr 'highlightjsdir', %(#{cdn_base}/highlight.js/8.4)
result << %(
)
when 'prettify'
prettify_path = node.attr 'prettifydir', %(#{cdn_base}/prettify/r298)
result << %(
)
end
if node.attr? 'stem'
# IMPORTANT to_s calls on delimiter arrays are intentional for JavaScript compat (emulates JSON.stringify)
eqnums_val = node.attr 'eqnums', 'none'
eqnums_val = 'AMS' if eqnums_val == ''
eqnums_opt = %( equationNumbers: { autoNumber: "#{eqnums_val}" } )
result << %(
)
end
unless (docinfo_content = node.docinfo).empty?
result << docinfo_content
end
result << ''
body_attrs = []
if node.id
body_attrs << %(id="#{node.id}")
end
if (node.attr? 'toc-class') && (node.attr? 'toc') && (node.attr? 'toc-placement', 'auto')
body_attrs << %(class="#{node.doctype} #{node.attr 'toc-class'} toc-#{node.attr 'toc-position', 'header'}")
else
body_attrs << %(class="#{node.doctype}")
end
if node.attr? 'max-width'
body_attrs << %(style="max-width: #{node.attr 'max-width'};")
end
result << %()
unless node.noheader
result << '
'
if node.doctype == 'manpage'
result << %(
#{node.doctitle} Manual Page
)
if (node.attr? 'toc') && (node.attr? 'toc-placement', 'auto')
result << %(
) unless node.notitle
details = []
if node.attr? 'author'
details << %(#{node.attr 'author'}#{br})
if node.attr? 'email'
details << %(#{node.sub_macros(node.attr 'email')}#{br})
end
if (authorcount = (node.attr 'authorcount').to_i) > 1
(2..authorcount).each do |idx|
details << %(#{node.attr "author_#{idx}"}#{br})
if node.attr? %(email_#{idx})
details << %(#{node.sub_macros(node.attr "email_#{idx}")}#{br})
end
end
end
end
if node.attr? 'revnumber'
details << %(#{((node.attr 'version-label') || '').downcase} #{node.attr 'revnumber'}#{(node.attr? 'revdate') ? ',' : ''})
end
if node.attr? 'revdate'
details << %(#{node.attr 'revdate'})
end
if node.attr? 'revremark'
details << %(#{br}#{node.attr 'revremark'})
end
unless details.empty?
result << '
'
result.concat details
result << '
'
end
end
if (node.attr? 'toc') && (node.attr? 'toc-placement', 'auto')
result << %(
#{node.attr 'toc-title'}
#{outline node}
)
end
end
result << '
'
end
result << %(
#{node.content}
)
if node.footnotes? && !(node.attr? 'nofootnotes')
result << %(
'
end
unless node.nofooter
result << ''
end
result << ''
result << ''
result * EOL
end
def embedded node
result = []
if !node.notitle && node.has_header?
id_attr = node.id ? %( id="#{node.id}") : nil
result << %(
#{node.header.title}
)
end
result << node.content
if node.footnotes? && !(node.attr? 'nofootnotes')
result << %(
'
end
result * EOL
end
def outline node, opts = {}
return if (sections = node.sections).empty?
sectnumlevels = opts[:sectnumlevels] || (node.document.attr 'sectnumlevels', 3).to_i
toclevels = opts[:toclevels] || (node.document.attr 'toclevels', 2).to_i
result = []
# FIXME the level for special sections should be set correctly in the model
# slevel will only be 0 if we have a book doctype with parts
slevel = (first_section = sections[0]).level
slevel = 1 if slevel == 0 && first_section.special
result << %(
) if node.title?
if node.document.attr? 'icons'
result << '
'
font_icons = node.document.attr? 'icons', 'font'
node.items.each_with_index do |item, i|
num = i + 1
num_element = if font_icons
%(#{num})
else
%()
end
result << %(
#{num_element}
#{item.text}
)
end
result << '
'
else
result << ''
node.items.each do |item|
result << %(
#{item.text}
)
end
result << ''
end
result << '
'
result * EOL
end
def dlist node
result = []
id_attribute = node.id ? %( id="#{node.id}") : nil
classes = case node.style
when 'qanda'
['qlist', 'qanda', node.role]
when 'horizontal'
['hdlist', node.role]
else
['dlist', node.style, node.role]
end.compact
class_attribute = %( class="#{classes * ' '}")
result << %(
)
result << %(
#{node.title}
) if node.title?
case node.style
when 'qanda'
result << ''
node.items.each do |terms, dd|
result << '
'
[*terms].each do |dt|
result << %(
#{dt.text}
)
end
if dd
result << %(
#{dd.text}
) if dd.text?
result << dd.content if dd.blocks?
end
result << '
'
end
result << ''
when 'horizontal'
slash = @void_element_slash
result << '
'
if (node.attr? 'labelwidth') || (node.attr? 'itemwidth')
result << '
) if node.title?
type_attribute = (keyword = node.list_marker_keyword) ? %( type="#{keyword}") : nil
start_attribute = (node.attr? 'start') ? %( start="#{node.attr 'start'}") : nil
result << %()
node.items.each do |item|
result << '
'
result << %(
#{item.text}
)
result << item.content if item.blocks?
result << '
'
end
result << ''
result << '
'
result * EOL
end
def open node
if (style = node.style) == 'abstract'
if node.parent == node.document && node.document.doctype == 'book'
warn 'asciidoctor: WARNING: abstract block cannot be used in a document without a title when doctype is book. Excluding block content.'
''
else
id_attr = node.id ? %( id="#{node.id}") : nil
title_el = node.title? ? %(
#{node.title}
) : nil
%(
#{title_el}
#{node.content}
)
end
elsif style == 'partintro' && (node.level != 0 || node.parent.context != :section || node.document.doctype != 'book')
warn 'asciidoctor: ERROR: partintro block can only be used when doctype is book and it\'s a child of a book part. Excluding block content.'
''
else
id_attr = node.id ? %( id="#{node.id}") : nil
title_el = node.title? ? %(
#{node.title}
) : nil
%(
#{title_el}
#{node.content}
)
end
end
def page_break node
''
end
def paragraph node
attributes = if node.id
if node.role
%( id="#{node.id}" class="paragraph #{node.role}")
else
%( id="#{node.id}" class="paragraph")
end
elsif node.role
%( class="paragraph #{node.role}")
else
' class="paragraph"'
end
if node.title?
%(
#{node.title}
#{node.content}
)
else
%(
#{node.content}
)
end
end
def preamble node
toc = if (node.attr? 'toc') && (node.attr? 'toc-placement', 'preamble')
%(\n