diff options
| author | Michael Williamson <mike@zwobble.org> | 2019-03-17 21:44:44 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2019-03-17 21:45:09 +0000 |
| commit | f2fd5ec08b2b87278f2929d7c15c9ed71fbac8d8 (patch) | |
| tree | dfe036e0e13aa68e2173702d27a17edca0df2643 /src | |
| parent | 4d078c3842a40d723f79a5896250ad522ebd083a (diff) | |
Follow w:numStyleLink in w:abstractNum
Diffstat (limited to 'src')
4 files changed, 58 insertions, 8 deletions
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 0191763..90ea5c1 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java @@ -11,9 +11,11 @@ import static org.zwobble.mammoth.internal.util.Maps.map; public class Numbering { public static class AbstractNum { private final Map<String, NumberingLevel> levels; + private final Optional<String> numStyleLink; - public AbstractNum(Map<String, NumberingLevel> levels) { + public AbstractNum(Map<String, NumberingLevel> levels, Optional<String> numStyleLink) { this.levels = levels; + this.numStyleLink = numStyleLink; } } @@ -25,23 +27,35 @@ public class Numbering { } } - public static final Numbering EMPTY = new Numbering(map(), map()); + public static final Numbering EMPTY = new Numbering(map(), map(), Styles.EMPTY); private final Map<String, AbstractNum> abstractNums; private final Map<String, Num> nums; + private final Styles styles; public Numbering( Map<String, AbstractNum> abstractNums, - Map<String, Num> nums + Map<String, Num> nums, + Styles styles ) { this.abstractNums = abstractNums; this.nums = nums; + this.styles = styles; } public Optional<NumberingLevel> findLevel(String numId, String level) { return lookup(nums, numId) .flatMap(num -> num.abstractNumId) .flatMap(abstractNumId -> lookup(this.abstractNums, abstractNumId)) - .flatMap(abstractNum -> lookup(abstractNum.levels, level)); + .flatMap(abstractNum -> { + if (abstractNum.numStyleLink.isPresent()) { + return abstractNum.numStyleLink + .flatMap(numStyleLink -> styles.findNumberingStyleById(numStyleLink)) + .flatMap(style -> style.getNumId()) + .flatMap(linkedNumId -> findLevel(linkedNumId, level)); + } else { + return lookup(abstractNum.levels, level); + } + }); } } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java b/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java index 6b5372f..b25ffdd 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java @@ -14,7 +14,7 @@ public class NumberingXml { public static Numbering readNumberingXmlElement(XmlElement element, Styles styles) { Map<String, Numbering.AbstractNum> abstractNums = readAbstractNums(element.findChildren("w:abstractNum")); Map<String, Numbering.Num> nums = readNums(element.findChildren("w:num")); - return new Numbering(abstractNums, nums); + return new Numbering(abstractNums, nums, styles); } private static Map<String, Numbering.AbstractNum> readAbstractNums(XmlElementList children) { @@ -24,7 +24,11 @@ public class NumberingXml { private static Map.Entry<String, Numbering.AbstractNum> readAbstractNum(XmlElement element) { // TODO: in python-mammoth, we allow None here. Check whether that's actually possible or not String abstractNumId = element.getAttribute("w:abstractNumId"); - return entry(abstractNumId, new Numbering.AbstractNum(readAbstractNumLevels(element))); + Numbering.AbstractNum abstractNum = new Numbering.AbstractNum( + readAbstractNumLevels(element), + element.findChildOrEmpty("w:numStyleLink").getAttributeOrNone("w:val") + ); + return entry(abstractNumId, abstractNum); } private static Map<String, NumberingLevel> readAbstractNumLevels(XmlElement element) { 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 897ea60..b11c5b1 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -1443,12 +1443,13 @@ public class BodyXmlTests { return new Numbering( numbering.entrySet().stream().collect(Collectors.toMap( entry -> entry.getKey(), - entry -> new Numbering.AbstractNum(entry.getValue()) + entry -> new Numbering.AbstractNum(entry.getValue(), Optional.empty()) )), numbering.keySet().stream().collect(Collectors.toMap( numId -> numId, numId -> new Numbering.Num(Optional.of(numId)) - )) + )), + Styles.EMPTY ); } } 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 cbea693..a94f8e8 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java @@ -1,6 +1,7 @@ package org.zwobble.mammoth.tests.docx; import org.junit.jupiter.api.Test; +import org.zwobble.mammoth.internal.documents.NumberingStyle; import org.zwobble.mammoth.internal.docx.Numbering; import org.zwobble.mammoth.internal.docx.Styles; import org.zwobble.mammoth.internal.xml.XmlElement; @@ -48,6 +49,36 @@ public class NumberingXmlTests { assertEquals(true, numbering.findLevel("47", "1").get().isOrdered()); } + @Test + public void whenAbstractNumHasNumStyleLinkThenStyleIsUsedToFindNum() { + Numbering numbering = readNumberingXmlElement( + element("w:numbering", list( + element("w:abstractNum", map("w:abstractNumId", "100"), list( + element("w:lvl", map("w:ilvl", "0"), list( + element("w:numFmt", map("w:val", "decimal")) + )) + )), + element("w:abstractNum", map("w:abstractNumId", "101"), list( + element("w:numStyleLink", map("w:val", "List1")) + )), + element("w:num", map("w:numId", "200"), list( + element("w:abstractNumId", map("w:val", "100")) + )), + element("w:num", map("w:numId", "201"), list( + element("w:abstractNumId", map("w:val", "101")) + )) + )), + new Styles( + map(), + map(), + map(), + map("List1", new NumberingStyle(Optional.of("200"))) + ) + ); + assertEquals(true, numbering.findLevel("201", "0").get().isOrdered()); + } + + private Numbering readNumbering(XmlElement element) { return readNumberingXmlElement(element, Styles.EMPTY); } |
