module IsoDoc module WordFunction module Body def remove_bottom_border(cell) cell["style"] = cell["style"].gsub(/border-bottom:[^;]+;/, "border-bottom:0pt;") .gsub(/mso-border-bottom-alt:[^;]+;/, "mso-border-bottom-alt:0pt;") end SW1 = "solid windowtext".freeze 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 style = "border-top:0pt;mso-border-top-alt:0pt;" \ "border-bottom:#{SW1} 1.5pt;mso-border-bottom-alt:#{SW1} 1.5pt;" tfoot.add_child("") tfoot.xpath(".//td").last end def make_tr_attr(cell, row, totalrows, header, bordered) style = cell.name == "th" ? "font-weight:bold;" : "" rowmax = cell["rowspan"] ? row + cell["rowspan"].to_i - 1 : row style += make_tr_attr_style(cell, row, rowmax, totalrows, { header: header, bordered: bordered }) { rowspan: cell["rowspan"], colspan: cell["colspan"], valign: cell["valign"], align: cell["align"], style: style, class: cell["class"] } end def make_tr_attr_style(cell, row, rowmax, totalrows, opt) top = row.zero? ? "#{SW1} 1.5pt;" : "none;" bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;" ret = <<~STYLE.gsub(/\n/, "") border-top:#{top}mso-border-top-alt:#{top} border-bottom:#{bottom}mso-border-bottom-alt:#{bottom} STYLE opt[:bordered] or ret = "" pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto" "#{ret}page-break-after:#{pb};" end def keep_rows_together(cell, rowmax, totalrows, opt) opt[:header] and return true table_line_count(cell.parent.parent) > 15 and return false (totalrows <= 10 && rowmax < totalrows) end def table_line_count(tbody) sum = 0 tbody.xpath(ns(".//tr")).each do |r| i = 1 r.xpath(ns(".//td | .//th")).each do |c| n = c.xpath(ns(".//li | .//p | .//br")).size n > i and i = n end sum += i end sum end def table_attrs(node) c = node["class"] bordered = "border-spacing:0;border-width:1px;" (%w(modspec).include?(c) || !c) or bordered = nil ret = { summary: node["summary"], width: node["width"], style: "mso-table-anchor-horizontal:column;mso-table-overlap:never;" \ "#{bordered}#{keep_style(node)}", class: (node.text.length > 4000 ? "MsoISOTableBig" : "MsoISOTable") } bordered or ret.delete(:class) super.merge(attr_code(ret)) end def colgroup(node, table) colgroup = node.at(ns("./colgroup")) or return table.colgroup do |cg| colgroup.xpath(ns("./col")).each do |c| cg.col width: c["width"] end end end def table_parse(node, out) @in_table = true table_title_parse(node, out) out.div align: "center", class: "table_container" do |div| div.table **table_attrs(node) do |t| table_parse_core(node, out) (dl = node.at(ns("./dl"))) && parse(dl, out) node.xpath(ns("./note")).each { |n| parse(n, out) } end end @in_table = false end def table_parse_core(node, out) colgroup(node, out) thead_parse(node, out) tbody_parse(node, out) tfoot_parse(node, out) end end end end