From a506a6d3679c282cfd3a2f0257f5859d420feb22 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 20 Feb 2016 15:02:54 +0000 Subject: Allow paragraph matchers by style name --- .../zwobble/mammoth/styles/ParagraphMatcher.java | 42 ++++++++++++++++++++++ .../java/org/zwobble/mammoth/styles/StyleMap.java | 14 ++++---- .../zwobble/mammoth/styles/StyleMapBuilder.java | 8 ++--- .../org/zwobble/mammoth/styles/StyleMapping.java | 21 +++++++++++ 4 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java create mode 100644 src/main/java/org/zwobble/mammoth/styles/StyleMapping.java (limited to 'src/main') diff --git a/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java b/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java new file mode 100644 index 0000000..715ac94 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java @@ -0,0 +1,42 @@ +package org.zwobble.mammoth.styles; + +import org.zwobble.mammoth.documents.Paragraph; +import org.zwobble.mammoth.documents.Style; + +import java.util.Optional; + +public class ParagraphMatcher { + public static ParagraphMatcher styleId(String styleId) { + return new ParagraphMatcher(Optional.of(styleId), Optional.empty()); + } + + public static ParagraphMatcher styleName(String styleName) { + return new ParagraphMatcher(Optional.empty(), Optional.of(styleName)); + } + + private final Optional styleId; + private final Optional styleName; + + public ParagraphMatcher(Optional styleId, Optional styleName) { + this.styleId = styleId; + this.styleName = styleName; + } + + public boolean matches(Paragraph paragraph) { + return matchesStyleId(paragraph) && matchesStyleName(paragraph); + } + + private boolean matchesStyleId(Paragraph paragraph) { + return matches(styleId, paragraph.getStyle().map(Style::getStyleId)); + } + + private boolean matchesStyleName(Paragraph paragraph) { + return matches(styleName, paragraph.getStyle().flatMap(Style::getName)); + } + + private boolean matches(Optional required, Optional actual) { + return required + .map(requiredValue -> actual.map(requiredValue::equals).orElse(false)) + .orElse(true); + } +} diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMap.java b/src/main/java/org/zwobble/mammoth/styles/StyleMap.java index 237a20e..e498246 100644 --- a/src/main/java/org/zwobble/mammoth/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/styles/StyleMap.java @@ -1,9 +1,9 @@ package org.zwobble.mammoth.styles; +import com.google.common.collect.Iterables; import org.zwobble.mammoth.documents.Paragraph; -import java.util.Map; -import java.util.Optional; +import java.util.List; public class StyleMap { public static StyleMapBuilder builder() { @@ -14,9 +14,9 @@ public class StyleMap { private final HtmlPath underline; private final HtmlPath strikethrough; - private final Map paragraphStyles; + private final List paragraphStyles; - public StyleMap(HtmlPath underline, HtmlPath strikethrough, Map paragraphStyles) { + public StyleMap(HtmlPath underline, HtmlPath strikethrough, List paragraphStyles) { this.underline = underline; this.strikethrough = strikethrough; this.paragraphStyles = paragraphStyles; @@ -31,8 +31,8 @@ public class StyleMap { } public HtmlPath getParagraphStyleMapping(Paragraph paragraph) { - return paragraph.getStyle() - .flatMap(style -> Optional.ofNullable(paragraphStyles.get(style.getStyleId()))) - .orElse(HtmlPath.element("p")); + return Iterables.tryFind(paragraphStyles, styleMapping -> styleMapping.matches(paragraph)) + .transform(StyleMapping::getHtmlPath) + .or(HtmlPath.element("p")); } } diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMapBuilder.java b/src/main/java/org/zwobble/mammoth/styles/StyleMapBuilder.java index 98ae351..b33e0db 100644 --- a/src/main/java/org/zwobble/mammoth/styles/StyleMapBuilder.java +++ b/src/main/java/org/zwobble/mammoth/styles/StyleMapBuilder.java @@ -1,11 +1,11 @@ package org.zwobble.mammoth.styles; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableList; public class StyleMapBuilder { private HtmlPath underline; private HtmlPath strikethrough; - private final ImmutableMap.Builder paragraphStyles = ImmutableMap.builder(); + private final ImmutableList.Builder paragraphStyles = ImmutableList.builder(); public StyleMapBuilder() { this.underline = HtmlPath.EMPTY; @@ -22,8 +22,8 @@ public class StyleMapBuilder { return this; } - public StyleMapBuilder mapParagraph(String styleId, HtmlPath path) { - paragraphStyles.put(styleId, path); + public StyleMapBuilder mapParagraph(ParagraphMatcher paragraphMatcher, HtmlPath path) { + paragraphStyles.add(new StyleMapping(paragraphMatcher, path)); return this; } diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMapping.java b/src/main/java/org/zwobble/mammoth/styles/StyleMapping.java new file mode 100644 index 0000000..59abb84 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/styles/StyleMapping.java @@ -0,0 +1,21 @@ +package org.zwobble.mammoth.styles; + +import org.zwobble.mammoth.documents.Paragraph; + +public class StyleMapping { + private final ParagraphMatcher matcher; + private final HtmlPath htmlPath; + + public StyleMapping(ParagraphMatcher matcher, HtmlPath htmlPath) { + this.matcher = matcher; + this.htmlPath = htmlPath; + } + + public boolean matches(Paragraph paragraph) { + return matcher.matches(paragraph); + } + + public HtmlPath getHtmlPath() { + return htmlPath; + } +} -- cgit v1.2.3