From 014e7ef150a860f06323692ceaa5a9f21874f678 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 9 Aug 2026 15:03:03 +0100 Subject: Ignore numbering levels that use numStyleLink to refer to themselves --- .../java/org/zwobble/mammoth/internal/docx/Numbering.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java b/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java index 1a39047..6213d13 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java @@ -4,8 +4,10 @@ import org.zwobble.mammoth.internal.documents.NumberingLevel; import org.zwobble.mammoth.internal.util.Iterables; import org.zwobble.mammoth.internal.util.Maps; +import java.util.HashSet; import java.util.Map; import java.util.Optional; +import java.util.Set; import static org.zwobble.mammoth.internal.util.Maps.lookup; import static org.zwobble.mammoth.internal.util.Maps.map; @@ -86,6 +88,15 @@ public class Numbering { } public Optional findLevel(String numId, String level) { + return findLevelWithSeenNumIds(numId, level, new HashSet<>()); + } + + public Optional findLevelWithSeenNumIds(String numId, String level, Set seenNumIds) { + if (seenNumIds.contains(numId)) { + return Optional.empty(); + } + seenNumIds.add(numId); + return lookup(nums, numId) .flatMap(num -> num.abstractNumId) .flatMap(abstractNumId -> lookup(this.abstractNums, abstractNumId)) @@ -94,7 +105,7 @@ public class Numbering { return abstractNum.numStyleLink .flatMap(numStyleLink -> styles.findNumberingStyleById(numStyleLink)) .flatMap(style -> style.getNumId()) - .flatMap(linkedNumId -> findLevel(linkedNumId, level)); + .flatMap(linkedNumId -> findLevelWithSeenNumIds(linkedNumId, level, seenNumIds)); } else { return lookup(abstractNum.levels, level).map(value -> value.toNumberingLevel()); } -- cgit v1.2.3