From 853ed35d873b5a3e95d5d332ffeb2211f772edfe Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 31 Dec 2015 17:22:57 +0000 Subject: Add reading of numbering.xml --- .../org/zwobble/mammoth/docx/NumberingXml.java | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/org/zwobble/mammoth/docx/NumberingXml.java (limited to 'src/main/java/org/zwobble/mammoth/docx/NumberingXml.java') 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> abstractNums = readAbstractNums(element.findChildren("w:abstractNum")); + return new Numbering(readNums(element.findChildren("w:num"), abstractNums)); + } + + private static Map> readAbstractNums(XmlElementList children) { + return toMap(children, NumberingXml::readAbstractNum); + } + + private static Map.Entry> 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 readAbstractNumLevels(XmlElement element) { + return toMap(element.findChildren("w:lvl"), NumberingXml::readAbstractNumLevel); + } + + private static Map.Entry readAbstractNumLevel(XmlElement element) { + String levelIndex = element.getAttribute("w:ilvl"); + Optional 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> readNums( + XmlElementList numElements, + Map> abstractNums + ) { + return toMap(numElements, numElement -> readNum(numElement, abstractNums)); + } + + private static Map.Entry> readNum( + XmlElement numElement, + Map> 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()); + } +} -- cgit v1.2.3