aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2018-01-27 18:17:22 +0000
committerMichael Williamson <mike@zwobble.org>2018-01-27 18:17:22 +0000
commit29a3d3491a2796c5a1e772c2f15deb2a9a2e9376 (patch)
tree0048e1d8e749ea518eef52c03172280bdf4450b4 /src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
parent4e9396324c6d720484e639e449382280aa7e14fe (diff)
Find comments part using document relationships
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java62
1 files changed, 49 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
index 1e3b3e3..6176aec 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
@@ -15,6 +15,7 @@ import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
+import java.util.function.Function;
import static org.zwobble.mammoth.internal.util.Lists.*;
import static org.zwobble.mammoth.internal.util.Strings.trimLeft;
@@ -59,9 +60,11 @@ public class DocumentReader {
public static class PartPaths {
private final String mainDocument;
+ private final String comments;
- public PartPaths(String mainDocument) {
+ public PartPaths(String mainDocument, String comments) {
this.mainDocument = mainDocument;
+ this.comments = comments;
}
public String getMainDocument() {
@@ -69,7 +72,7 @@ public class DocumentReader {
}
public String getComments() {
- return "word/comments.xml";
+ return comments;
}
public String getEndnotes() {
@@ -92,7 +95,21 @@ public class DocumentReader {
public static PartPaths findPartPaths(Archive archive) {
Relationships packageRelationships = readPackageRelationships(archive);
String documentFilename = findDocumentFilename(archive, packageRelationships);
- return new PartPaths(documentFilename);
+
+ Relationships documentRelationships = readRelationships(
+ archive,
+ findRelationshipsPathFor(documentFilename)
+ );
+
+ Function<String, String> find = name -> findPartPath(
+ archive,
+ documentRelationships,
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/" + name,
+ ZipPaths.splitPath(documentFilename).getDirname(),
+ "word/" + name + ".xml"
+ );
+
+ return new PartPaths(documentFilename, find.apply("comments"));
}
private static Relationships readPackageRelationships(Archive archive) {
@@ -101,18 +118,37 @@ public class DocumentReader {
private static String findDocumentFilename(Archive archive, Relationships packageRelationships) {
String officeDocumentType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
- List<String> targets = eagerConcat(
- eagerMap(
- packageRelationships.findTargetsByType(officeDocumentType),
- target -> trimLeft(target, '/')
- ),
- list("word/document.xml")
+ String mainDocumentPath = findPartPath(
+ archive,
+ packageRelationships,
+ officeDocumentType,
+ "",
+ "word/document.xml"
);
- List<String> validTargets = eagerFilter(targets, archive::exists);
- return tryGetFirst(validTargets)
- .orElseThrow(() -> new PassThroughException(
+
+ if (archive.exists(mainDocumentPath)) {
+ return mainDocumentPath;
+ } else {
+ throw new PassThroughException(
new IOException("Could not find main document part. Are you sure this is a valid .docx file?")
- ));
+ );
+ }
+ }
+
+ private static String findPartPath(
+ Archive archive,
+ Relationships relationships,
+ String relationshipType,
+ String basePath,
+ String fallbackPath
+ ) {
+
+ List<String> targets = eagerMap(
+ relationships.findTargetsByType(relationshipType),
+ target -> trimLeft(ZipPaths.joinPath(basePath, target), '/')
+ );
+ List<String> validTargets = eagerFilter(targets, archive::exists);
+ return tryGetFirst(validTargets).orElse(fallbackPath);
}
private static InternalResult<List<Comment>> readComments(PartWithBodyReader partReader, PartPaths partPaths) {