module NoraMark
module Html
def self.default_transformer
transformer = TransformerFactory.create do
rename 'd', 'div'
rename 'art', 'article'
rename 'arti', 'article'
rename 'sec', 'section'
rename 'sect', 'section'
rename 'sp', 'span'
modify({type: :Root}) do
if (@options[:render_parameter] ||= {})[:nonpaged]
first_page = @node.first_child.remove
@node.children.each do |node|
if node.class == NoraMark::Page
first_page.append_child block('hr', classes: ['page-break'], body_empty: true)
node.remove
node.children.each do |cn|
first_page.append_child cn
end
else
first_page.append_child node
end
end
@node.prepend_child first_page
end
end
modify(/\A(l|link)\Z/) do
@node.name = 'a'
(@node.attrs ||= {}).merge!({href: [@node.params[0].text]})
end
replace 'noescape' do
node = text(@node.text)
node.noescape = true
node
end
modify 'ruby' do
@node.append_child inline 'rp', '('
@node.append_child inline 'rt', escape_html(@node.params[0].text.strip)
@node.append_child inline 'rp', ')'
end
modify 'tcy' do
@node.name = 'span'
@node.classes = ['tcy']
end
modify 'img' do
@node.body_empty = true
@node.attrs ||= {}
@node.attrs.merge!({src: [@node.params[0].text ]}) if @node.attrs[:src].nil?
@node.attrs.merge!({alt: [ escape_html(@node.params[1].text.strip)]}) if (@node.attrs[:alt].nil? && @node.p.size > 1 && @node.params[1].text.size > 0)
end
replace 'image' do
imagenode = inline('img', nil,
body_empty: true,
attrs: {src: [ @node.params[0].text.strip], alt: [ (@node.params[1].text ||'').strip ] })
newnode = block('figure',
class_if_empty:'img-wrap',
ids: @node.ids,
children: [ imagenode],
template: @node)
if !@node.children_empty?
if @node.n[:caption_before]
newnode.prepend_child inline('figcaption', @node.children)
else
newnode.append_child inline('figcaption', @node.children)
end
end
newnode
end
replace({type: :OrderedList}) do
block('ol', template: @node)
end
replace({type: :UnorderedList}) do
block('ul', template: @node)
end
replace({type: :UlItem}) do
block('li', template: @node)
end
replace({type: :OlItem}) do
block('li', template: @node)
end
replace({type: :DefinitionList}) do
block('dl', template: @node)
end
replace({type: :DLItem}) do
[
block('dt', @node.p[0], n: {chop_last_space: true}),
block('dd', @node.children)
]
end
replace({type: :Breakline}) do
newnode = block('br')
newnode.body_empty = true
newnode
end
replace({type: :HeadedSection}) do
if @node.named_params[:without_header]
content = @node.children
else
content = [ block("h#{@node.level}", @node.heading, ids: @node.n[:heading_id], n: {chop_last_space: true}) ] + @node.children
end
block('section', content, template: @node)
end
replace ({type: :CodeInline}) do
inline('code', @node.content, line_no: @node.line_no, template: @node)
end
replace ({type: :PreformattedBlock}) do
new_node = block('pre')
if @node.codelanguage
new_node.attrs = @node.attrs
new_node.add_attr 'data-code-language' => [@node.codelanguage]
new_node.classes = (@node.classes ||[]) << "code-#{@node.codelanguage}"
end
if @node.name == 'code'
code = block('code', text(@node.content.join("\n"), raw_text: true))
new_node.children = [ code ]
else
new_node.children = [ text(@node.content.join("\n"), raw_text: true) ]
end
if (@node.p || []).size> 0
method = @node.n[:caption_after] ? :prepend : :append
new_node = new_node.wrap block('div', classes: ['pre'], children: [ block('p', children: @node.p.shift, classes: ['caption']) ]), method
end
new_node
end
modify 'video' do
@node.attrs ||= {}
@node.attrs.merge!({src: [@node.p.shift.text]})
@node.attrs.merge!({poster: [@node.n[:poster]]}) unless @node.n[:poster].nil?
options = @node.p.map { |opt| opt.text.strip }
['autoplay', 'controls', 'loop', 'muted'].each do
|attr|
@node.attrs.merge!({attr.to_sym => true}) if options.member? attr
end
end
modify 'audio' do
@node.attrs ||= {}
@node.attrs.merge!({src: [@node.p.shift.text]})
@node.attrs.merge!({volume: [@node.n[:volume]]}) unless @node.n[:volume].nil?
options = @node.p.map { |opt| opt.text.strip }
['autoplay', 'controls', 'loop', 'muted'].each do
|attr|
@node.attrs.merge!({attr.to_sym => true}) if options.member? attr
end
end
end
transformer.extend Util
transformer
end
end
end