diff options
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/docx/NumberingXml.java')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/docx/NumberingXml.java | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/docx/NumberingXml.java b/src/main/java/org/zwobble/mammoth/docx/NumberingXml.java new file mode 100644 index 0000000..9c3e286 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/docx/NumberingXml.java @@ -0,0 +1,56 @@ +package org.zwobble.mammoth.docx; + +import org.zwobble.mammoth.documents.NumberingLevel; +import org.zwobble.mammoth.xml.XmlElement; +import org.zwobble.mammoth.xml.XmlElementList; + +import java.util.Map; +import java.util.Optional; + +import static com.google.common.collect.Maps.immutableEntry; +import static org.zwobble.mammoth.util.MammothMaps.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)); + } + + private static Map<String, Map<String, NumberingLevel>> readAbstractNums(XmlElementList children) { + return toMap(children, NumberingXml::readAbstractNum); + } + + private static Map.Entry<String, Map<String, NumberingLevel>> 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 immutableEntry(abstractNumId, readAbstractNumLevels(element)); + } + + private static Map<String, NumberingLevel> readAbstractNumLevels(XmlElement element) { + return toMap(element.findChildren("w:lvl"), NumberingXml::readAbstractNumLevel); + } + + private static Map.Entry<String, NumberingLevel> readAbstractNumLevel(XmlElement element) { + String levelIndex = element.getAttribute("w:ilvl"); + Optional<String> numFmt = element.findChildOrEmpty("w:numFmt").getAttributeOrNone("w:val"); + boolean isOrdered = !numFmt.equals(Optional.of("bullet")); + return immutableEntry(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.Entry<String,Map<String,NumberingLevel>> readNum( + XmlElement numElement, + Map<String, Map<String, NumberingLevel>> abstractNums + ) { + // 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").getAttribute("w:val"); + return immutableEntry(numId, Optional.ofNullable(abstractNums.get(abstractNumId)).get()); + } +} |
