diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-13 18:18:33 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-13 18:18:33 +0000 |
| commit | a431972f98d98114dc9a5a65a3fbaf68967a8161 (patch) | |
| tree | 5a4e6f29a884ca1091b5a8f4d5c5a4f1558b2233 /src/main/java/org | |
| parent | cfff129846046a2549f8c78f6de458b9f4183f43 (diff) | |
Add result objects
Diffstat (limited to 'src/main/java/org')
6 files changed, 116 insertions, 33 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java index 05080cf..7282082 100644 --- a/src/main/java/org/zwobble/mammoth/Mammoth.java +++ b/src/main/java/org/zwobble/mammoth/Mammoth.java @@ -13,15 +13,16 @@ import java.util.zip.ZipFile; import static com.google.common.collect.Iterables.transform; public class Mammoth { - public static String convertToHtml(File file) { + public static Result<String> convertToHtml(File file) { try (ZipFile zipFile = new ZipFile(file)) { ZipEntry entry = zipFile.getEntry("word/document.xml"); XmlElement documentXml = OfficeXml.parseXml(zipFile.getInputStream(entry)); Styles styles = Styles.EMPTY; Numbering numbering = Numbering.EMPTY; - Document document = new DocumentXmlReader(new BodyXmlReader(styles, numbering)).readElement(documentXml); - return convertToHtml(document); + DocumentXmlReader reader = new DocumentXmlReader(new BodyXmlReader(styles, numbering)); + return reader.readElement(documentXml) + .map(Mammoth::convertToHtml); } catch (IOException e) { throw new UnsupportedOperationException("Should return a result of failure"); } diff --git a/src/main/java/org/zwobble/mammoth/Result.java b/src/main/java/org/zwobble/mammoth/Result.java new file mode 100644 index 0000000..0665364 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/Result.java @@ -0,0 +1,34 @@ +package org.zwobble.mammoth; + +import com.google.common.collect.ImmutableList; + +import java.util.List; +import java.util.function.Function; + +public class Result<T> { + public static <T> Result<List<T>> concat(Iterable<Result<T>> results) { + ImmutableList.Builder<T> elements = ImmutableList.builder(); + for (Result<T> result : results) { + elements.add(result.value); + } + return new Result<>(elements.build()); + } + + public static <T> Result<T> success(T value) { + return new Result<>(value); + } + + private final T value; + + public Result(T value) { + this.value = value; + } + + public T getValue() { + return value; + } + + public <R> Result<R> map(Function<T, R> function) { + return new Result<>(function.apply(value)); + } +} diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java index 334f925..26958dd 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java @@ -1,17 +1,17 @@ package org.zwobble.mammoth.docx; -import com.google.common.collect.ImmutableList; import org.zwobble.mammoth.documents.*; import org.zwobble.mammoth.util.MammothOptionals; import org.zwobble.mammoth.xml.XmlElement; import org.zwobble.mammoth.xml.XmlElementLike; import org.zwobble.mammoth.xml.XmlNode; -import java.util.List; import java.util.Optional; -import static com.google.common.collect.Iterables.*; -import static org.zwobble.mammoth.util.MammothLists.list; +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.transform; +import static org.zwobble.mammoth.docx.ReadResult.EMPTY_SUCCESS; +import static org.zwobble.mammoth.docx.ReadResult.success; public class BodyXmlReader { private final Styles styles; @@ -22,38 +22,37 @@ public class BodyXmlReader { this.numbering = numbering; } - public List<DocumentElement> readElement(XmlElement element) { + public ReadResult readElement(XmlElement element) { switch (element.getName()) { case "w:t": - return list(new Text(element.innerText())); + return success(new Text(element.innerText())); case "w:r": - return list(new Run(readElements(element.children()))); + return readElements(element.children()).map(Run::new); case "w:p": - return list(readParagraph(element)); + return readParagraph(element); case "w:pPr": - return list(); + return EMPTY_SUCCESS; default: // TODO: emit warning - return list(); + return EMPTY_SUCCESS; } } - public List<DocumentElement> readElements(Iterable<XmlNode> nodes) { - return ImmutableList.copyOf( - concat( - transform( - filter(nodes, XmlElement.class), - this::readElement))); + public ReadResult readElements(Iterable<XmlNode> nodes) { + return ReadResult.concat( + transform( + filter(nodes, XmlElement.class), + this::readElement)); } - private Paragraph readParagraph(XmlElement element) { + private ReadResult readParagraph(XmlElement element) { XmlElementLike properties = element.findChildOrEmpty("w:pPr"); - return new Paragraph( - readParagraphStyle(properties), - readNumbering(properties), - readElements(element.children())); + Optional<Style> paragraphStyle = readParagraphStyle(properties); + Optional<NumberingLevel> numbering = readNumbering(properties); + return readElements(element.children()) + .map(children -> new Paragraph(paragraphStyle, numbering, children)); } private Optional<Style> readParagraphStyle(XmlElementLike properties) { diff --git a/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java index 0b51774..98570f2 100644 --- a/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java @@ -1,5 +1,6 @@ package org.zwobble.mammoth.docx; +import org.zwobble.mammoth.Result; import org.zwobble.mammoth.documents.Document; import org.zwobble.mammoth.xml.XmlElement; @@ -10,8 +11,10 @@ public class DocumentXmlReader { this.bodyReader = bodyReader; } - public Document readElement(XmlElement element) { + public Result<Document> readElement(XmlElement element) { XmlElement body = element.findChild("w:body"); - return new Document(bodyReader.readElements(body.children())); + return bodyReader.readElements(body.children()) + .toResult() + .map(Document::new); } } diff --git a/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java index 06d17ca..7cd0419 100644 --- a/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java @@ -1,6 +1,6 @@ package org.zwobble.mammoth.docx; -import com.google.common.collect.ImmutableList; +import org.zwobble.mammoth.Result; import org.zwobble.mammoth.documents.Note; import org.zwobble.mammoth.xml.XmlElement; @@ -18,9 +18,9 @@ public class NotesXmlReader { this.noteType = noteType; } - public List<Note> readElement(XmlElement element) { + public Result<List<Note>> readElement(XmlElement element) { Iterable<XmlElement> elements = filter(element.findChildren("w:" + noteType), this::isNoteElement); - return ImmutableList.copyOf(transform(elements, this::readNoteElement)); + return Result.concat(transform(elements, this::readNoteElement)); } private boolean isNoteElement(XmlElement element) { @@ -33,9 +33,11 @@ public class NotesXmlReader { return type.equals("continuationSeparator") || type.equals("separator"); } - private Note readNoteElement(XmlElement element) { - return new Note( - element.getAttribute("w:id"), - bodyReader.readElements(element.children())); + private Result<Note> readNoteElement(XmlElement element) { + return bodyReader.readElements(element.children()) + .toResult() + .map(children -> new Note( + element.getAttribute("w:id"), + children)); } } diff --git a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java new file mode 100644 index 0000000..f3eb7ce --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java @@ -0,0 +1,44 @@ +package org.zwobble.mammoth.docx; + +import com.google.common.collect.ImmutableList; +import org.zwobble.mammoth.Result; +import org.zwobble.mammoth.documents.DocumentElement; + +import java.util.List; +import java.util.function.Function; + +import static org.zwobble.mammoth.util.MammothLists.list; + +public class ReadResult { + public static final ReadResult EMPTY_SUCCESS = success(list()); + + public static ReadResult concat(Iterable<ReadResult> results) { + ImmutableList.Builder<DocumentElement> elements = ImmutableList.builder(); + for (ReadResult result : results) { + elements.addAll(result.elements); + } + return new ReadResult(elements.build()); + } + + public static ReadResult success(DocumentElement element) { + return success(list(element)); + } + + public static ReadResult success(List<DocumentElement> elements) { + return new ReadResult(elements); + } + + private final List<DocumentElement> elements; + + public ReadResult(List<DocumentElement> elements) { + this.elements = elements; + } + + public ReadResult map(Function<List<DocumentElement>, DocumentElement> function) { + return new ReadResult(list(function.apply(elements))); + } + + public Result<List<DocumentElement>> toResult() { + return new Result<>(elements); + } +} |
