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}"#{(node.attr? 'orientation', 'landscape', nil) ? ' orient="land"' : nil}>)
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
node.rows.by_section.each do |tsec, rows|
next if rows.empty?
has_body = true if tsec == :body
result << %(<t#{tsec}>)
rows.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}>)
if tsec == :head
cell_content = cell.text
else
case cell.style
when :asciidoc
cell_content = cell.content
when :verse
cell_content = %(<literallayout>#{cell.text}</literallayout>)
when :literal
cell_content = %(<literallayout class="monospaced">#{cell.text}</literallayout>)
when :header
cell_content = (cell_content = cell.content).empty? ? '' : %(<simpara><emphasis role="strong">#{cell_content * '</emphasis></simpara><simpara><emphasis role="strong">'}</emphasis></simpara>)
else
cell_content = (cell_content = cell.content).empty? ? '' : %(<simpara>#{cell_content * '</simpara><simpara>'}</simpara>)
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#{tsec}>)
end
result << '</tgroup>'
result << %(</#{tag_name}>)
warn 'asciidoctor: WARNING: tables must have at least one body row' unless has_body
result * LF
end