aboutsummaryrefslogtreecommitdiff
path: root/mammoth/docx/document_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'mammoth/docx/document_xml.py')
-rw-r--r--mammoth/docx/document_xml.py50
1 files changed, 36 insertions, 14 deletions
diff --git a/mammoth/docx/document_xml.py b/mammoth/docx/document_xml.py
index dd018de..f8fb962 100644
--- a/mammoth/docx/document_xml.py
+++ b/mammoth/docx/document_xml.py
@@ -5,10 +5,21 @@ from .xmlparser import node_types
def read_document_xml_element(element, numbering=None):
reader = _create_reader(numbering)
- return results.Result(reader(element), [])
+ return reader(element)
def _create_reader(numbering):
_handlers = {}
+ _ignored_elements = set([
+ "w:bookmarkStart",
+ "w:bookmarkEnd",
+ "w:sectPr",
+ "w:proofErr",
+ "w:lastRenderedPageBreak",
+ "w:commentRangeStart",
+ "w:commentRangeEnd",
+ "w:commentReference",
+ "w:del"
+ ])
def handler(name):
def add(func):
@@ -18,7 +29,7 @@ def _create_reader(numbering):
@handler("w:t")
def text(element):
- return documents.Text(_inner_text(element))
+ return results.success(documents.Text(_inner_text(element)))
@handler("w:r")
@@ -30,12 +41,13 @@ def _create_reader(numbering):
is_bold = properties.find_child("w:b")
is_italic = properties.find_child("w:i")
- return documents.run(
- children=_read_xml_elements(element.children),
- style_name=style_name,
- is_bold=is_bold,
- is_italic=is_italic,
- )
+ return _read_xml_elements(element.children) \
+ .map(lambda children: documents.run(
+ children=children,
+ style_name=style_name,
+ is_bold=is_bold,
+ is_italic=is_italic,
+ ))
@handler("w:p")
@@ -50,8 +62,12 @@ def _create_reader(numbering):
else:
numbering = _read_numbering_properties(numbering_properties)
- children = _read_xml_elements(element.children)
- return documents.paragraph(children, style_name, numbering)
+ return _read_xml_elements(element.children) \
+ .map(lambda children: documents.paragraph(
+ children=children,
+ style_name=style_name,
+ numbering=numbering,
+ ))
def _read_numbering_properties(element):
num_id = element.find_child("w:numId").attributes["w:val"]
@@ -67,23 +83,29 @@ def _create_reader(numbering):
@handler("w:document")
def document(element):
body_element = _find_child(element, "w:body")
- return documents.document(_read_xml_elements(body_element.children))
+ return _read_xml_elements(body_element.children) \
+ .map(documents.document)
@handler("w:tab")
def tab(element):
- return documents.tab()
+ return results.success(documents.tab())
def read(element):
handler = _handlers.get(element.name)
if handler is None:
- return None
+ if element.name not in _ignored_elements:
+ warning = results.warning("An unrecognised element was ignored: {0}".format(element.name))
+ return results.Result(None, [warning])
+ else:
+ return results.success(None)
else:
return handler(element)
def _read_xml_elements(elements):
- return filter(None, map(read, elements))
+ return results.combine(map(read, elements)) \
+ .map(lambda values: filter(None, values))
return read