aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2019-03-17 18:29:54 +0000
committerMichael Williamson <mike@zwobble.org>2019-03-17 18:29:54 +0000
commit65bcf3a7c50b1ec7b57d4974ad377ed66d6c98c8 (patch)
treee4d3c58407866c140655552ca53f25eaca3c4a77 /src/main/java/org
parent15daf7d09b8f3da093eea154f49579cdf2002fa7 (diff)
Defer resolution of abstract nums until necessary
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java25
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java20
2 files changed, 27 insertions, 18 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 5ee09db..2680cfa 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/Numbering.java
@@ -9,16 +9,31 @@ import static org.zwobble.mammoth.internal.util.Maps.lookup;
import static org.zwobble.mammoth.internal.util.Maps.map;
public class Numbering {
- public static final Numbering EMPTY = new Numbering(map());
+ public static class Num {
+ private final Optional<String> abstractNumId;
- private final Map<String, Map<String, NumberingLevel>> numbering;
+ public Num(Optional<String> abstractNumId) {
+ this.abstractNumId = abstractNumId;
+ }
+ }
+
+ public static final Numbering EMPTY = new Numbering(map(), map());
+
+ private final Map<String, Map<String, NumberingLevel>> abstractNums;
+ private final Map<String, Num> nums;
- public Numbering(Map<String, Map<String, NumberingLevel>> numbering) {
- this.numbering = numbering;
+ public Numbering(
+ Map<String, Map<String, NumberingLevel>> abstractNums,
+ Map<String, Num> nums
+ ) {
+ this.abstractNums = abstractNums;
+ this.nums = nums;
}
public Optional<NumberingLevel> findLevel(String numId, String level) {
- return lookup(numbering, numId)
+ return lookup(nums, numId)
+ .flatMap(num -> num.abstractNumId)
+ .flatMap(abstractNumId -> lookup(this.abstractNums, abstractNumId))
.flatMap(levels -> lookup(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 fa1941f..33e5e27 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/NumberingXml.java
@@ -8,13 +8,13 @@ import java.util.Map;
import java.util.Optional;
import static org.zwobble.mammoth.internal.util.Maps.entry;
-import static org.zwobble.mammoth.internal.util.Maps.lookup;
import static org.zwobble.mammoth.internal.util.Maps.toMap;
public class NumberingXml {
public static Numbering readNumberingXmlElement(XmlElement element) {
Map<String, Map<String, NumberingLevel>> abstractNums = readAbstractNums(element.findChildren("w:abstractNum"));
- return new Numbering(readNums(element.findChildren("w:num"), abstractNums));
+ Map<String, Numbering.Num> nums = readNums(element.findChildren("w:num"));
+ return new Numbering(abstractNums, nums);
}
private static Map<String, Map<String, NumberingLevel>> readAbstractNums(XmlElementList children) {
@@ -38,20 +38,14 @@ public class NumberingXml {
return entry(levelIndex, new NumberingLevel(levelIndex, isOrdered));
}
- private static Map<String, Map<String, NumberingLevel>> readNums(
- XmlElementList numElements,
- Map<String, Map<String, NumberingLevel>> abstractNums
- ) {
- return toMap(numElements, numElement -> readNum(numElement, abstractNums));
+ private static Map<String, Numbering.Num> readNums(XmlElementList numElements) {
+ return toMap(numElements, NumberingXml::readNum);
}
- private static Map.Entry<String,Map<String,NumberingLevel>> readNum(
- XmlElement numElement,
- Map<String, Map<String, NumberingLevel>> abstractNums
- ) {
+ private static Map.Entry<String, Numbering.Num> readNum(XmlElement numElement) {
// TODO: in python-mammoth, we allow None here. Check whether that's actually possible or not
String numId = numElement.getAttribute("w:numId");
- String abstractNumId = numElement.findChild("w:abstractNumId").get().getAttribute("w:val");
- return entry(numId, lookup(abstractNums, abstractNumId).get());
+ Optional<String> abstractNumId = numElement.findChildOrEmpty("w:abstractNumId").getAttributeOrNone("w:val");
+ return entry(numId, new Numbering.Num(abstractNumId));
}
}