docs: def parse_table(document, tbl):
      "Parse table element."
  
      def _change(rows, pos_x):
          if len(rows) == 1:
              return rows
  
          count_x = 1
  
          for x in rows[-1]:
              if count_x == pos_x:
                  x.row_span += 1
  
              count_x += x.grid_span
  
          return rows
  
      table = doc.Table()
  
      tbl_pr = tbl.find(_name('{{{w}}}tblPr'))
  
      if tbl_pr is not None:
          parse_table_properties(document, table, tbl_pr)
  
      for tr in tbl.xpath('./w:tr', namespaces=NAMESPACES):
          columns = []
          pos_x = 0
  
          for tc in tr.xpath('./w:tc', namespaces=NAMESPACES):
              cell = doc.TableCell()
  
              tc_pr = tc.find(_name('{{{w}}}tcPr'))
  
              if tc_pr is not None:
                  parse_table_column_properties(doc, cell, tc_pr)
  
              # maybe after
              pos_x += cell.grid_span
  
              if cell.vmerge is not None and cell.vmerge == "":
                  table.rows = _change(table.rows, pos_x)
              else:
                  for p in tc.xpath('./w:p', namespaces=NAMESPACES):
                      cell.elements.append(parse_paragraph(document, p))
  
                  columns.append(cell)
  
          table.rows.append(columns)
  
      return table