aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2019-03-17 17:06:25 +0000
committerMichael Williamson <mike@zwobble.org>2019-03-17 17:06:25 +0000
commit15daf7d09b8f3da093eea154f49579cdf2002fa7 (patch)
treece72a21a399fde25f371d4a39f19da75a8a478d5 /src
parentbe4c4ff9b9efda68be93309ab7bad2c56e6880e9 (diff)
Read numbering styles
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/NumberingStyle.java15
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/Styles.java18
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java40
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java5
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java37
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));
}