aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2019-03-17 21:44:44 +0000
committerMichael Williamson <mike@zwobble.org>2019-03-17 21:45:09 +0000
commitf2fd5ec08b2b87278f2929d7c15c9ed71fbac8d8 (patch)
treedfe036e0e13aa68e2173702d27a17edca0df2643 /src
parent4d078c3842a40d723f79a5896250ad522ebd083a (diff)
Follow w:numStyleLink in w:abstractNum
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java22
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java8
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java5
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/NumberingXmlTests.java31
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);
}