package org.zwobble.mammoth.internal.docx; import org.zwobble.mammoth.internal.documents.NumberingStyle; import org.zwobble.mammoth.internal.documents.Style; import org.zwobble.mammoth.internal.xml.XmlElement; import org.zwobble.mammoth.internal.xml.XmlElementList; import java.util.Map; import java.util.Optional; import static org.zwobble.mammoth.internal.util.Iterables.lazyFilter; import static org.zwobble.mammoth.internal.util.Maps.entry; import static org.zwobble.mammoth.internal.util.Maps.toMap; public class StylesXml { public static Styles readStylesXmlElement(XmlElement element) { XmlElementList styleElements = element.findChildren("w:style"); return new Styles( readStyles(styleElements, "paragraph"), readStyles(styleElements, "character"), readStyles(styleElements, "table"), readNumberingStyles(styleElements) ); } private static Map readStyles(XmlElementList styleElements, String styleType) { return toMap( styleElementsOfType(styleElements, styleType), StylesXml::readStyle ); } private static Map.Entry readStyle(XmlElement element) { String styleId = readStyleId(element); Optional styleName = element.findChildOrEmpty("w:name").getAttributeOrNone("w:val"); return entry(styleId, new Style(styleId, styleName)); } private static Map readNumberingStyles(XmlElementList styleElements) { return toMap( styleElementsOfType(styleElements, "numbering"), StylesXml::readNumberingStyle ); } private static Map.Entry readNumberingStyle(XmlElement element) { String styleId = readStyleId(element); Optional numId = element .findChildOrEmpty("w:pPr") .findChildOrEmpty("w:numPr") .findChildOrEmpty("w:numId") .getAttributeOrNone("w:val"); return entry(styleId, new NumberingStyle(numId)); } private static String readStyleId(XmlElement element) { return element.getAttribute("w:styleId"); } private static Iterable styleElementsOfType(XmlElementList styleElements, String styleType) { return lazyFilter(styleElements, styleElement -> isStyleType(styleElement, styleType)); } private static boolean isStyleType(XmlElement styleElement, String styleType) { return styleElement.getAttribute("w:type").equals(styleType); } }