From 9d73a4b20a5bb24919697e29d221fdc6c9b50c13 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 9 Aug 2026 14:57:34 +0100 Subject: Ignore numbering levels that use numStyleLink to refer to themselves --- mammoth/docx/numbering_xml.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'mammoth') diff --git a/mammoth/docx/numbering_xml.py b/mammoth/docx/numbering_xml.py index 0bd1952..22fa28f 100644 --- a/mammoth/docx/numbering_xml.py +++ b/mammoth/docx/numbering_xml.py @@ -101,18 +101,25 @@ class Numbering(object): self._styles = styles def find_level(self, num_id, level): + return self._find_level_with_seen_num_ids(num_id, level, seen_num_ids=set()) + + def _find_level_with_seen_num_ids(self, num_id, level, seen_num_ids): + if num_id in seen_num_ids: + return None + seen_num_ids.add(num_id) + num = self._nums.get(num_id) if num is None: return None + + abstract_num = self._abstract_nums.get(num.abstract_num_id) + if abstract_num is None: + return None + elif abstract_num.num_style_link is None: + return self._to_numbering_level(abstract_num.levels.get(level)) else: - abstract_num = self._abstract_nums.get(num.abstract_num_id) - if abstract_num is None: - return None - elif abstract_num.num_style_link is None: - return self._to_numbering_level(abstract_num.levels.get(level)) - else: - style = self._styles.find_numbering_style_by_id(abstract_num.num_style_link) - return self.find_level(style.num_id, level) + style = self._styles.find_numbering_style_by_id(abstract_num.num_style_link) + return self._find_level_with_seen_num_ids(style.num_id, level, seen_num_ids=seen_num_ids) def find_level_by_paragraph_style_id(self, style_id): return self._levels_by_paragraph_style_id.get(style_id) -- cgit v1.2.3