Skip to content

Commit

Permalink
refactor: rename class and internal variables of VMerge
Browse files Browse the repository at this point in the history
  • Loading branch information
mbrsamsung committed Sep 26, 2024
1 parent a981489 commit 109d615
Showing 1 changed file with 31 additions and 31 deletions.
62 changes: 31 additions & 31 deletions src/spex/htmlspec/docx/tablewrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from spex.xml import Xpath


class VMerge(Enum):
class VerticalMergeState(Enum):
NONE = 0
MERGED = 1
RESTART = 2
Expand Down Expand Up @@ -46,48 +46,48 @@ def tc_grid_span(tc: _Element) -> int:
ret = Xpath.attr_first(tc, "./w:tcPr/w:gridSpan/@w:val")
return int(ret) if isinstance(ret, str) else 1

def tc_vmerge(tc: _Element) -> VMerge:
vmerge_elem = Xpath.elem_first(tc, "./w:tcPr/w:vMerge")
if vmerge_elem is None:
return VMerge.NONE
assert isinstance(vmerge_elem, _Element)
rval = Xpath.attr_first(vmerge_elem, "@w:val")
if rval:
assert rval == "restart"
return VMerge.RESTART
def cell_vertical_merge(tc: _Element) -> VerticalMergeState:
merge_elem = Xpath.elem_first(tc, "./w:tcPr/w:vMerge")
if merge_elem is None:
return VerticalMergeState.NONE
assert isinstance(merge_elem, _Element)
row_val = Xpath.attr_first(merge_elem, "@w:val")
if row_val:
assert row_val == "restart"
return VerticalMergeState.RESTART
else:
return VMerge.MERGED
return VerticalMergeState.MERGED

matrix: Matrix = []
for rndx, tr in enumerate(Xpath.elems(self._elem, "./w:tr")):
cndx = 0
mrow = []
for tc in tr.findall("./w:tc", tr.nsmap): # type: ignore
grid_span = tc_grid_span(tc)
vmerge = tc_vmerge(tc)
if vmerge is VMerge.MERGED:
lcell = matrix[-1][cndx]
assert grid_span == lcell.colspan, (
for row_index, row in enumerate(Xpath.elems(self._elem, "./w:tr")):
cell_index = 0
merge_row = []
for cell in row.findall("./w:tc", row.nsmap): # type: ignore
grid_span = tc_grid_span(cell)
vertical_merge = cell_vertical_merge(cell)
if vertical_merge is VerticalMergeState.MERGED:
left_cell = matrix[-1][cell_index]
assert grid_span == left_cell.colspan, (
f"cell has grid_span {grid_span}, but parent has "
f"{lcell.colspan} - breaks assumption of "
f"{left_cell.colspan} - breaks assumption of "
"rectangular-only merges"
)
# update bottom value to mark
lcell.bottom = rndx
left_cell.bottom = row_index
else:
# create layout cell, bottom value is asssumed if vMerge="restart"
# in that case, subsequent cells which are merged into this will
# update the bottom value accordingly.
lcell = GridElement(
top=rndx,
bottom=rndx,
left=cndx,
right=cndx + grid_span - 1,
cell=tc,
left_cell = GridElement(
top=row_index,
bottom=row_index,
left=cell_index,
right=cell_index + grid_span - 1,
cell=cell,
)

for _ in range(grid_span):
mrow.append(lcell)
cndx += grid_span
matrix.append(mrow)
merge_row.append(left_cell)
cell_index += grid_span
matrix.append(merge_row)
return matrix

0 comments on commit 109d615

Please sign in to comment.