From ef76dd48d78fc715ce428e07cec2401b3bfbee74 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 5 Aug 2014 16:36:15 +0100 Subject: Add support for reading w:br --- mammoth/documents.py | 2 ++ mammoth/docx/document_xml.py | 9 +++++++++ tests/docx/document_xml_tests.py | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/mammoth/documents.py b/mammoth/documents.py index 4f67850..326fbeb 100644 --- a/mammoth/documents.py +++ b/mammoth/documents.py @@ -9,6 +9,7 @@ Hyperlink = dodge.data_class("Hyperlink", ["href", "children"]) Table = dodge.data_class("Table", ["children"]) TableRow = dodge.data_class("TableRow", ["children"]) TableCell = dodge.data_class("TableCell", ["children"]) +LineBreak = dodge.data_class("LineBreak", []) class Tab(object): pass @@ -42,6 +43,7 @@ hyperlink = Hyperlink table = Table table_row = TableRow table_cell = TableCell +line_break = LineBreak def numbering_level(level_index, is_ordered): return _NumberingLevel(str(level_index), bool(is_ordered)) diff --git a/mammoth/docx/document_xml.py b/mammoth/docx/document_xml.py index 32d655c..f96098e 100644 --- a/mammoth/docx/document_xml.py +++ b/mammoth/docx/document_xml.py @@ -159,6 +159,15 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file): href = relationships[relationship_id].target return children_result.map(lambda children: documents.hyperlink(href, children)) + @handler("w:br") + def br(element): + break_type = element.attributes.get("w:type") + if break_type: + warning = results.warning("Unsupported break type: {0}".format(break_type)) + return results.Result(None, [warning]) + else: + return results.success(documents.line_break()) + @handler("wp:inline") @handler("wp:anchor") def inline(element): diff --git a/tests/docx/document_xml_tests.py b/tests/docx/document_xml_tests.py index 984609d..963a75f 100644 --- a/tests/docx/document_xml_tests.py +++ b/tests/docx/document_xml_tests.py @@ -219,6 +219,22 @@ class ReadXmlElementTests(object): [documents.run([])], _read_and_get_document_xml_element(element) ) + + + @istest + def br_is_read_as_line_break(self): + break_element = xml_element("w:br", {}, []) + result = _read_and_get_document_xml_element(break_element) + assert_equal(result, documents.line_break()) + + + @istest + def warning_on_breaks_that_arent_line_breaks(self): + break_element = xml_element("w:br", {"w:type": "page"}, []) + result = read_document_xml_element(break_element) + expected_warning = results.warning("Unsupported break type: page") + assert_equal([expected_warning], result.messages) + assert_equal(None, result.value) @istest -- cgit v1.2.3