aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java
new file mode 100644
index 0000000..2e31aa2
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/NotesXmlReader.java
@@ -0,0 +1,55 @@
+package org.zwobble.mammoth.internal.docx;
+
+import org.zwobble.mammoth.internal.documents.NoteType;
+import org.zwobble.mammoth.results.Result;
+import org.zwobble.mammoth.internal.documents.Note;
+import org.zwobble.mammoth.internal.xml.XmlElement;
+
+import java.util.List;
+
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.transform;
+
+public class NotesXmlReader {
+ public static NotesXmlReader footnote(BodyXmlReader bodyReader) {
+ return new NotesXmlReader(bodyReader, "footnote", NoteType.FOOTNOTE);
+ }
+
+ public static NotesXmlReader endnote(BodyXmlReader bodyReader) {
+ return new NotesXmlReader(bodyReader, "endnote", NoteType.ENDNOTE);
+ }
+
+ private final BodyXmlReader bodyReader;
+ private final String tagName;
+ private final NoteType noteType;
+
+ private NotesXmlReader(BodyXmlReader bodyReader, String tagName, NoteType noteType) {
+ this.bodyReader = bodyReader;
+ this.tagName = tagName;
+ this.noteType = noteType;
+ }
+
+ public Result<List<Note>> readElement(XmlElement element) {
+ Iterable<XmlElement> elements = filter(element.findChildren("w:" + tagName), this::isNoteElement);
+ return Result.concat(transform(elements, this::readNoteElement));
+ }
+
+ private boolean isNoteElement(XmlElement element) {
+ return element.getAttributeOrNone("w:type")
+ .map(type -> !isSeparatorType(type))
+ .orElse(true);
+ }
+
+ private boolean isSeparatorType(String type) {
+ return type.equals("continuationSeparator") || type.equals("separator");
+ }
+
+ private Result<Note> readNoteElement(XmlElement element) {
+ return bodyReader.readElements(element.children())
+ .toResult()
+ .map(children -> new Note(
+ noteType,
+ element.getAttribute("w:id"),
+ children));
+ }
+}