diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-08-29 11:37:27 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-08-29 11:37:27 +0100 |
| commit | 955a29e828d40123ec64a479b1c4c5164db3c681 (patch) | |
| tree | a83a65b91bd02c753789f5b57fd68bfbc446c5aa /src | |
| parent | 28c8b89afea499191b13849140354b21819937f4 (diff) | |
Wire up comment conversion code
Diffstat (limited to 'src')
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 Binary files differnew file mode 100755 index 0000000..32cdae1 --- /dev/null +++ b/src/test/resources/test-data/comments.docx |
