Skip to content

Commit f46751f

Browse files
committed
blk: add Document.iter_inner_content()
1 parent 3c16691 commit f46751f

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

src/docx/blkcntnr.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from __future__ import annotations
1010

11-
from typing import TYPE_CHECKING
11+
from typing import TYPE_CHECKING, Iterator
1212

1313
from typing_extensions import TypeAlias
1414

@@ -71,6 +71,10 @@ def add_table(self, rows: int, cols: int, width: Length) -> Table:
7171
self._element._insert_tbl(tbl) # # pyright: ignore[reportPrivateUsage]
7272
return Table(tbl, self)
7373

74+
def iter_inner_content(self) -> Iterator[Paragraph | Table]:
75+
"""Generate each `Paragraph` or `Table` in this container in document order."""
76+
raise NotImplementedError
77+
7478
@property
7579
def paragraphs(self):
7680
"""A list containing the paragraphs in this container, in document order.

src/docx/document.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from __future__ import annotations
77

8-
from typing import IO, TYPE_CHECKING, List
8+
from typing import IO, TYPE_CHECKING, Iterator, List
99

1010
from docx.blkcntnr import BlockItemContainer
1111
from docx.enum.section import WD_SECTION
@@ -124,6 +124,10 @@ def inline_shapes(self):
124124
"""
125125
return self._part.inline_shapes
126126

127+
def iter_inner_content(self) -> Iterator[Paragraph | Table]:
128+
"""Generate each `Paragraph` or `Table` in this document in document order."""
129+
return self._body.iter_inner_content()
130+
127131
@property
128132
def paragraphs(self) -> List[Paragraph]:
129133
"""The |Paragraph| instances in the document, in document order.

tests/test_document.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55

66
from __future__ import annotations
77

8+
from typing import cast
9+
810
import pytest
911

1012
from docx.document import Document, _Body
1113
from docx.enum.section import WD_SECTION
1214
from docx.enum.text import WD_BREAK
1315
from docx.opc.coreprops import CoreProperties
16+
from docx.oxml.document import CT_Document
1417
from docx.parts.document import DocumentPart
1518
from docx.section import Section, Sections
1619
from docx.settings import Settings
@@ -22,7 +25,7 @@
2225
from docx.text.run import Run
2326

2427
from .unitutil.cxml import element, xml
25-
from .unitutil.mock import class_mock, instance_mock, method_mock, property_mock
28+
from .unitutil.mock import Mock, class_mock, instance_mock, method_mock, property_mock
2629

2730

2831
class DescribeDocument:
@@ -104,6 +107,16 @@ def it_provides_access_to_its_inline_shapes(self, inline_shapes_fixture):
104107
document, inline_shapes_ = inline_shapes_fixture
105108
assert document.inline_shapes is inline_shapes_
106109

110+
def it_can_iterate_the_inner_content_of_the_document(
111+
self, body_prop_: Mock, body_: Mock, document_part_: Mock
112+
):
113+
document_elm = cast(CT_Document, element("w:document"))
114+
body_prop_.return_value = body_
115+
body_.iter_inner_content.return_value = iter((1, 2, 3))
116+
document = Document(document_elm, document_part_)
117+
118+
assert list(document.iter_inner_content()) == [1, 2, 3]
119+
107120
def it_provides_access_to_its_paragraphs(self, paragraphs_fixture):
108121
document, paragraphs_ = paragraphs_fixture
109122
paragraphs = document.paragraphs

0 commit comments

Comments
 (0)