diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-01-23 20:37:05 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-01-23 20:37:05 +0000 |
| commit | 2e819654db985bf8a7e7ed76e0a43dc2f46eec8d (patch) | |
| tree | 94aced195e17040ef9e616c14f52c7ce89511ddd /src | |
| parent | 933f21dd728976f1e64cf13b5de0558efaac2911 (diff) | |
Handle base-relative target URIs
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java | 4 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/internal/docx/Uris.java | 14 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/mammoth/tests/MammothTests.java | 9 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/mammoth/tests/docx/Uris.java | 25 | ||||
| -rw-r--r-- | src/test/resources/test-data/tiny-picture-target-base-relative.docx | bin | 0 -> 10881 bytes |
5 files changed, 49 insertions, 3 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java index ec82930..4cbdda7 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java @@ -18,12 +18,12 @@ import java.util.function.Function; import static org.zwobble.mammoth.internal.docx.ReadResult.EMPTY_SUCCESS; import static org.zwobble.mammoth.internal.docx.ReadResult.success; +import static org.zwobble.mammoth.internal.docx.Uris.uriToZipEntryName; import static org.zwobble.mammoth.internal.util.Iterables.lazyFilter; import static org.zwobble.mammoth.internal.util.Lists.list; import static org.zwobble.mammoth.internal.util.Maps.entry; import static org.zwobble.mammoth.internal.util.Maps.lookup; import static org.zwobble.mammoth.internal.util.Sets.set; -import static org.zwobble.mammoth.internal.util.Strings.trimLeft; public class BodyXmlReader { private static final Set<String> IMAGE_TYPES_SUPPORTED_BY_BROWSERS = set( @@ -456,7 +456,7 @@ public class BodyXmlReader { private String relationshipIdToDocxPath(String relationshipId) { Relationship relationship = relationships.findRelationshipById(relationshipId); - return "word/" + trimLeft(relationship.getTarget(), '/'); + return uriToZipEntryName("word", relationship.getTarget()); } private Optional<String> readVal(XmlElementLike element, String name) { diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java b/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java new file mode 100644 index 0000000..51dab9c --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java @@ -0,0 +1,14 @@ +package org.zwobble.mammoth.internal.docx; + +public class Uris { + private Uris() { + } + + public static String uriToZipEntryName(String base, String uri) { + if (uri.startsWith("/")) { + return uri.substring(1); + } else { + return base + "/" + uri; + } + } +} diff --git a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java index d7a2b66..ac81c76 100644 --- a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java @@ -69,13 +69,20 @@ public class MammothTests { } @Test - public void inlineImagesAreIncludedInOutput() throws IOException { + public void inlineImagesReferencedByPathRelativeToPartAreIncludedInOutput() throws IOException { assertThat( convertToHtml("tiny-picture.docx"), isSuccess("<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOvgAADr4B6kKxwAAAABNJREFUKFNj/M+ADzDhlWUYqdIAQSwBE8U+X40AAAAASUVORK5CYII=\" /></p>")); } @Test + public void inlineImagesReferencedByPathRelativeToBaseAreIncludedInOutput() throws IOException { + assertThat( + convertToHtml("tiny-picture-target-base-relative.docx"), + isSuccess("<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOvgAADr4B6kKxwAAAABNJREFUKFNj/M+ADzDhlWUYqdIAQSwBE8U+X40AAAAASUVORK5CYII=\" /></p>")); + } + + @Test public void imagesStoredOutsideOfDocumentAreIncludedInOutput() throws IOException { Path tempDirectory = Files.createTempDirectory("mammoth-"); try { diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/Uris.java b/src/test/java/org/zwobble/mammoth/tests/docx/Uris.java new file mode 100644 index 0000000..36d4bcb --- /dev/null +++ b/src/test/java/org/zwobble/mammoth/tests/docx/Uris.java @@ -0,0 +1,25 @@ +package org.zwobble.mammoth.tests.docx; + +import org.junit.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.zwobble.mammoth.internal.docx.Uris.uriToZipEntryName; + +public class Uris { + @Test + public void whenPathDoesNotHaveLeadingSlashThenPathIsResolvedRelativeToBase() { + assertThat( + uriToZipEntryName("one/two", "three/four"), + equalTo("one/two/three/four") + ); + } + + @Test + public void whenPathHasLeadingSlashThenBaseIsIgnored() { + assertThat( + uriToZipEntryName("one/two", "/three/four"), + equalTo("three/four") + ); + } +} diff --git a/src/test/resources/test-data/tiny-picture-target-base-relative.docx b/src/test/resources/test-data/tiny-picture-target-base-relative.docx Binary files differnew file mode 100644 index 0000000..1d61988 --- /dev/null +++ b/src/test/resources/test-data/tiny-picture-target-base-relative.docx |
