aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java36
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java13
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java8
4 files changed, 48 insertions, 17 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java b/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
index edec271..4088df5 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
@@ -1,10 +1,6 @@
package org.zwobble.mammoth.internal.docx;
-import com.google.common.collect.ImmutableBiMap;
-import org.zwobble.mammoth.internal.xml.XmlElement;
-import org.zwobble.mammoth.internal.xml.XmlNode;
-import org.zwobble.mammoth.internal.xml.XmlNodeVisitor;
-import org.zwobble.mammoth.internal.xml.XmlTextNode;
+import org.zwobble.mammoth.internal.xml.*;
import org.zwobble.mammoth.internal.xml.parsing.XmlParser;
import java.io.InputStream;
@@ -14,7 +10,7 @@ import static org.zwobble.mammoth.internal.util.MammothLists.eagerFlatMap;
import static org.zwobble.mammoth.internal.util.MammothLists.list;
public class OfficeXml {
- private static ImmutableBiMap<String, String> XML_NAMESPACES = ImmutableBiMap.<String, String>builder()
+ private static NamespacePrefixes XML_NAMESPACES = NamespacePrefixes.builder()
.put("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")
.put("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing")
.put("a", "http://schemas.openxmlformats.org/drawingml/2006/main")
diff --git a/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java
new file mode 100644
index 0000000..82872bd
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java
@@ -0,0 +1,36 @@
+package org.zwobble.mammoth.internal.xml;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.zwobble.mammoth.internal.util.MammothMaps.lookup;
+
+public class NamespacePrefixes {
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+ private final Map<String, String> uriToPrefix = new HashMap<>();
+
+ public Builder put(String prefix, String uri) {
+ uriToPrefix.put(uri, prefix);
+ return this;
+ }
+
+ public NamespacePrefixes build() {
+ return new NamespacePrefixes(uriToPrefix);
+ }
+ }
+
+ private final Map<String, String> uriToPrefix;
+
+ public NamespacePrefixes(Map<String, String> uriToPrefix) {
+ this.uriToPrefix = uriToPrefix;
+ }
+
+ public Optional<String> prefixForUri(String uri) {
+ return lookup(uriToPrefix, uri);
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java b/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java
index fdd3dff..08a2c4e 100644
--- a/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java
@@ -1,6 +1,6 @@
package org.zwobble.mammoth.internal.xml.parsing;
-import com.google.common.collect.BiMap;
+import org.zwobble.mammoth.internal.xml.NamespacePrefixes;
import org.zwobble.mammoth.internal.xml.XmlElement;
import org.zwobble.mammoth.internal.xml.XmlTextNode;
@@ -10,13 +10,12 @@ import java.util.Deque;
import java.util.Map;
import static org.zwobble.mammoth.internal.util.MammothMaps.eagerMapKeys;
-import static org.zwobble.mammoth.internal.util.MammothMaps.lookup;
import static org.zwobble.mammoth.internal.util.MammothStrings.isNullOrEmpty;
public class XmlParser {
- private final BiMap<String, String> namespaces;
+ private final NamespacePrefixes namespaces;
- public XmlParser(BiMap<String, String> namespaces) {
+ public XmlParser(NamespacePrefixes namespaces) {
this.namespaces = namespaces;
}
@@ -53,10 +52,10 @@ public class XmlParser {
private String readName(ElementName name) {
if (isNullOrEmpty(name.getUri())) {
return name.getLocalName();
- } else if (namespaces.containsValue(name.getUri())) {
- return lookup(namespaces.inverse(), name.getUri()).get() + ":" + name.getLocalName();
} else {
- return "{" + name.getUri() + "}" + name.getLocalName();
+ return namespaces.prefixForUri(name.getUri())
+ .map(prefix -> prefix + ":" + name.getLocalName())
+ .orElseGet(() -> "{" + name.getUri() + "}" + name.getLocalName());
}
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java b/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java
index 7e8cc09..8b26de4 100644
--- a/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java
@@ -1,10 +1,10 @@
package org.zwobble.mammoth.tests.xml;
-import com.google.common.collect.ImmutableBiMap;
import org.hamcrest.Matcher;
import org.hamcrest.collection.IsEmptyIterable;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.junit.Test;
+import org.zwobble.mammoth.internal.xml.NamespacePrefixes;
import org.zwobble.mammoth.internal.xml.XmlElement;
import org.zwobble.mammoth.internal.xml.XmlNode;
import org.zwobble.mammoth.internal.xml.XmlTextNode;
@@ -20,7 +20,7 @@ import static org.zwobble.mammoth.internal.util.MammothLists.list;
import static org.zwobble.mammoth.internal.util.MammothMaps.map;
public class XmlParserTests {
- private final XmlParser parser = new XmlParser(ImmutableBiMap.of());
+ private final XmlParser parser = new XmlParser(new NamespacePrefixes(map()));
@Test
public void canParseSelfClosingElement() {
@@ -80,7 +80,7 @@ public class XmlParserTests {
@Test
public void mappedNamespaceUrisInElementNamesArePrefixedToLocalNameWithColon() {
- XmlParser parser = new XmlParser(ImmutableBiMap.of("x", "word"));
+ XmlParser parser = new XmlParser(NamespacePrefixes.builder().put("x", "word").build());
assertThat(
parser.parseString("<w:body xmlns:w='word'/>"),
isElement("x:body"));
@@ -88,7 +88,7 @@ public class XmlParserTests {
@Test
public void mappedNamespaceUrisInAttributeNamesArePrefixedToLocalNameWithColon() {
- XmlParser parser = new XmlParser(ImmutableBiMap.of("x", "word"));
+ XmlParser parser = new XmlParser(NamespacePrefixes.builder().put("x", "word").build());
assertThat(
parser.parseString("<body xmlns:w='word' w:name='bob'/>"),
isElement("body", map("x:name", "bob")));