diff options
Diffstat (limited to 'mammoth')
| -rw-r--r-- | mammoth/docx/body_xml.py | 6 | ||||
| -rw-r--r-- | mammoth/docx/numbering_xml.py | 26 |
2 files changed, 26 insertions, 6 deletions
diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py index d3dd267..e2a490a 100644 --- a/mammoth/docx/body_xml.py +++ b/mammoth/docx/body_xml.py @@ -288,6 +288,12 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f if level is not None: return level + # Some malformed documents define numbering levels without an index, and + # reference the numbering using a w:numPr element without a w:ilvl child. + # To handle such cases, we assume a level of 0 as a fallback. + if num_id is not None: + return numbering.find_level(num_id, "0") + return None def _read_paragraph_indent(element): diff --git a/mammoth/docx/numbering_xml.py b/mammoth/docx/numbering_xml.py index 7f7bf0e..4614d0e 100644 --- a/mammoth/docx/numbering_xml.py +++ b/mammoth/docx/numbering_xml.py @@ -36,15 +36,29 @@ class _AbstractNumLevel(object): def _read_abstract_num_levels(element): - levels = map(_read_abstract_num_level, element.find_children("w:lvl")) - return dict( - (level.level_index, level) - for level in levels - ) + levels = {} + + # Some malformed documents define numbering levels without an index, and + # reference the numbering using a w:numPr element without a w:ilvl child. + # To handle such cases, we assume a level of 0 as a fallback. + level_without_index = None + + for level_element in element.find_children("w:lvl"): + level = _read_abstract_num_level(level_element) + if level.level_index is None: + level.level_index = "0" + level_without_index = level + else: + levels[level.level_index] = level + + if "0" not in levels and level_without_index is not None: + levels[level_without_index.level_index] = level_without_index + + return levels def _read_abstract_num_level(element): - level_index = element.attributes["w:ilvl"] + level_index = element.attributes.get("w:ilvl") num_fmt = element.find_child_or_null("w:numFmt").attributes.get("w:val") is_ordered = num_fmt != "bullet" paragraph_style_id = element.find_child_or_null("w:pStyle").attributes.get("w:val") |
