aboutsummaryrefslogtreecommitdiff
path: root/mammoth/docx/__init__.py
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-01 11:51:38 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-01 11:51:38 +0000
commitd5acaf1071564a9997a330315ea99cdc1017bae7 (patch)
treeffaee2557ff0fd4a2c69c19855293faa29b1277f /mammoth/docx/__init__.py
parentf8d72dbba832db282a3ec04a5108fbd090f49a4f (diff)
Move document.xml parsing to separate module
Diffstat (limited to 'mammoth/docx/__init__.py')
-rw-r--r--mammoth/docx/__init__.py73
1 files changed, 2 insertions, 71 deletions
diff --git a/mammoth/docx/__init__.py b/mammoth/docx/__init__.py
index de2b8a8..17c90a8 100644
--- a/mammoth/docx/__init__.py
+++ b/mammoth/docx/__init__.py
@@ -3,6 +3,7 @@ import zipfile
from .. import documents
from ..results import Result
from .xmlparser import parse_xml, node_types
+from .document_xml import read_document_xml_element
_namespaces = [
@@ -14,75 +15,5 @@ def read(fileobj):
zip_file = zipfile.ZipFile(fileobj)
document_fileobj = zip_file.open("word/document.xml")
document_xml = parse_xml(document_fileobj, _namespaces)
- return Result(read_xml_element(document_xml), [])
+ return Result(read_document_xml_element(document_xml), [])
-
-_handlers = {}
-
-
-def handler(name):
- def add(func):
- _handlers[name] = func
-
- return add
-
-
-def read_xml_element(element):
- handler = _handlers.get(element.name)
- if handler is None:
- return None
- else:
- return handler(element)
-
-
-@handler("w:t")
-def text(element):
- return documents.Text(_inner_text(element))
-
-
-@handler("w:r")
-def run(element):
- return documents.Run(_read_xml_elements(element.children))
-
-
-@handler("w:p")
-def paragraph(element):
- properties = element.find_child_or_null("w:pPr")
- style_name = properties \
- .find_child_or_null("w:pStyle") \
- .attributes.get("w:val")
-
- children = _read_xml_elements(element.children)
- return documents.paragraph(children, style_name)
-
-
-@handler("w:body")
-def body(element):
- return _read_xml_elements(element.children)
-
-
-@handler("w:document")
-def document(element):
- body_element = _find_child(element, "w:body")
- return documents.Document(_read_xml_elements(body_element.children))
-
-
-def _find(predicate, iterable):
- for item in iterable:
- if predicate(item):
- return item
-
-
-def _find_child(element, name):
- return _find(lambda child: child.name == name, element.children)
-
-
-def _read_xml_elements(elements):
- return filter(None, map(read_xml_element, elements))
-
-
-def _inner_text(node):
- if node.node_type == node_types.text:
- return node.value
- else:
- return "".join(_inner_text(child) for child in node.children)