resources/asciidoctor/lib/docbook_compat/convert_table.rb (99 lines of code) (raw):
# frozen_string_literal: true
require_relative '../strip_tags'
require_relative 'convert_table_cell'
module DocbookCompat
##
# Methods to convert tables.
module ConvertTable
include ConvertTableCell
include StripTags
def convert_table(node)
[
convert_table_intro(node),
convert_table_tag(node, 1),
convert_colgroups(node),
convert_parts(node),
'</table>',
convert_table_outro(node),
].flatten.join "\n"
end
def convert_table_intro(node)
return convert_table_informal_intro node unless node.title
result = ['<div class="table">']
result << %(<a id="#{node.id}"></a>) if node.id
if node.title
title = node.captioned_title
result << %(<p class="title"><strong>#{title}</strong></p>)
end
result << '<div class="table-contents">'
result
end
def convert_table_informal_intro(node)
[
'<div class="informaltable">',
node.id ? %(<a id="#{node.id}"></a>) : nil,
].compact
end
def convert_table_outro(node)
return '</div>' unless node.title
['</div>', '</div>']
end
def convert_table_tag(node, border)
[
'<table',
%( border="#{border}" cellpadding="4px"),
node.title ? %( summary="#{strip_tags node.title}") : nil,
(width = node.attr 'width') ? %( width="#{width}") : nil,
node.role ? %( class="#{node.role}") : nil,
'>',
].compact.join
end
def convert_colgroups(node)
[
'<colgroup>',
node.columns.map { |column| convert_colgroup column },
'</colgroup>',
].flatten
end
def convert_colgroup(column)
%(<col class="col_#{column.attr 'colnumber'}"/>)
end
def convert_parts(node)
head, body, foot = pull_parts node
result = []
result += convert_head head unless head.empty?
result += convert_body body unless body.empty?
result += convert_foot foot unless foot.empty?
result
end
def pull_parts(node)
((_head, head), (_body, body), (_foot, foot)) = node.rows.by_section
[head, body, foot]
end
def convert_head(rows)
[
'<thead>',
rows.map { |row| convert_row row, 'th', false },
'</thead>',
].flatten
end
def convert_body(rows)
[
'<tbody>',
rows.map { |row| convert_row row, 'td', true },
'</tbody>',
].flatten
end
def convert_foot(rows)
[
'<tfoot>',
rows.map { |row| convert_row row, 'td', false },
'</tfoot>',
].flatten
end
def convert_row(row, data_tag, allow_formatting)
[
'<tr>',
row.map { |cell| convert_table_cell cell, data_tag, allow_formatting },
'</tr>',
].flatten
end
end
end