diff options
Diffstat (limited to 'src')
5 files changed, 107 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/NumberingStyle.java b/src/main/java/org/zwobble/mammoth/internal/documents/NumberingStyle.java new file mode 100644 index 0000000..9fc22c0 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/internal/documents/NumberingStyle.java @@ -0,0 +1,15 @@ +package org.zwobble.mammoth.internal.documents; + +import java.util.Optional; + +public class NumberingStyle { + private final Optional<String> numId; + + public NumberingStyle(Optional<String> numId) { + this.numId = numId; + } + + public Optional<String> getNumId() { + return numId; + } +} diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Styles.java b/src/main/java/org/zwobble/mammoth/internal/docx/Styles.java index 521fced..8fcf582 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Styles.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Styles.java @@ -1,5 +1,6 @@ package org.zwobble.mammoth.internal.docx; +import org.zwobble.mammoth.internal.documents.NumberingStyle; import org.zwobble.mammoth.internal.documents.Style; import java.util.Map; @@ -9,16 +10,23 @@ import static org.zwobble.mammoth.internal.util.Maps.lookup; import static org.zwobble.mammoth.internal.util.Maps.map; public class Styles { - public static final Styles EMPTY = new Styles(map(), map(), map()); + public static final Styles EMPTY = new Styles(map(), map(), map(), map()); private final Map<String, Style> paragraphStyles; private final Map<String, Style> characterStyles; private final Map<String, Style> tableStyles; - - public Styles(Map<String, Style> paragraphStyles, Map<String, Style> characterStyles, Map<String, Style> tableStyles) { + private final Map<String, NumberingStyle> numberingStyles; + + public Styles( + Map<String, Style> paragraphStyles, + Map<String, Style> characterStyles, + Map<String, Style> tableStyles, + Map<String, NumberingStyle> numberingStyles + ) { this.paragraphStyles = paragraphStyles; this.characterStyles = characterStyles; this.tableStyles = tableStyles; + this.numberingStyles = numberingStyles; } public Optional<Style> findParagraphStyleById(String id) { @@ -32,4 +40,8 @@ public class Styles { public Optional<Style> findTableStyleById(String id) { return lookup(tableStyles, id); } + + public Optional<NumberingStyle> findNumberingStyleById(String id) { + return lookup(numberingStyles, id); + } } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java b/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java index b7320e0..656b0dd 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java @@ -1,5 +1,6 @@ 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; @@ -17,19 +18,50 @@ public class StylesXml { return new Styles( readStyles(styleElements, "paragraph"), readStyles(styleElements, "character"), - readStyles(styleElements, "table") + readStyles(styleElements, "table"), + readNumberingStyles(styleElements) ); } private static Map<String, Style> readStyles(XmlElementList styleElements, String styleType) { return toMap( - lazyFilter(styleElements, styleElement -> styleElement.getAttribute("w:type").equals(styleType)), - StylesXml::readStyle); + styleElementsOfType(styleElements, styleType), + StylesXml::readStyle + ); } private static Map.Entry<String, Style> readStyle(XmlElement element) { - String styleId = element.getAttribute("w:styleId"); + String styleId = readStyleId(element); Optional<String> styleName = element.findChildOrEmpty("w:name").getAttributeOrNone("w:val"); return entry(styleId, new Style(styleId, styleName)); } + + private static Map<String, NumberingStyle> readNumberingStyles(XmlElementList styleElements) { + return toMap( + styleElementsOfType(styleElements, "numbering"), + StylesXml::readNumberingStyle + ); + } + + private static Map.Entry<String, NumberingStyle> readNumberingStyle(XmlElement element) { + String styleId = readStyleId(element); + Optional<String> 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<XmlElement> 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); + } } diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index 34e84a5..b12a5fe 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -82,6 +82,7 @@ public class BodyXmlTests { Styles styles = new Styles( map("Heading1", style), map(), + map(), map() ); assertThat( @@ -441,6 +442,7 @@ public class BodyXmlTests { Styles styles = new Styles( map(), map("Heading1Char", style), + map(), map() ); assertThat( @@ -772,7 +774,8 @@ public class BodyXmlTests { Styles styles = new Styles( map(), map(), - map("TableNormal", style) + map("TableNormal", style), + map() ); assertThat( readSuccess(bodyReader(styles), element), diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java index fc9a2cf..89a7d1a 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java @@ -81,6 +81,43 @@ public class StylesXmlTests { assertEquals(Optional.empty(), styles.findCharacterStyleById("Heading1Char").get().getName()); } + @Test + public void numberingStyleIsNoneIfNoStyleWithThatIdExists() { + XmlElement element = element("w:styles"); + + Styles styles = readStylesXmlElement(element); + + assertEquals(Optional.empty(), styles.findNumberingStyleById("List1")); + } + + @Test + public void numberingStyleHasNoneNumIdIfStyleHasNoParagraphProperties() { + XmlElement element = element("w:styles", list( + element("w:style", map("w:type", "numbering", "w:styleId", "List1")) + )); + + Styles styles = readStylesXmlElement(element); + + assertEquals(Optional.empty(), styles.findNumberingStyleById("List1").get().getNumId()); + } + + @Test + public void numberingStyleHasNumIdReadFromParagraphProperties() { + XmlElement element = element("w:styles", list( + element("w:style", map("w:type", "numbering", "w:styleId", "List1"), list( + element("w:pPr", list( + element("w:numPr", list( + element("w:numId", map("w:val", "42")) + )) + )) + )) + )); + + Styles styles = readStylesXmlElement(element); + + assertEquals(Optional.of("42"), styles.findNumberingStyleById("List1").get().getNumId()); + } + private XmlElement nameElement(String name) { return element("w:name", map("w:val", name)); } |
