Skip to content

Commit a46dd64

Browse files
committed
hdr: add Settings.odd_and_even_pages_header_footer
Getter side.
1 parent 1fd57de commit a46dd64

File tree

5 files changed

+109
-1
lines changed

5 files changed

+109
-1
lines changed

docx/oxml/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
6565
# ===========================================================================
6666

6767
from .shared import CT_DecimalNumber, CT_OnOff, CT_String # noqa
68+
register_element_cls("w:evenAndOddHeaders", CT_OnOff)
6869

6970

7071
from .coreprops import CT_CoreProperties # noqa
@@ -101,6 +102,9 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
101102
register_element_cls("w:sectPr", CT_SectPr)
102103
register_element_cls("w:type", CT_SectType)
103104

105+
from .settings import CT_Settings # noqa
106+
register_element_cls("w:settings", CT_Settings)
107+
104108
from .shape import ( # noqa
105109
CT_Blip,
106110
CT_BlipFillProperties,

docx/oxml/settings.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# encoding: utf-8
2+
3+
"""Custom element classes related to document settings"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
from docx.oxml.xmlchemy import BaseOxmlElement, ZeroOrOne
8+
9+
10+
class CT_Settings(BaseOxmlElement):
11+
"""`w:settings` element, root element for the settings part"""
12+
13+
_tag_seq = (
14+
"w:writeProtection", "w:view", "w:zoom", "w:removePersonalInformation",
15+
"w:removeDateAndTime", "w:doNotDisplayPageBoundaries",
16+
"w:displayBackgroundShape", "w:printPostScriptOverText",
17+
"w:printFractionalCharacterWidth", "w:printFormsData", "w:embedTrueTypeFonts",
18+
"w:embedSystemFonts", "w:saveSubsetFonts", "w:saveFormsData", "w:mirrorMargins",
19+
"w:alignBordersAndEdges", "w:bordersDoNotSurroundHeader",
20+
"w:bordersDoNotSurroundFooter", "w:gutterAtTop", "w:hideSpellingErrors",
21+
"w:hideGrammaticalErrors", "w:activeWritingStyle", "w:proofState",
22+
"w:formsDesign", "w:attachedTemplate", "w:linkStyles",
23+
"w:stylePaneFormatFilter", "w:stylePaneSortMethod", "w:documentType",
24+
"w:mailMerge", "w:revisionView", "w:trackRevisions", "w:doNotTrackMoves",
25+
"w:doNotTrackFormatting", "w:documentProtection", "w:autoFormatOverride",
26+
"w:styleLockTheme", "w:styleLockQFSet", "w:defaultTabStop", "w:autoHyphenation",
27+
"w:consecutiveHyphenLimit", "w:hyphenationZone", "w:doNotHyphenateCaps",
28+
"w:showEnvelope", "w:summaryLength", "w:clickAndTypeStyle",
29+
"w:defaultTableStyle", "w:evenAndOddHeaders", "w:bookFoldRevPrinting",
30+
"w:bookFoldPrinting", "w:bookFoldPrintingSheets",
31+
"w:drawingGridHorizontalSpacing", "w:drawingGridVerticalSpacing",
32+
"w:displayHorizontalDrawingGridEvery", "w:displayVerticalDrawingGridEvery",
33+
"w:doNotUseMarginsForDrawingGridOrigin", "w:drawingGridHorizontalOrigin",
34+
"w:drawingGridVerticalOrigin", "w:doNotShadeFormData", "w:noPunctuationKerning",
35+
"w:characterSpacingControl", "w:printTwoOnOne", "w:strictFirstAndLastChars",
36+
"w:noLineBreaksAfter", "w:noLineBreaksBefore", "w:savePreviewPicture",
37+
"w:doNotValidateAgainstSchema", "w:saveInvalidXml", "w:ignoreMixedContent",
38+
"w:alwaysShowPlaceholderText", "w:doNotDemarcateInvalidXml",
39+
"w:saveXmlDataOnly", "w:useXSLTWhenSaving", "w:saveThroughXslt",
40+
"w:showXMLTags", "w:alwaysMergeEmptyNamespace", "w:updateFields",
41+
"w:hdrShapeDefaults", "w:footnotePr", "w:endnotePr", "w:compat", "w:docVars",
42+
"w:rsids", "m:mathPr", "w:attachedSchema", "w:themeFontLang",
43+
"w:clrSchemeMapping", "w:doNotIncludeSubdocsInStats",
44+
"w:doNotAutoCompressPictures", "w:forceUpgrade", "w:captions",
45+
"w:readModeInkLockDown", "w:smartTagType", "sl:schemaLibrary",
46+
"w:shapeDefaults", "w:doNotEmbedSmartTags", "w:decimalSymbol", "w:listSeparator"
47+
)
48+
evenAndOddHeaders = ZeroOrOne("w:evenAndOddHeaders", successors=_tag_seq[48:])
49+
del _tag_seq
50+
51+
@property
52+
def evenAndOddHeaders_val(self):
53+
"""value of `w:evenAndOddHeaders/@w:val` or |None| if not present."""
54+
evenAndOddHeaders = self.evenAndOddHeaders
55+
if evenAndOddHeaders is None:
56+
return False
57+
return evenAndOddHeaders.val

docx/settings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,11 @@ class Settings(ElementProxy):
1414
"""
1515

1616
__slots__ = ()
17+
18+
@property
19+
def odd_and_even_pages_header_footer(self):
20+
"""True if this document has distinct odd and even page headers and footers.
21+
22+
Read/write.
23+
"""
24+
return self._element.evenAndOddHeaders_val

features/doc-settings.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ Feature: Document.settings
1515
| no |
1616

1717

18-
@wip
1918
Scenario Outline: Settings.odd_and_even_pages_header_footer getter
2019
Given a Settings object <with-or-without> odd and even page headers as settings
2120
Then settings.odd_and_even_pages_header_footer is <value>

tests/test_settings.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# encoding: utf-8
2+
3+
"""Unit test suite for the docx.settings module"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
import pytest
8+
9+
from docx.settings import Settings
10+
11+
from .unitutil.cxml import element
12+
13+
14+
class DescribeSettings(object):
15+
16+
def it_knows_when_the_document_has_distinct_odd_and_even_headers(
17+
self, odd_and_even_get_fixture
18+
):
19+
settings_elm, expected_value = odd_and_even_get_fixture
20+
settings = Settings(settings_elm)
21+
22+
odd_and_even_pages_header_footer = settings.odd_and_even_pages_header_footer
23+
24+
assert odd_and_even_pages_header_footer is expected_value
25+
26+
# fixtures -------------------------------------------------------
27+
28+
@pytest.fixture(
29+
params=[
30+
("w:settings", False),
31+
("w:settings/w:evenAndOddHeaders", True),
32+
("w:settings/w:evenAndOddHeaders{w:val=0}", False),
33+
("w:settings/w:evenAndOddHeaders{w:val=1}", True),
34+
("w:settings/w:evenAndOddHeaders{w:val=true}", True),
35+
]
36+
)
37+
def odd_and_even_get_fixture(self, request):
38+
settings_cxml, expected_value = request.param
39+
settings_elm = element(settings_cxml)
40+
return settings_elm, expected_value

0 commit comments

Comments
 (0)