aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java7
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/util/Maps.java16
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java40
3 files changed, 59 insertions, 4 deletions
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 656b0dd..31d55b7 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/StylesXml.java
@@ -9,8 +9,7 @@ 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;
+import static org.zwobble.mammoth.internal.util.Maps.*;
public class StylesXml {
public static Styles readStylesXmlElement(XmlElement element) {
@@ -24,7 +23,7 @@ public class StylesXml {
}
private static Map<String, Style> readStyles(XmlElementList styleElements, String styleType) {
- return toMap(
+ return toMapPreferFirst(
styleElementsOfType(styleElements, styleType),
StylesXml::readStyle
);
@@ -37,7 +36,7 @@ public class StylesXml {
}
private static Map<String, NumberingStyle> readNumberingStyles(XmlElementList styleElements) {
- return toMap(
+ return toMapPreferFirst(
styleElementsOfType(styleElements, "numbering"),
StylesXml::readNumberingStyle
);
diff --git a/src/main/java/org/zwobble/mammoth/internal/util/Maps.java b/src/main/java/org/zwobble/mammoth/internal/util/Maps.java
index e053c90..72d9fd5 100644
--- a/src/main/java/org/zwobble/mammoth/internal/util/Maps.java
+++ b/src/main/java/org/zwobble/mammoth/internal/util/Maps.java
@@ -63,6 +63,22 @@ public class Maps {
return map;
}
+ /**
+ * Convert an iterable to map using the given mapping function. If the
+ * mapping function generates entries with the same key, only the first
+ * entry will be used, and subsequent entries will be ignored.
+ */
+ public static <T, K, V> Map<K, V> toMapPreferFirst(Iterable<T> iterable, Function<T, Map.Entry<K, V>> function) {
+ Map<K, V> map = new HashMap<>();
+ for (T element : iterable) {
+ Map.Entry<K, V> entry = function.apply(element);
+ if (!map.containsKey(entry.getKey())) {
+ map.put(entry.getKey(), entry.getValue());
+ }
+ }
+ return map;
+ }
+
public static <T, K> Map<K, List<T>> toMultiMapWithKey(Iterable<T> iterable, Function<T, K> function) {
return toMultiMap(iterable, element -> entry(function.apply(element), 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 89a7d1a..c6ccc82 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/StylesXmlTests.java
@@ -118,6 +118,46 @@ public class StylesXmlTests {
assertEquals(Optional.of("42"), styles.findNumberingStyleById("List1").get().getNumId());
}
+ @Test
+ public void whenMultipleNonNumberingStyleElementsHaveSameStyleIdThenOnlyFirstElementIsUsed() {
+ XmlElement element = element("w:styles", list(
+ element("w:style", map("w:type", "table", "w:styleId", "TableNormal"), list(
+ nameElement("Normal Table")
+ )),
+ element("w:style", map("w:type", "table", "w:styleId", "TableNormal"), list(
+ nameElement("Table Normal")
+ ))
+ ));
+
+ Styles styles = readStylesXmlElement(element);
+
+ assertEquals(Optional.of("Normal Table"), styles.findTableStyleById("TableNormal").get().getName());
+ }
+
+ @Test
+ public void whenMultipleNumberingStyleElementsHaveSameStyleIdThenOnlyFirstElementIsUsed() {
+ 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"))
+ ))
+ ))
+ )),
+ 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", "43"))
+ ))
+ ))
+ ))
+ ));
+
+ 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));
}