Skip to content

Commit 601216c

Browse files
author
Steve Canny
committed
font: add Font.underline getter
1 parent 271c00c commit 601216c

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

docx/oxml/text/run.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ def sz_val(self, value):
259259
sz = self.get_or_add_sz()
260260
sz.val = value
261261

262+
@property
263+
def u_val(self):
264+
"""
265+
Value of `w:u/@val`, or None if not present.
266+
"""
267+
u = self.u
268+
if u is None:
269+
return None
270+
return u.val
271+
262272
@property
263273
def underline(self):
264274
"""

docx/text/run.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,21 @@ def size(self, emu):
426426
rPr = self._element.get_or_add_rPr()
427427
rPr.sz_val = emu
428428

429+
@property
430+
def underline(self):
431+
"""
432+
The underline style for this |Font|, one of |None|, |True|, |False|,
433+
or a value from :ref:`WdUnderline`. |None| indicates the font
434+
inherits its underline value from the style hierarchy. |False|
435+
indicates no underline. |True| indicates single underline. The values
436+
from :ref:`WdUnderline` are used to specify other outline styles such
437+
as double, wavy, and dotted.
438+
"""
439+
rPr = self._element.rPr
440+
if rPr is None:
441+
return None
442+
return rPr.u_val
443+
429444

430445
class _Text(object):
431446
"""

features/txt-font-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ Feature: Get or set font properties
4848
| 18 pt | None |
4949

5050

51-
@wip
5251
Scenario Outline: Get font underline value
5352
Given a font having <underline-type> underline
5453
Then font.underline is <value>

tests/text/test_run.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ def it_can_change_its_size(self, size_set_fixture):
390390
font.size = value
391391
assert font._element.xml == expected_xml
392392

393+
def it_knows_its_underline_type(self, underline_get_fixture):
394+
font, expected_value = underline_get_fixture
395+
assert font.underline is expected_value
396+
393397
# fixtures -------------------------------------------------------
394398

395399
@pytest.fixture(params=[
@@ -440,3 +444,16 @@ def size_set_fixture(self, request):
440444
font = Font(element(r_cxml))
441445
expected_xml = xml(expected_r_cxml)
442446
return font, value, expected_xml
447+
448+
@pytest.fixture(params=[
449+
('w:r', None),
450+
('w:r/w:rPr/w:u', None),
451+
('w:r/w:rPr/w:u{w:val=single}', True),
452+
('w:r/w:rPr/w:u{w:val=none}', False),
453+
('w:r/w:rPr/w:u{w:val=double}', WD_UNDERLINE.DOUBLE),
454+
('w:r/w:rPr/w:u{w:val=wave}', WD_UNDERLINE.WAVY),
455+
])
456+
def underline_get_fixture(self, request):
457+
r_cxml, expected_value = request.param
458+
run = Font(element(r_cxml), None)
459+
return run, expected_value

0 commit comments

Comments
 (0)