Skip to content

Commit b84d64f

Browse files
onlyjusSteve Canny
authored andcommitted
run: add Run.underline setter
1 parent 4948b90 commit b84d64f

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

docx/oxml/text.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ def underline(self):
306306
return None
307307
return rPr.underline
308308

309+
@underline.setter
310+
def underline(self, value):
311+
rPr = self.get_or_add_rPr()
312+
rPr.underline = value
313+
309314
def _add_rPr(self):
310315
"""
311316
Return a newly added rPr child element. Assumes one is not present.
@@ -665,6 +670,11 @@ def remove_strike(self):
665670
for strike in strike_lst:
666671
self.remove(strike)
667672

673+
def remove_u(self):
674+
u_lst = self.findall(qn('w:u'))
675+
for u in u_lst:
676+
self.remove(u)
677+
668678
def remove_vanish(self):
669679
vanish_lst = self.findall(qn('w:vanish'))
670680
for vanish in vanish_lst:
@@ -767,6 +777,13 @@ def underline(self):
767777
return None
768778
return u.val
769779

780+
@underline.setter
781+
def underline(self, value):
782+
self.remove_u()
783+
if value is not None:
784+
u = self._add_u()
785+
u.val = value
786+
770787
@property
771788
def vanish(self):
772789
"""
@@ -786,6 +803,14 @@ def _add_rStyle(self, style):
786803
self.insert(0, rStyle)
787804
return rStyle
788805

806+
def _add_u(self):
807+
"""
808+
Return a newly added <w:u/> child element.
809+
"""
810+
u = OxmlElement('w:u')
811+
self.insert(0, u)
812+
return u
813+
789814

790815
class CT_Text(OxmlBaseElement):
791816
"""
@@ -833,3 +858,28 @@ def val(self):
833858
}
834859
val = self.get(qn('w:val'))
835860
return underline_type_map[val]
861+
862+
@val.setter
863+
def val(self, value):
864+
underline_vals = {
865+
True: 'single',
866+
False: 'none',
867+
WD_UNDERLINE.WORDS: 'words',
868+
WD_UNDERLINE.DOUBLE: 'double',
869+
WD_UNDERLINE.DOTTED: 'dotted',
870+
WD_UNDERLINE.THICK: 'thick',
871+
WD_UNDERLINE.DASH: 'dash',
872+
WD_UNDERLINE.DOT_DASH: 'dotDash',
873+
WD_UNDERLINE.DOT_DOT_DASH: 'dotDotDash',
874+
WD_UNDERLINE.WAVY: 'wave',
875+
WD_UNDERLINE.DOTTED_HEAVY: 'dottedHeavy',
876+
WD_UNDERLINE.DASH_HEAVY: 'dashedHeavy',
877+
WD_UNDERLINE.DOT_DASH_HEAVY: 'dashDotHeavy',
878+
WD_UNDERLINE.DOT_DOT_DASH_HEAVY: 'dashDotDotHeavy',
879+
WD_UNDERLINE.WAVY_HEAVY: 'wavyHeavy',
880+
WD_UNDERLINE.DASH_LONG: 'dashLong',
881+
WD_UNDERLINE.WAVY_DOUBLE: 'wavyDouble',
882+
WD_UNDERLINE.DASH_LONG_HEAVY: 'dashLongHeavy',
883+
}
884+
val = underline_vals[value]
885+
self.set(qn('w:val'), val)

docx/text.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,10 @@ def underline(self):
344344
"""
345345
return self._r.underline
346346

347+
@underline.setter
348+
def underline(self, value):
349+
self._r.underline = value
350+
347351
@boolproperty
348352
def web_hidden(self):
349353
"""

features/run-enum-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ Feature: Query or apply enumerated run property
1616
| double | WD_UNDERLINE.DOUBLE |
1717

1818

19-
@wip
2019
Scenario Outline: Change underline setting for a run
2120
Given a run having <underline-type> underline
2221
When I set the run underline to <new-underline-value>

tests/test_text.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ def it_knows_its_underline_type(self, underline_get_fixture):
156156
run, expected_value = underline_get_fixture
157157
assert run.underline == expected_value
158158

159+
def it_can_change_its_underline_type(self, underline_set_fixture):
160+
run, underline, expected_xml = underline_set_fixture
161+
run.underline = underline
162+
assert run._r.xml == expected_xml
163+
159164
def it_can_add_text(self, add_text_fixture):
160165
run, text_str, expected_xml, Text_ = add_text_fixture
161166
_text = run.add_text(text_str)
@@ -370,6 +375,25 @@ def underline_get_fixture(self, request):
370375
run = Run(r)
371376
return run, expected_prop_value
372377

378+
@pytest.fixture(params=[
379+
(None, True, 'single'),
380+
(None, False, 'none'),
381+
(None, None, None),
382+
(None, WD_UNDERLINE.SINGLE, 'single'),
383+
(None, WD_UNDERLINE.WAVY, 'wave'),
384+
('single', True, 'single'),
385+
('single', False, 'none'),
386+
('single', None, None),
387+
('single', WD_UNDERLINE.SINGLE, 'single'),
388+
('single', WD_UNDERLINE.DOTTED, 'dotted'),
389+
])
390+
def underline_set_fixture(self, request):
391+
before_val, underline, expected_val = request.param
392+
r = self.r_bldr_with_underline(before_val).element
393+
run = Run(r)
394+
expected_xml = self.r_bldr_with_underline(expected_val).xml()
395+
return run, underline, expected_xml
396+
373397
# fixture components ---------------------------------------------
374398

375399
@pytest.fixture

0 commit comments

Comments
 (0)