Module: IsoDoc::Function::Table
- Included in:
- Common
- Defined in:
- lib/isodoc/function/table.rb
Constant Summary collapse
- SW =
"solid windowtext".freeze
Instance Method Summary collapse
- #bordered_table_style(node, klass) ⇒ Object
- #colgroup(node, table) ⇒ Object
-
#make_tr_attr(cell, row, totalrows, header, bordered) ⇒ Object
def make_tr_attr(td, row, totalrows, cols, totalcols, header) border-left:#? “#{SW 1.5pt;” : “none;”} border-right:#SW #== totalcols && !header ? “1.5” : “1.0”pt;.
- #make_tr_attr_style(row, rowmax, totalrows, _header, bordered) ⇒ Object
- #new_fullcolspan_row(table, tfoot) ⇒ Object
- #remove_bottom_border(cell) ⇒ Object
- #table_attrs(node) ⇒ Object
- #table_attrs_style(node, klass) ⇒ Object
- #table_bordered?(node) ⇒ Boolean
- #table_get_or_make_tfoot(table) ⇒ Object
- #table_parse(node, out) ⇒ Object
- #table_parse_core(node, out) ⇒ Object
- #table_parse_tail(node, out) ⇒ Object
- #table_parse_tail?(node) ⇒ Boolean
- #table_parse_tail_elems ⇒ Object
- #table_title_parse(node, out) ⇒ Object
- #tbody_parse(node, table) ⇒ Object
- #tfoot_parse(node, table) ⇒ Object
- #thead_parse(node, table) ⇒ Object
- #tr_parse(node, out, ord, totalrows, header) ⇒ Object
Instance Method Details
#bordered_table_style(node, klass) ⇒ Object
49 50 51 52 53 54 |
# File 'lib/isodoc/function/table.rb', line 49 def bordered_table_style(node, klass) bordered = "border-width:1px;border-spacing:0;" (node["plain"] != "true" && (%w(modspec).include?(klass) || !klass)) or bordered = "" bordered end |
#colgroup(node, table) ⇒ Object
73 74 75 76 77 78 79 80 |
# File 'lib/isodoc/function/table.rb', line 73 def colgroup(node, table) colgroup = node.at(ns("./colgroup")) or return table.colgroup do |cg| colgroup.xpath(ns("./col")).each do |c| cg.col style: "width: #{c['width']};" end end end |
#make_tr_attr(cell, row, totalrows, header, bordered) ⇒ Object
def make_tr_attr(td, row, totalrows, cols, totalcols, header) border-left:#? “#{SW 1.5pt;” : “none;”} border-right:#SW #== totalcols && !header ? “1.5” : “1.0”pt;
127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/isodoc/function/table.rb', line 127 def make_tr_attr(cell, row, totalrows, header, bordered) style = cell.name == "th" ? "font-weight:bold;" : "" cell["style"] and style += "#{cell['style']};" cell["align"] and style += "text-align:#{cell['align']};" cell["valign"] and style += "vertical-align:#{cell['valign']};" rowmax = cell["rowspan"] ? row + cell["rowspan"].to_i - 1 : row style += make_tr_attr_style(row, rowmax, totalrows, header, bordered) header and scope = (cell["colspan"] ? "colgroup" : "col") !header && cell.name == "th" and scope = (cell["rowspan"] ? "rowgroup" : "row") { rowspan: cell["rowspan"], colspan: cell["colspan"], style: style.delete("\n"), scope: scope, class: cell["class"] } end |
#make_tr_attr_style(row, rowmax, totalrows, _header, bordered) ⇒ Object
141 142 143 144 145 146 147 |
# File 'lib/isodoc/function/table.rb', line 141 def make_tr_attr_style(row, rowmax, totalrows, _header, bordered) bordered or return "" <<~STYLE.delete("\n") border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'} border-bottom:#{SW} #{rowmax >= totalrows ? '1.5' : '1.0'}pt; STYLE end |
#new_fullcolspan_row(table, tfoot) ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/isodoc/function/table.rb', line 186 def new_fullcolspan_row(table, tfoot) # how many columns in the table? cols = 0 table.at(".//tr").xpath("./td | ./th").each do |td| cols += (td["colspan"] ? td["colspan"].to_i : 1) end table["class"].nil? or # = plain table s = "style='border-top:0pt;border-bottom:#{SW} 1.5pt;'" tfoot.add_child("<tr><td colspan='#{cols}' #{s}/></tr>") tfoot.xpath(".//td").last end |
#remove_bottom_border(cell) ⇒ Object
167 168 169 170 171 172 173 |
# File 'lib/isodoc/function/table.rb', line 167 def remove_bottom_border(cell) # [^;]* (not +): the preceding property name is the unambiguous # delimiter, so zero-or-more is equivalent and avoids polynomial # backtracking on the value portion. cell["style"] &&= cell["style"].gsub(/border-bottom:[^;]*;/, "border-bottom:0pt;") end |
#table_attrs(node) ⇒ Object
56 57 58 59 60 61 62 |
# File 'lib/isodoc/function/table.rb', line 56 def table_attrs(node) c = node["class"] style = table_attrs_style(node, c) attr_code(id: node["id"], class: node["plain"] == "true" ? "plain" : (c || "MsoISOTable"), style: style, title: node["alt"]) end |
#table_attrs_style(node, klass) ⇒ Object
64 65 66 67 68 69 70 71 |
# File 'lib/isodoc/function/table.rb', line 64 def table_attrs_style(node, klass) width = node["width"] ? "width:#{node['width']};" : nil bordered = bordered_table_style(node, klass) style = node["style"] ? "" : "#{bordered}#{width}" style += keep_style(node) || "" style.empty? and style = nil style end |
#table_bordered?(node) ⇒ Boolean
149 150 151 152 153 |
# File 'lib/isodoc/function/table.rb', line 149 def table_bordered?(node) node.parent.parent["plain"] == "true" and return false c = node.parent.parent["class"] %w(modspec).include?(c) || !c end |
#table_get_or_make_tfoot(table) ⇒ Object
175 176 177 178 179 180 181 182 183 184 |
# File 'lib/isodoc/function/table.rb', line 175 def table_get_or_make_tfoot(table) tfoot = table.at(".//tfoot") if tfoot.nil? table.add_child("<tfoot></tfoot>") tfoot = table.at(".//tfoot") else tfoot.xpath(".//td | .//th").each { |td| remove_bottom_border(td) } end tfoot end |
#table_parse(node, out) ⇒ Object
82 83 84 85 86 87 88 89 90 |
# File 'lib/isodoc/function/table.rb', line 82 def table_parse(node, out) @in_table = true out.table(**table_attrs(node)) do |t| table_title_parse(node, t) table_parse_core(node, t) table_parse_tail(node, t) end @in_table = false end |
#table_parse_core(node, out) ⇒ Object
114 115 116 117 118 119 |
# File 'lib/isodoc/function/table.rb', line 114 def table_parse_core(node, out) colgroup(node, out) thead_parse(node, out) tbody_parse(node, out) tfoot_parse(node, out) end |
#table_parse_tail(node, out) ⇒ Object
97 98 99 100 101 102 103 104 105 |
# File 'lib/isodoc/function/table.rb', line 97 def table_parse_tail(node, out) table_parse_tail?(node) or return tfoot = table_get_or_make_tfoot(out.parent) ins = new_fullcolspan_row(out.parent, tfoot) b = Nokogiri::XML::Builder.with(ins) table_parse_tail_elems.each do |k| node.xpath(ns(k)).each { |n| parse(n, b) } end end |
#table_parse_tail?(node) ⇒ Boolean
107 108 109 110 111 112 |
# File 'lib/isodoc/function/table.rb', line 107 def table_parse_tail?(node) table_parse_tail_elems.each do |k| !node.xpath(ns(k)).empty? and return true end false end |
#table_parse_tail_elems ⇒ Object
92 93 94 95 |
# File 'lib/isodoc/function/table.rb', line 92 def table_parse_tail_elems ["./key", "./fmt-source", "./note", "./fmt-footnote-container/fmt-fn-body"] end |
#table_title_parse(node, out) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 |
# File 'lib/isodoc/function/table.rb', line 4 def table_title_parse(node, out) name = node.at(ns("./fmt-name")) summ = node["summary"] name || summ or return # out.p class: "TableTitle", style: "text-align:center;" do |p| out.caption do |p| children_parse(name, p) summ and p.span style: "display:none" do |s| s << summ end end end |
#tbody_parse(node, table) ⇒ Object
28 29 30 31 32 33 34 35 36 |
# File 'lib/isodoc/function/table.rb', line 28 def tbody_parse(node, table) tbody = node.at(ns("./tbody")) or return rowcount = tbody.xpath(ns("./tr")).size table.tbody do |h| tbody.element_children.each_with_index do |n, i| tr_parse(n, h, i, rowcount, false) end end end |
#tfoot_parse(node, table) ⇒ Object
38 39 40 41 42 43 44 45 46 47 |
# File 'lib/isodoc/function/table.rb', line 38 def tfoot_parse(node, table) tfoot = node.at(ns("./tfoot")) if tfoot table.tfoot do |h| tfoot.element_children.each_with_index do |n, i| tr_parse(n, h, i, tfoot.xpath(ns("./tr")).size, false) end end end end |
#thead_parse(node, table) ⇒ Object
17 18 19 20 21 22 23 24 25 26 |
# File 'lib/isodoc/function/table.rb', line 17 def thead_parse(node, table) thead = node.at(ns("./thead")) if thead table.thead do |h| thead.element_children.each_with_index do |n, i| tr_parse(n, h, i, thead.xpath(ns("./tr")).size, true) end end end end |
#tr_parse(node, out, ord, totalrows, header) ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/isodoc/function/table.rb', line 155 def tr_parse(node, out, ord, totalrows, header) out.tr(**attr_code(style: node["style"])) do |r| node.elements.each do |td| attrs = make_tr_attr(td, ord, totalrows - 1, header, table_bordered?(node)) r.send td.name, **attr_code(attrs) do |entry| td.children.each { |n| parse(n, entry) } end end end end |