From a431972f98d98114dc9a5a65a3fbaf68967a8161 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 13 Feb 2016 18:18:33 +0000 Subject: Add result objects --- src/main/java/org/zwobble/mammoth/Mammoth.java | 7 ++-- src/main/java/org/zwobble/mammoth/Result.java | 34 +++++++++++++++++ .../org/zwobble/mammoth/docx/BodyXmlReader.java | 41 ++++++++++---------- .../zwobble/mammoth/docx/DocumentXmlReader.java | 7 +++- .../org/zwobble/mammoth/docx/NotesXmlReader.java | 16 ++++---- .../java/org/zwobble/mammoth/docx/ReadResult.java | 44 ++++++++++++++++++++++ .../org/zwobble/mammoth/tests/MammothTests.java | 16 +++++--- .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 35 +++++++++-------- .../mammoth/tests/docx/DocumentXmlTests.java | 8 ++-- .../mammoth/tests/docx/NotesXmlReaderTests.java | 10 +++-- 10 files changed, 157 insertions(+), 61 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/Result.java create mode 100644 src/main/java/org/zwobble/mammoth/docx/ReadResult.java (limited to 'src') 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 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 { + public static Result> concat(Iterable> results) { + ImmutableList.Builder elements = ImmutableList.builder(); + for (Result result : results) { + elements.add(result.value); + } + return new Result<>(elements.build()); + } + + public static Result success(T value) { + return new Result<>(value); + } + + private final T value; + + public Result(T value) { + this.value = value; + } + + public T getValue() { + return value; + } + + public Result map(Function 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 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 readElements(Iterable nodes) { - return ImmutableList.copyOf( - concat( - transform( - filter(nodes, XmlElement.class), - this::readElement))); + public ReadResult readElements(Iterable 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