Skip to content

Commit 4f28d93

Browse files
revossen-asmlSteve Canny
authored andcommitted
tbl: add _Row.height_rule getter
1 parent 4d93057 commit 4f28d93

File tree

5 files changed

+79
-4
lines changed

5 files changed

+79
-4
lines changed

docx/oxml/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
128128
register_element_cls('w:unhideWhenUsed', CT_OnOff)
129129

130130
from .table import (
131-
CT_Row, CT_Tbl, CT_TblGrid, CT_TblGridCol, CT_TblLayoutType, CT_TblPr,
132-
CT_TblWidth, CT_Tc, CT_TcPr, CT_VMerge
131+
CT_Height, CT_Row, CT_Tbl, CT_TblGrid, CT_TblGridCol, CT_TblLayoutType,
132+
CT_TblPr, CT_TblWidth, CT_Tc, CT_TcPr, CT_TrPr, CT_VMerge
133133
)
134134
register_element_cls('w:bidiVisual', CT_OnOff)
135135
register_element_cls('w:gridCol', CT_TblGridCol)
@@ -143,6 +143,8 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
143143
register_element_cls('w:tcPr', CT_TcPr)
144144
register_element_cls('w:tcW', CT_TblWidth)
145145
register_element_cls('w:tr', CT_Row)
146+
register_element_cls('w:trHeight', CT_Height)
147+
register_element_cls('w:trPr', CT_TrPr)
146148
register_element_cls('w:vMerge', CT_VMerge)
147149

148150
from .text.font import (

docx/oxml/table.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
)
1010

1111
from . import parse_xml
12+
from ..enum.table import WD_ROW_HEIGHT_RULE
1213
from ..exceptions import InvalidSpanError
1314
from .ns import nsdecls, qn
1415
from ..shared import Emu, Twips
@@ -21,6 +22,14 @@
2122
)
2223

2324

25+
class CT_Height(BaseOxmlElement):
26+
"""
27+
Used for ``<w:trHeight>`` to specify a row height and row height rule.
28+
"""
29+
val = OptionalAttribute('w:val', ST_TwipsMeasure)
30+
hRule = OptionalAttribute('w:hRule', WD_ROW_HEIGHT_RULE)
31+
32+
2433
class CT_Row(BaseOxmlElement):
2534
"""
2635
``<w:tr>`` element
@@ -51,6 +60,17 @@ def tr_idx(self):
5160
"""
5261
return self.getparent().tr_lst.index(self)
5362

63+
@property
64+
def trHeight_hRule(self):
65+
"""
66+
Return the value of `w:trPr/w:trHeight@w:hRule`, or |None| if not
67+
present.
68+
"""
69+
trPr = self.trPr
70+
if trPr is None:
71+
return None
72+
return trPr.trHeight_hRule
73+
5474
def _insert_tblPrEx(self, tblPrEx):
5575
self.insert(0, tblPrEx)
5676

@@ -776,6 +796,30 @@ def width(self, value):
776796
tcW.width = value
777797

778798

799+
class CT_TrPr(BaseOxmlElement):
800+
"""
801+
``<w:trPr>`` element, defining table row properties
802+
"""
803+
_tag_seq = (
804+
'w:cnfStyle', 'w:divId', 'w:gridBefore', 'w:gridAfter', 'w:wBefore',
805+
'w:wAfter', 'w:cantSplit', 'w:trHeight', 'w:tblHeader',
806+
'w:tblCellSpacing', 'w:jc', 'w:hidden', 'w:ins', 'w:del',
807+
'w:trPrChange'
808+
)
809+
trHeight = ZeroOrOne('w:trHeight', successors=_tag_seq[8:])
810+
del _tag_seq
811+
812+
@property
813+
def trHeight_hRule(self):
814+
"""
815+
Return the value of `w:trHeight@w:hRule`, or |None| if not present.
816+
"""
817+
trHeight = self.trHeight
818+
if trHeight is None:
819+
return None
820+
return trHeight.hRule
821+
822+
779823
class CT_VMerge(BaseOxmlElement):
780824
"""
781825
``<w:vMerge>`` element, specifying vertical merging behavior of a cell.

docx/table.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,15 @@ def cells(self):
383383
"""
384384
return tuple(self.table.row_cells(self._index))
385385

386+
@property
387+
def height_rule(self):
388+
"""
389+
Return the height rule of this cell as a member of the
390+
:ref:`WdRowHeightRule` enumeration, or |None| if no explicit
391+
height_rule is set.
392+
"""
393+
return self._tr.trHeight_hRule
394+
386395
@property
387396
def table(self):
388397
"""

features/tbl-row-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ Feature: Get and set table row properties
44
I need a way to get and set the properties of a table row
55

66

7-
@wip
87
Scenario Outline: Get Row.height_rule
98
Given a table row having height rule <state>
109
Then row.height_rule is <value>

tests/test_table.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import pytest
1010

1111
from docx.enum.style import WD_STYLE_TYPE
12-
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_TABLE_DIRECTION
12+
from docx.enum.table import (
13+
WD_ROW_HEIGHT, WD_TABLE_ALIGNMENT, WD_TABLE_DIRECTION
14+
)
1315
from docx.oxml import parse_xml
1416
from docx.oxml.table import CT_Tc
1517
from docx.parts.document import DocumentPart
@@ -651,6 +653,10 @@ def table_(self, request):
651653

652654
class Describe_Row(object):
653655

656+
def it_knows_its_height_rule(self, height_rule_get_fixture):
657+
row, expected_rule = height_rule_get_fixture
658+
assert row.height_rule == expected_rule
659+
654660
def it_provides_access_to_its_cells(self, cells_fixture):
655661
row, row_idx, expected_cells = cells_fixture
656662
cells = row.cells
@@ -675,6 +681,21 @@ def cells_fixture(self, _index_, table_prop_, table_):
675681
table_.row_cells.return_value = list(expected_cells)
676682
return row, row_idx, expected_cells
677683

684+
@pytest.fixture(params=[
685+
('w:tr', None),
686+
('w:tr/w:trPr', None),
687+
('w:tr/w:trPr/w:trHeight{w:val=0, w:hRule=auto}',
688+
WD_ROW_HEIGHT.AUTO),
689+
('w:tr/w:trPr/w:trHeight{w:val=1440, w:hRule=atLeast}',
690+
WD_ROW_HEIGHT.AT_LEAST),
691+
('w:tr/w:trPr/w:trHeight{w:val=2880, w:hRule=exact}',
692+
WD_ROW_HEIGHT.EXACTLY),
693+
])
694+
def height_rule_get_fixture(self, request):
695+
tr_cxml, expected_rule = request.param
696+
row = _Row(element(tr_cxml), None)
697+
return row, expected_rule
698+
678699
@pytest.fixture
679700
def idx_fixture(self):
680701
tbl = element('w:tbl/(w:tr,w:tr,w:tr)')

0 commit comments

Comments
 (0)