module Asciidoctor
module Rfc::V2
module Table
# Syntax:
# [[id]]
# .Title
# [suppress-title,align,style]
# |===
# |col | col
# |===
def table(node)
has_body = false
has_head = false
style_value = case node.attr "grid"
when "all"
"all"
when "rows"
"headers"
when "cols"
"full"
when "none"
"none"
else
"full"
end
warn "asciidoctor: WARNING (#{current_location(node)}): grid=rows attribute is not supported on tables" if node.attr("grid") == "rows"
texttable_attributes = {
anchor: node.id,
title: node.title,
'suppress-title': node.attr("supress-title") ? true : false,
align: node.attr("align"),
style: style_value,
}
noko do |xml|
xml.texttable **attr_code(texttable_attributes) do |xml_texttable|
[:head, :body, :foot].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
has_body = true if tblsec == :body
has_head = true if tblsec == :head
end
warn "asciidoctor: WARNING (#{current_location(node)}): tables must have at least one body row" unless has_body
warn "asciidoctor: WARNING (#{current_location(node)}): tables must have at least one head row" unless has_head
# preamble, postamble elements not supported
table_head node, xml_texttable
table_body_and_foot node, xml_texttable
end
end
end
private
def table_head(node, xml)
[:head].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables only support a single header row" if node.rows[tblsec].size > 1
widths = table_widths(node)
node.rows[tblsec].each do |row|
rowlength = 0
row.each_with_index do |cell, i|
warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables do not support colspan attribute" unless cell.colspan.nil?
warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables do not support rowspan attribute" unless cell.rowspan.nil?
width = if node.option?("autowidth") || i >= widths[:percentage].size || !widths[:named]
nil
else
"#{widths[:percentage][i]}%"
end
ttcol_attributes = {
# NOTE: anchor (ttcol.id) not supported
align: cell.attr("halign"),
width: width,
}
rowlength += cell.text.size
xml.ttcol **attr_code(ttcol_attributes) do |ttcol|
#ttcol << cell.text
# NOT cell.content: v2 does not permit blocks in cells
ttcol << Array(cell.content).join("").gsub(%r{}, "").gsub(%r{}, "")
end
end
warn "asciidoctor: WARNING (#{current_location(node)}): header row of table is longer than 72 ascii characters" if rowlength > 72
end
end
end
def table_widths(node)
percentage_widths = []
named_widths = false
node.columns.each do |col|
percentage_widths << col.attr("colpcwidth").to_f.round
named_widths = true if col.attr("width") != 1
# 1 is the default set value if no width has been given for the column
# if a columns widths have been set as [1,1,1,1,...], they will be ignored
end
{ percentage: percentage_widths, named: named_widths }
end
def table_body_and_foot(node, xml)
[:body, :foot].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
# NOTE: anchor (tblsec.id) not supported
node.rows[tblsec].each_with_index do |row, i|
rowlength = 0
row.each do |cell|
rowlength += cell.text.size
xml.c do |c|
#c << cell.text
# NOT cell.content: v2 does not permit blocks in cells
c << Array(cell.content).join("").gsub(%r{}, "").gsub(%r{}, "")
end
end
warn "asciidoctor: WARNING (#{current_location(node)}): row #{i} of table is longer than 72 ascii characters" if rowlength > 72
end
end
end
end
end
end