Skip to content

Commit d4ca18d

Browse files
author
Steve Canny
committed
tbl: add Table.table_direction getter
1 parent db70e4f commit d4ca18d

File tree

5 files changed

+43
-15
lines changed

5 files changed

+43
-15
lines changed

docx/oxml/__init__.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,19 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
131131
CT_Row, CT_Tbl, CT_TblGrid, CT_TblGridCol, CT_TblLayoutType, CT_TblPr,
132132
CT_TblWidth, CT_Tc, CT_TcPr, CT_VMerge
133133
)
134-
register_element_cls('w:gridCol', CT_TblGridCol)
135-
register_element_cls('w:gridSpan', CT_DecimalNumber)
136-
register_element_cls('w:tbl', CT_Tbl)
137-
register_element_cls('w:tblGrid', CT_TblGrid)
138-
register_element_cls('w:tblLayout', CT_TblLayoutType)
139-
register_element_cls('w:tblPr', CT_TblPr)
140-
register_element_cls('w:tblStyle', CT_String)
141-
register_element_cls('w:tc', CT_Tc)
142-
register_element_cls('w:tcPr', CT_TcPr)
143-
register_element_cls('w:tcW', CT_TblWidth)
144-
register_element_cls('w:tr', CT_Row)
145-
register_element_cls('w:vMerge', CT_VMerge)
134+
register_element_cls('w:bidiVisual', CT_OnOff)
135+
register_element_cls('w:gridCol', CT_TblGridCol)
136+
register_element_cls('w:gridSpan', CT_DecimalNumber)
137+
register_element_cls('w:tbl', CT_Tbl)
138+
register_element_cls('w:tblGrid', CT_TblGrid)
139+
register_element_cls('w:tblLayout', CT_TblLayoutType)
140+
register_element_cls('w:tblPr', CT_TblPr)
141+
register_element_cls('w:tblStyle', CT_String)
142+
register_element_cls('w:tc', CT_Tc)
143+
register_element_cls('w:tcPr', CT_TcPr)
144+
register_element_cls('w:tcW', CT_TblWidth)
145+
register_element_cls('w:tr', CT_Row)
146+
register_element_cls('w:vMerge', CT_VMerge)
146147

147148
from .text.font import (
148149
CT_Color, CT_Fonts, CT_HpsMeasure, CT_RPr, CT_Underline,

docx/oxml/table.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ class CT_Tbl(BaseOxmlElement):
6161
tblGrid = OneAndOnlyOne('w:tblGrid')
6262
tr = ZeroOrMore('w:tr')
6363

64+
@property
65+
def bidiVisual_val(self):
66+
"""
67+
Value of `w:tblPr/w:bidiVisual/@w:val` or |None| if not present.
68+
Controls whether table cells are displayed right-to-left or
69+
left-to-right.
70+
"""
71+
bidiVisual = self.tblPr.bidiVisual
72+
if bidiVisual is None:
73+
return None
74+
return bidiVisual.val
75+
6476
@property
6577
def col_count(self):
6678
"""
@@ -208,6 +220,7 @@ class CT_TblPr(BaseOxmlElement):
208220
'w:tblDescription', 'w:tblPrChange'
209221
)
210222
tblStyle = ZeroOrOne('w:tblStyle', successors=_tag_seq[1:])
223+
bidiVisual = ZeroOrOne('w:bidiVisual', successors=_tag_seq[4:])
211224
jc = ZeroOrOne('w:jc', successors=_tag_seq[8:])
212225
tblLayout = ZeroOrOne('w:tblLayout', successors=_tag_seq[13:])
213226
del _tag_seq

docx/table.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def table_direction(self):
152152
the table cells are ordered, e.g. `WD_TABLE_DIRECTION.LTR`. |None|
153153
indicates the value is inherited from the style hierarchy.
154154
"""
155-
raise NotImplementedError
155+
return self._element.bidiVisual_val
156156

157157
@property
158158
def _cells(self):

features/tbl-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ Feature: Get and set table properties
5555
| autofit | fixed | fixed |
5656

5757

58-
@wip
5958
Scenario Outline: Get table direction
6059
Given a table having table direction set <setting>
6160
Then table.table_direction is <value>

tests/test_table.py

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

1111
from docx.enum.style import WD_STYLE_TYPE
12-
from docx.enum.table import WD_TABLE_ALIGNMENT
12+
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_TABLE_DIRECTION
1313
from docx.oxml import parse_xml
1414
from docx.oxml.table import CT_Tc
1515
from docx.parts.document import DocumentPart
@@ -91,6 +91,10 @@ def it_knows_it_is_the_table_its_children_belong_to(self, table_fixture):
9191
table = table_fixture
9292
assert table.table is table
9393

94+
def it_knows_its_direction(self, direction_get_fixture):
95+
table, expected_value = direction_get_fixture
96+
assert table.table_direction == expected_value
97+
9498
def it_knows_its_table_style(self, style_get_fixture):
9599
table, style_id_, style_ = style_get_fixture
96100
style = table.style
@@ -224,6 +228,17 @@ def column_count_fixture(self):
224228
table = Table(element(tbl_cxml), None)
225229
return table, expected_value
226230

231+
@pytest.fixture(params=[
232+
('w:tbl/w:tblPr', None),
233+
('w:tbl/w:tblPr/w:bidiVisual', WD_TABLE_DIRECTION.RTL),
234+
('w:tbl/w:tblPr/w:bidiVisual{w:val=0}', WD_TABLE_DIRECTION.LTR),
235+
('w:tbl/w:tblPr/w:bidiVisual{w:val=on}', WD_TABLE_DIRECTION.RTL),
236+
])
237+
def direction_get_fixture(self, request):
238+
tbl_cxml, expected_value = request.param
239+
table = Table(element(tbl_cxml), None)
240+
return table, expected_value
241+
227242
@pytest.fixture
228243
def row_cells_fixture(self, _cells_, _column_count_):
229244
table = Table(None, None)

0 commit comments

Comments
 (0)