aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java42
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/StyleMap.java14
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/StyleMapBuilder.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/StyleMapping.java21
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java21
5 files changed, 94 insertions, 12 deletions
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<String> styleId;
+ private final Optional<String> styleName;
+
+ public ParagraphMatcher(Optional<String> styleId, Optional<String> 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<String> required, Optional<String> 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<String, HtmlPath> paragraphStyles;
+ private final List<StyleMapping> paragraphStyles;
- public StyleMap(HtmlPath underline, HtmlPath strikethrough, Map<String, HtmlPath> paragraphStyles) {
+ public StyleMap(HtmlPath underline, HtmlPath strikethrough, List<StyleMapping> 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<String, HtmlPath> paragraphStyles = ImmutableMap.builder();
+ private final ImmutableList.Builder<StyleMapping> 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;
+ }
+}
diff --git a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
index 771431f..338776e 100644
--- a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
@@ -6,6 +6,7 @@ import org.zwobble.mammoth.documents.*;
import org.zwobble.mammoth.html.Html;
import org.zwobble.mammoth.html.HtmlNode;
import org.zwobble.mammoth.styles.HtmlPath;
+import org.zwobble.mammoth.styles.ParagraphMatcher;
import org.zwobble.mammoth.styles.StyleMap;
import java.io.ByteArrayInputStream;
@@ -56,7 +57,25 @@ public class DocumentConverterTests {
assertThat(
convertToHtml(
make(a(PARAGRAPH, with(STYLE, Optional.of(new Style("TipsParagraph", Optional.empty()))))),
- StyleMap.builder().mapParagraph("TipsParagraph", HtmlPath.element("p", map("class", "tip"))).build()),
+ StyleMap.builder()
+ .mapParagraph(
+ ParagraphMatcher.styleId("TipsParagraph"),
+ HtmlPath.element("p", map("class", "tip")))
+ .build()),
+
+ deepEquals(list(Html.element("p", map("class", "tip")))));
+ }
+
+ @Test
+ public void styleMappingsUsingStyleNamesCanBeUsedToMapParagraphs() {
+ assertThat(
+ convertToHtml(
+ make(a(PARAGRAPH, with(STYLE, Optional.of(new Style("TipsParagraph", Optional.of("Tips Paragraph")))))),
+ StyleMap.builder()
+ .mapParagraph(
+ ParagraphMatcher.styleName("Tips Paragraph"),
+ HtmlPath.element("p", map("class", "tip")))
+ .build()),
deepEquals(list(Html.element("p", map("class", "tip")))));
}