From 98c98549a237be0db4689bf38436a24fc30ac111 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 11 Sep 2025 15:37:06 +0100 Subject: Handle numbering levels defined without an index --- .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 11 ++-- .../mammoth/tests/docx/NumberingXmlTests.java | 60 ++++++++++++++++++++++ 2 files changed, 67 insertions(+), 4 deletions(-) (limited to 'src/test/java/org/zwobble') diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index ef5262a..ea3e3f3 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -259,18 +259,21 @@ public class BodyXmlTests { } @Test - public void numberingPropertiesAreIgnoredIfLevelIsMissing() { + public void whenNumberingPropertiesAreMissingLevelThenLevelOf0IsAssumed() { // TODO: emit warning XmlElement element = paragraphXml(list( element("w:pPr", list( element("w:numPr", map(), list( - element("w:numId", map("w:val", "42")))))))); + element("w:numId", map("w:val", "42")) + )) + )) + )); - Numbering numbering = numberingMap(map("42", map("1", Numbering.AbstractNumLevel.ordered("1")))); + Numbering numbering = numberingMap(map("42", map("0", Numbering.AbstractNumLevel.ordered("0")))); assertThat( readSuccess(bodyReader(numbering), element), - hasNumbering(Optional.empty())); + hasNumbering(NumberingLevel.ordered("0"))); } @Test diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java index 4853b54..676b654 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java @@ -78,6 +78,66 @@ public class NumberingXmlTests { assertEquals(Optional.empty(), numbering.findLevel("47", "0")); } + @Test + public void givenNoOtherLevelsWithIndexOf0WhenLevelIsMissingIlvlThenLevelIndexIs0() { + XmlElement element = element("w:numbering", list( + element("w:abstractNum", map("w:abstractNumId", "42"), list( + element("w:lvl", map(), list( + element("w:numFmt", map("w:val", "decimal")) + )) + )), + element("w:num", map("w:numId", "47"), list( + element("w:abstractNumId", map("w:val", "42")) + )) + )); + + Numbering numbering = readNumbering(element); + + assertEquals(true, numbering.findLevel("47", "0").get().isOrdered()); + } + + @Test + public void givenPreviousOtherLevelWithIndexOf0WhenLevelIsMissingIlvlThenLevelIsIgnored() { + XmlElement element = element("w:numbering", list( + element("w:abstractNum", map("w:abstractNumId", "42"), list( + element("w:lvl", map("w:ilvl", "0"), list( + element("w:numFmt", map("w:val", "bullet")) + )), + element("w:lvl", map(), list( + element("w:numFmt", map("w:val", "decimal")) + )) + )), + element("w:num", map("w:numId", "47"), list( + element("w:abstractNumId", map("w:val", "42")) + )) + )); + + Numbering numbering = readNumbering(element); + + assertEquals(false, numbering.findLevel("47", "0").get().isOrdered()); + } + + @Test + public void givenSubsequentOtherLevelWithIndexOf0WhenLevelIsMissingIlvlThenLevelIsIgnored() { + XmlElement element = element("w:numbering", list( + element("w:abstractNum", map("w:abstractNumId", "42"), list( + element("w:lvl", map(), list( + element("w:numFmt", map("w:val", "decimal")) + )), + element("w:lvl", map("w:ilvl", "0"), list( + element("w:numFmt", map("w:val", "bullet")) + )) + )), + element("w:num", map("w:numId", "47"), list( + element("w:abstractNumId", map("w:val", "42")) + )) + )); + + Numbering numbering = readNumbering(element); + + assertEquals(false, numbering.findLevel("47", "0").get().isOrdered()); + } + @Test public void whenAbstractNumHasNumStyleLinkThenStyleIsUsedToFindNum() { Numbering numbering = readNumberingXmlElement( -- cgit v1.2.3