def table node
result = []
id_attribute = node.id ? %( id="#{node.id}") : nil
classes = ['tableblock', %(frame-#{node.attr 'frame', 'all'}), %(grid-#{node.attr 'grid', 'all'})]
styles = []
unless (node.option? 'autowidth') && !(node.attr? 'width', nil, false)
if node.attr? 'tablepcwidth', 100
classes << 'spread'
else
styles << %(width: #{node.attr 'tablepcwidth'}%;)
end
end
if (role = node.role)
classes << role
end
class_attribute = %( class="#{classes * ' '}")
styles << %(float: #{node.attr 'float'};) if node.attr? 'float'
style_attribute = styles.empty? ? nil : %( style="#{styles * ' '}")
result << %(<table#{id_attribute}#{class_attribute}#{style_attribute}>)
result << %(<caption class="title">#{node.captioned_title}</caption>) if node.title?
if (node.attr 'rowcount') > 0
slash = @void_element_slash
result << '<colgroup>'
if node.option? 'autowidth'
tag = %(<col#{slash}>)
node.columns.size.times do
result << tag
end
else
node.columns.each do |col|
result << %(<col style="width: #{col.attr 'colpcwidth'}%;"#{slash}>)
end
end
result << '</colgroup>'
node.rows.by_section.each do |tsec, rows|
next if rows.empty?
result << %(<t#{tsec}>)
rows.each do |row|
result << '<tr>'
row.each do |cell|
if tsec == :head
cell_content = cell.text
else
case cell.style
when :asciidoc
cell_content = %(<div>#{cell.content}</div>)
when :verse
cell_content = %(<div class="verse">#{cell.text}</div>)
when :literal
cell_content = %(<div class="literal"><pre>#{cell.text}</pre></div>)
else
cell_content = (cell_content = cell.content).empty? ? '' : %(<p class="tableblock">#{cell_content * '</p>
<p class="tableblock">'}</p>)
end
end
cell_tag_name = (tsec == :head || cell.style == :header ? 'th' : 'td')
cell_class_attribute = %( class="tableblock halign-#{cell.attr 'halign'} valign-#{cell.attr 'valign'}")
cell_colspan_attribute = cell.colspan ? %( colspan="#{cell.colspan}") : nil
cell_rowspan_attribute = cell.rowspan ? %( rowspan="#{cell.rowspan}") : nil
cell_style_attribute = (node.document.attr? 'cellbgcolor') ? %( style="background-color: #{node.document.attr 'cellbgcolor'};") : nil
result << %(<#{cell_tag_name}#{cell_class_attribute}#{cell_colspan_attribute}#{cell_rowspan_attribute}#{cell_style_attribute}>#{cell_content}</#{cell_tag_name}>)
end
result << '</tr>'
end
result << %(</t#{tsec}>)
end
end
result << '</table>'
result * LF
end