Skip to content

Commit 89678c5

Browse files
Benjamin Toornstrascanny
authored andcommitted
parts: add FootnotesPart
1 parent 8313711 commit 89678c5

6 files changed

Lines changed: 77 additions & 0 deletions

File tree

docs/conf.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@
109109
110110
.. |Font| replace:: :class:`.Font`
111111
112+
.. |FootnotesPart| replace:: :class:`.FootnotesPart`
113+
112114
.. |Inches| replace:: :class:`.Inches`
113115
114116
.. |InlineShape| replace:: :class:`.InlineShape`

docx/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from docx.parts.document import DocumentPart
1515
from docx.parts.endnotes import EndnotesPart
16+
from docx.parts.footnotes import FootnotesPart
1617
from docx.parts.hdrftr import FooterPart, HeaderPart
1718
from docx.parts.image import ImagePart
1819
from docx.parts.numbering import NumberingPart
@@ -31,6 +32,7 @@ def part_class_selector(content_type, reltype):
3132
PartFactory.part_type_for[CT.WML_DOCUMENT_MAIN] = DocumentPart
3233
PartFactory.part_type_for[CT.WML_ENDNOTES] = EndnotesPart
3334
PartFactory.part_type_for[CT.WML_FOOTER] = FooterPart
35+
PartFactory.part_type_for[CT.WML_FOOTNOTES] = FootnotesPart
3436
PartFactory.part_type_for[CT.WML_HEADER] = HeaderPart
3537
PartFactory.part_type_for[CT.WML_NUMBERING] = NumberingPart
3638
PartFactory.part_type_for[CT.WML_SETTINGS] = SettingsPart
@@ -42,6 +44,7 @@ def part_class_selector(content_type, reltype):
4244
DocumentPart,
4345
EndnotesPart,
4446
FooterPart,
47+
FootnotesPart,
4548
HeaderPart,
4649
NumberingPart,
4750
PartFactory,

docx/oxml/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
8080
from docx.oxml.endnotes import CT_Endnotes # noqa
8181
register_element_cls('w:endnotes', CT_Endnotes)
8282

83+
from docx.oxml.footnotes import CT_Footnotes # noqa
84+
register_element_cls('w:footnotes', CT_Footnotes)
85+
8386
from docx.oxml.hdrftr import CT_HdrFtr # noqa
8487
register_element_cls('w:ftr', CT_HdrFtr)
8588
register_element_cls('w:hdr', CT_HdrFtr)

docx/oxml/footnotes.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# encoding: utf-8
2+
3+
"""Custom element classes related to footnotes"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
from docx.oxml.xmlchemy import BaseOxmlElement
8+
9+
10+
class CT_Footnotes(BaseOxmlElement):
11+
"""`w:footnotes` element"""

docx/parts/footnotes.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# encoding: utf-8
2+
3+
"""|FootnotesPart| and related objects"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
from docx.opc.part import XmlPart
8+
9+
10+
class FootnotesPart(XmlPart):
11+
"""Package part containing footnotes"""

tests/parts/test_footnotes.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# encoding: utf-8
2+
3+
"""Unit test suite for the docx.parts.footnotes module"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
import pytest
8+
9+
from docx.opc.constants import CONTENT_TYPE as CT, RELATIONSHIP_TYPE as RT
10+
from docx.opc.part import PartFactory
11+
from docx.package import Package
12+
from docx.parts.footnotes import FootnotesPart
13+
14+
from ..unitutil.mock import instance_mock, method_mock
15+
16+
17+
class DescribeFootnotesPart(object):
18+
19+
def it_is_used_by_loader_to_construct_footnotes_part(
20+
self, package_, FootnotesPart_load_, footnotes_part_
21+
):
22+
partname = "footnotes.xml"
23+
content_type = CT.WML_FOOTNOTES
24+
reltype = RT.FOOTNOTES
25+
blob = "<w:footnotes/>"
26+
FootnotesPart_load_.return_value = footnotes_part_
27+
28+
part = PartFactory(partname, content_type, reltype, blob, package_)
29+
30+
FootnotesPart_load_.assert_called_once_with(
31+
partname, content_type, blob, package_
32+
)
33+
assert part is footnotes_part_
34+
35+
# fixture components ---------------------------------------------
36+
37+
@pytest.fixture
38+
def FootnotesPart_load_(self, request):
39+
return method_mock(request, FootnotesPart, "load")
40+
41+
@pytest.fixture
42+
def footnotes_part_(self, request):
43+
return instance_mock(request, FootnotesPart)
44+
45+
@pytest.fixture
46+
def package_(self, request):
47+
return instance_mock(request, Package)

0 commit comments

Comments
 (0)