aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-08-29 11:37:27 +0100
committerMichael Williamson <mike@zwobble.org>2016-08-29 11:37:27 +0100
commit955a29e828d40123ec64a479b1c4c5164db3c681 (patch)
treea83a65b91bd02c753789f5b57fd68bfbc446c5aa /src
parent28c8b89afea499191b13849140354b21819937f4 (diff)
Wire up comment conversion code
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java1
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java16
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/DocumentXmlReader.java9
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/DefaultStyles.java2
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/MammothTests.java13
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java1
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java4
-rwxr-xr-xsrc/test/resources/test-data/comments.docxbin0 -> 15526 bytes
9 files changed, 49 insertions, 8 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 6dd1134..0c514fb 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java
@@ -116,6 +116,7 @@ public class BodyXmlReader {
case "w:del":
case "w:footnoteRef":
case "w:endnoteRef":
+ case "w:annotationRef":
case "w:pPr":
case "w:rPr":
case "w:tblPr":
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 b53c9dd..0452c63 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java
@@ -1,5 +1,6 @@
package org.zwobble.mammoth.internal.docx;
+import org.zwobble.mammoth.internal.documents.Comment;
import org.zwobble.mammoth.internal.documents.Document;
import org.zwobble.mammoth.internal.documents.Notes;
import org.zwobble.mammoth.internal.results.InternalResult;
@@ -9,6 +10,7 @@ import org.zwobble.mammoth.internal.xml.XmlElement;
import java.io.IOException;
import java.nio.file.Path;
+import java.util.List;
import java.util.Optional;
import static org.zwobble.mammoth.internal.util.Lists.list;
@@ -28,13 +30,21 @@ public class DocumentReader {
Relationships relationships = readRelationships(zipFile, name);
return new BodyXmlReader(styles, numbering, relationships, contentTypes, zipFile, fileReader);
};
- return readNotes(zipFile, bodyReaders)
- .flatMap(notes -> {
- DocumentXmlReader reader = new DocumentXmlReader(bodyReaders.forName("document"), notes);
+ return InternalResult.flatMap(
+ readNotes(zipFile, bodyReaders),
+ readComments(zipFile, bodyReaders),
+ (notes, comments) -> {
+ DocumentXmlReader reader = new DocumentXmlReader(bodyReaders.forName("document"), notes, comments);
return reader.readElement(parseOfficeXml(zipFile, "word/document.xml"));
});
}
+ private static InternalResult<List<Comment>> readComments(DocxFile file, BodyReaders bodyReaders) {
+ return tryParseOfficeXml(file, "word/comments.xml")
+ .map(new CommentXmlReader(bodyReaders.forName("comments"))::readElement)
+ .orElse(InternalResult.success(list()));
+ }
+
private static InternalResult<Notes> readNotes(DocxFile file, BodyReaders bodyReaders) {
return InternalResult.map(
tryParseOfficeXml(file, "word/footnotes.xml")
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentXmlReader.java
index bd7247e..25855f3 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentXmlReader.java
@@ -1,26 +1,29 @@
package org.zwobble.mammoth.internal.docx;
+import org.zwobble.mammoth.internal.documents.Comment;
import org.zwobble.mammoth.internal.documents.Document;
import org.zwobble.mammoth.internal.documents.Notes;
import org.zwobble.mammoth.internal.results.InternalResult;
import org.zwobble.mammoth.internal.xml.XmlElement;
import org.zwobble.mammoth.internal.xml.XmlElementLike;
-import static org.zwobble.mammoth.internal.util.Lists.list;
+import java.util.List;
public class DocumentXmlReader {
private final BodyXmlReader bodyReader;
private final Notes notes;
+ private final List<Comment> comments;
- public DocumentXmlReader(BodyXmlReader bodyReader, Notes notes) {
+ public DocumentXmlReader(BodyXmlReader bodyReader, Notes notes, List<Comment> comments) {
this.bodyReader = bodyReader;
this.notes = notes;
+ this.comments = comments;
}
public InternalResult<Document> readElement(XmlElement element) {
XmlElementLike body = element.findChildOrEmpty("w:body");
return bodyReader.readElements(body.getChildren())
.toResult()
- .map(children -> new Document(children, notes, list()));
+ .map(children -> new Document(children, notes, comments));
}
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java b/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
index b2e892b..d18f278 100644
--- a/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
+++ b/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
@@ -23,6 +23,17 @@ public class InternalResult<T> {
lazyFlatMap(results, result -> result.warnings));
}
+ public static <T1, T2, R> InternalResult<R> flatMap(
+ InternalResult<T1> first,
+ InternalResult<T2> second,
+ BiFunction<T1, T2, InternalResult<R>> function)
+ {
+ InternalResult<R> intermediateResult = function.apply(first.value, second.value);
+ return new InternalResult<>(
+ intermediateResult.value,
+ lazyConcat(lazyConcat(first.warnings, second.warnings), intermediateResult.warnings));
+ }
+
public static <T1, T2, R> InternalResult<R> map(
InternalResult<T1> first,
InternalResult<T2> second,
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/DefaultStyles.java b/src/main/java/org/zwobble/mammoth/internal/styles/DefaultStyles.java
index 3aaf655..c9c5b5b 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/DefaultStyles.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/DefaultStyles.java
@@ -26,6 +26,8 @@ public class DefaultStyles {
"r[style-name='footnote reference'] =>",
"p[style-name='endnote text'] => p",
"r[style-name='endnote reference'] =>",
+ "p[style-name='annotation text'] => p",
+ "r[style-name='annotation reference'] =>",
// LibreOffice
"p[style-name='Footnote'] => p",
diff --git a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
index 455fa0c..fff4cb3 100644
--- a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
@@ -155,6 +155,19 @@ public class MammothTests {
}
@Test
+ public void whenStyleMappingIsDefinedForCommentReferencesThenCommentsAreIncluded() throws IOException {
+ assertThat(
+ convertToHtml("comments.docx", mammoth -> mammoth.idPrefix("doc-42-").addStyleMap("comment-reference => sup")),
+ isSuccess(
+ "<p>Ouch" +
+ "<sup><a href=\"#doc-42-comment-0\" id=\"doc-42-comment-ref-0\">[MW1]</a></sup>." +
+ "<sup><a href=\"#doc-42-comment-2\" id=\"doc-42-comment-ref-2\">[MW2]</a></sup></p>" +
+ "<dl><dt id=\"doc-42-comment-0\">Comment [MW1]</dt><dd><p>A tachyon walks into a bar. <a href=\"#doc-42-comment-ref-0\">↑</a></p></dd>" +
+ "<dt id=\"doc-42-comment-2\">Comment [MW2]</dt><dd><p>Fin. <a href=\"#doc-42-comment-ref-2\">↑</a></p></dd></dl>"
+ ));
+ }
+
+ @Test
public void relationshipsAreReadForEachFileContainingBodyXml() throws IOException {
assertThat(
convertToHtml("footnote-hyperlink.docx", mammoth -> mammoth.idPrefix("doc-42-")),
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 3a0da26..f59bf58 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -704,6 +704,7 @@ public class BodyXmlTests {
assertIsIgnored("w:del");
assertIsIgnored("w:footnoteRef");
assertIsIgnored("w:endnoteRef");
+ assertIsIgnored("w:annotationRef");
assertIsIgnored("w:pPr");
assertIsIgnored("w:rPr");
assertIsIgnored("w:tblPr");
diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java
index 9697c6d..19f1a95 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java
@@ -31,7 +31,7 @@ public class DocumentXmlTests {
element("w:t", list(
XmlNodes.text("Hello!")))))))))));
- DocumentXmlReader reader = new DocumentXmlReader(bodyReader(), Notes.EMPTY);
+ DocumentXmlReader reader = new DocumentXmlReader(bodyReader(), Notes.EMPTY, list());
assertThat(
reader.readElement(documentElement),
@@ -45,7 +45,7 @@ public class DocumentXmlTests {
public void notesOfDocumentAreIncludedInDocument() {
Note note = new Note(NoteType.FOOTNOTE, "4", list(paragraphWithText("Hello")));
Notes notes = new Notes(list(note));
- DocumentXmlReader reader = new DocumentXmlReader(bodyReader(), notes);
+ DocumentXmlReader reader = new DocumentXmlReader(bodyReader(), notes, list());
XmlElement documentElement = element("w:document", list(element("w:body")));
InternalResult<Document> document = reader.readElement(documentElement);
diff --git a/src/test/resources/test-data/comments.docx b/src/test/resources/test-data/comments.docx
new file mode 100755
index 0000000..32cdae1
--- /dev/null
+++ b/src/test/resources/test-data/comments.docx
Binary files differ