Method: IsoDoc::WordFunction::Postprocess#word_colgroup

Defined in:
lib/isodoc/word_function/postprocess_table.rb

#word_colgroup(docxml) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/isodoc/word_function/postprocess_table.rb', line 11

def word_colgroup(docxml)
  cells2d = {}
  docxml.xpath("//table[colgroup]").each do |t|
    w = colgroup_widths(t)
    t.xpath(".//tr").each_with_index { |_tr, r| cells2d[r] = {} }
    t.xpath(".//tr").each_with_index do |tr, r|
      tr.xpath("./td | ./th").each_with_index do |td, _i|
        x = 0
        rs = td.attr("rowspan")&.to_i || 1
        cs = td.attr("colspan")&.to_i || 1
        while cells2d[r][x]
          x += 1
        end
        (r..(r + rs - 1)).each do |y2|
          cells2d[y2].nil? and next
          (x..(x + cs - 1)).each { |x2| cells2d[y2][x2] = 1 }
        end
        width = (x..(x + cs - 1)).each_with_object({ width: 0 }) do |z, m|
          m[:width] += w[z]
        end
        td["width"] = "#{width[:width]}%"
        x += cs
      end
    end
  end
end