package org.zwobble.mammoth.internal.docx; import org.zwobble.mammoth.internal.documents.NumberingLevel; import org.zwobble.mammoth.internal.xml.XmlElement; import org.zwobble.mammoth.internal.xml.XmlElementList; import java.util.Map; import java.util.Optional; import static com.google.common.collect.Maps.immutableEntry; import static org.zwobble.mammoth.internal.util.MammothMaps.lookup; import static org.zwobble.mammoth.internal.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, lookup(abstractNums, abstractNumId).get()); } }