Skip to content

Commit b595e44

Browse files
author
Steve Canny
committed
style: add _CharacterStyle.base_style setter
1 parent b8abd27 commit b595e44

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-1
lines changed

docx/oxml/styles.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,23 @@ class CT_Style(BaseOxmlElement):
5050
customStyle = OptionalAttribute('w:customStyle', ST_OnOff)
5151
del _tag_seq
5252

53+
@property
54+
def basedOn_val(self):
55+
"""
56+
Value of `w:basedOn/@w:val` or |None| if not present.
57+
"""
58+
basedOn = self.basedOn
59+
if basedOn is None:
60+
return None
61+
return basedOn.val
62+
63+
@basedOn_val.setter
64+
def basedOn_val(self, value):
65+
if value is None:
66+
self._remove_basedOn()
67+
else:
68+
self.get_or_add_basedOn().val = value
69+
5370
@property
5471
def base_style(self):
5572
"""

docx/styles/style.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ def base_style(self):
129129
return None
130130
return StyleFactory(base_style)
131131

132+
@base_style.setter
133+
def base_style(self, style):
134+
style_id = style.style_id if style is not None else None
135+
self._element.basedOn_val = style_id
136+
132137

133138
class _ParagraphStyle(_CharacterStyle):
134139
"""

features/sty-style-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ Feature: Get and set style properties
1414
| Normal | styles['Normal'] |
1515

1616

17-
@wip
1817
Scenario Outline: Set base style
1918
Given a style based on <base-style>
2019
When I assign <assigned-value> to style.base_style

tests/styles/test_style.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ def it_knows_which_style_it_is_based_on(self, base_get_fixture):
211211
assert StyleFactory_.call_args_list == StyleFactory_calls
212212
assert base_style == base_style_
213213

214+
def it_can_change_its_base_style(self, base_set_fixture):
215+
style, value, expected_xml = base_set_fixture
216+
style.base_style = value
217+
assert style._element.xml == expected_xml
218+
214219
# fixture --------------------------------------------------------
215220

216221
@pytest.fixture(params=[
@@ -234,8 +239,28 @@ def base_get_fixture(self, request, StyleFactory_):
234239
expected_value = None
235240
return style, StyleFactory_, StyleFactory_calls, expected_value
236241

242+
@pytest.fixture(params=[
243+
('w:style', 'Foo',
244+
'w:style/w:basedOn{w:val=Foo}'),
245+
('w:style/w:basedOn{w:val=Foo}', 'Bar',
246+
'w:style/w:basedOn{w:val=Bar}'),
247+
('w:style/w:basedOn{w:val=Bar}', None,
248+
'w:style'),
249+
])
250+
def base_set_fixture(self, request, style_):
251+
style_cxml, base_style_id, expected_style_cxml = request.param
252+
style = _CharacterStyle(element(style_cxml))
253+
style_.style_id = base_style_id
254+
base_style = style_ if base_style_id is not None else None
255+
expected_xml = xml(expected_style_cxml)
256+
return style, base_style, expected_xml
257+
237258
# fixture components ---------------------------------------------
238259

260+
@pytest.fixture
261+
def style_(self, request):
262+
return instance_mock(request, BaseStyle)
263+
239264
@pytest.fixture
240265
def StyleFactory_(self, request):
241266
return function_mock(request, 'docx.styles.style.StyleFactory')

0 commit comments

Comments
 (0)