Skip to content

Commit fcca0c1

Browse files
author
Steve Canny
committed
parfmt: add ParagraphFormat.keep_together getter
1 parent 2fdb937 commit fcca0c1

File tree

4 files changed

+44
-6
lines changed

4 files changed

+44
-6
lines changed

docx/oxml/__init__.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,13 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
137137
register_element_cls('w:vMerge', CT_VMerge)
138138

139139
from .text.paragraph import CT_Ind, CT_Jc, CT_P, CT_PPr, CT_Spacing
140-
register_element_cls('w:ind', CT_Ind)
141-
register_element_cls('w:jc', CT_Jc)
142-
register_element_cls('w:p', CT_P)
143-
register_element_cls('w:pPr', CT_PPr)
144-
register_element_cls('w:pStyle', CT_String)
145-
register_element_cls('w:spacing', CT_Spacing)
140+
register_element_cls('w:ind', CT_Ind)
141+
register_element_cls('w:jc', CT_Jc)
142+
register_element_cls('w:keepLines', CT_OnOff)
143+
register_element_cls('w:p', CT_P)
144+
register_element_cls('w:pPr', CT_PPr)
145+
register_element_cls('w:pStyle', CT_String)
146+
register_element_cls('w:spacing', CT_Spacing)
146147

147148
from .text.run import (
148149
CT_Br, CT_Fonts, CT_HpsMeasure, CT_R, CT_RPr, CT_Text, CT_Underline,

docx/oxml/text/paragraph.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class CT_PPr(BaseOxmlElement):
117117
'w:rPr', 'w:sectPr', 'w:pPrChange'
118118
)
119119
pStyle = ZeroOrOne('w:pStyle', successors=_tag_seq[1:])
120+
keepLines = ZeroOrOne('w:keepLines', successors=_tag_seq[3:])
120121
numPr = ZeroOrOne('w:numPr', successors=_tag_seq[7:])
121122
spacing = ZeroOrOne('w:spacing', successors=_tag_seq[22:])
122123
ind = ZeroOrOne('w:ind', successors=_tag_seq[23:])
@@ -206,6 +207,16 @@ def jc_val(self, value):
206207
return
207208
self.get_or_add_jc().val = value
208209

210+
@property
211+
def keepLines_val(self):
212+
"""
213+
The value of `keepLines/@val` or |None| if not present.
214+
"""
215+
keepLines = self.keepLines
216+
if keepLines is None:
217+
return None
218+
return keepLines.val
219+
209220
@property
210221
def spacing_after(self):
211222
"""

docx/text/paragraph.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,18 @@ def first_line_indent(self, value):
177177
pPr = self._element.get_or_add_pPr()
178178
pPr.first_line_indent = value
179179

180+
@property
181+
def keep_together(self):
182+
"""
183+
|True| if the paragraph should be kept "in one piece" and not broken
184+
across a page boundary when the document is rendered. |None|
185+
indicates its effective value is inherited from the style hierarchy.
186+
"""
187+
pPr = self._element.pPr
188+
if pPr is None:
189+
return None
190+
return pPr.keepLines_val
191+
180192
@property
181193
def left_indent(self):
182194
"""

tests/text/test_paragraph.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,10 @@ def it_can_change_its_right_indent(self, right_indent_set_fixture):
361361
paragraph_format.right_indent = value
362362
assert paragraph_format._element.xml == expected_xml
363363

364+
def it_knows_its_on_off_prop_values(self, on_off_get_fixture):
365+
paragraph_format, prop_name, expected_value = on_off_get_fixture
366+
assert getattr(paragraph_format, prop_name) == expected_value
367+
364368
# fixtures -------------------------------------------------------
365369

366370
@pytest.fixture(params=[
@@ -523,6 +527,16 @@ def line_spacing_rule_set_fixture(self, request):
523527
expected_xml = xml(expected_p_cxml)
524528
return paragraph_format, value, expected_xml
525529

530+
@pytest.fixture(params=[
531+
('w:p', 'keep_together', None),
532+
('w:p/w:pPr/w:keepLines{w:val=on}', 'keep_together', True),
533+
('w:p/w:pPr/w:keepLines{w:val=0}', 'keep_together', False),
534+
])
535+
def on_off_get_fixture(self, request):
536+
p_cxml, prop_name, expected_value = request.param
537+
paragraph_format = ParagraphFormat(element(p_cxml))
538+
return paragraph_format, prop_name, expected_value
539+
526540
@pytest.fixture(params=[
527541
('w:p', None),
528542
('w:p/w:pPr', None),

0 commit comments

Comments
 (0)