def table node
has_body = false
result = []
pgwide_attribute = (node.option? 'pgwide') ? ' pgwide="1"' : nil
result << %(<#{tag_name = node.title? ? 'table' : 'informaltable'}#{common_attributes node.id, node.role, node.reftext}#{pgwide_attribute} frame="#{node.attr 'frame', 'all'}" rowsep="#{['none', 'cols'].include?(node.attr 'grid') ? 0 : 1}" colsep="#{['none', 'rows'].include?(node.attr 'grid') ? 0 : 1}">)
if (node.option? 'unbreakable')
result << '<?dbfo keep-together="always"?>'
elsif (node.option? 'breakable')
result << '<?dbfo keep-together="auto"?>'
end
result << %(<title>#{node.title}</title>) if tag_name == 'table'
col_width_key = if (width = (node.attr? 'width') ? (node.attr 'width') : nil)
TABLE_PI_NAMES.each do |pi_name|
result << %(<?#{pi_name} table-width="#{width}"?>)
end
'colabswidth'
else
'colpcwidth'
end
result << %(<tgroup cols="#{node.attr 'colcount'}">)
node.columns.each do |col|
result << %(<colspec colname="col_#{col.attr 'colnumber'}" colwidth="#{col.attr col_width_key}*"/>)
end
TABLE_SECTIONS.select {|tblsec| !node.rows[tblsec].empty? }.each do |tblsec|
has_body = true if tblsec == :body
result << %(<t#{tblsec}>)
node.rows[tblsec].each do |row|
result << '<row>'
row.each do |cell|
halign_attribute = (cell.attr? 'halign') ? %( align="#{cell.attr 'halign'}") : nil
valign_attribute = (cell.attr? 'valign') ? %( valign="#{cell.attr 'valign'}") : nil
colspan_attribute = cell.colspan ? %( namest="col_#{colnum = cell.column.attr 'colnumber'}" nameend="col_#{colnum + cell.colspan - 1}") : nil
rowspan_attribute = cell.rowspan ? %( morerows="#{cell.rowspan - 1}") : nil
entry_start = %(<entry#{halign_attribute}#{valign_attribute}#{colspan_attribute}#{rowspan_attribute}>)
cell_content = if tblsec == :head
cell.text
else
case cell.style
when :asciidoc
cell.content
when :verse
%(<literallayout>#{cell.text}</literallayout>)
when :literal
%(<literallayout class="monospaced">#{cell.text}</literallayout>)
when :header
cell.content.map {|text| %(<simpara><emphasis role="strong">#{text}</emphasis></simpara>) }.join
else
cell.content.map {|text| %(<simpara>#{text}</simpara>) }.join
end
end
entry_end = (node.document.attr? 'cellbgcolor') ? %(<?dbfo bgcolor="#{node.document.attr 'cellbgcolor'}"?></entry>) : '</entry>'
result << %(#{entry_start}#{cell_content}#{entry_end})
end
result << '</row>'
end
result << %(</t#{tblsec}>)
end
result << '</tgroup>'
result << %(</#{tag_name}>)
warn 'asciidoctor: WARNING: tables must have at least one body row' unless has_body
result * EOL
end