From 9f91b3bb403c0cda34fa91bdbf8cb5ea22cb7525 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 20 Feb 2016 15:55:36 +0000 Subject: Add paragraph matchers for numbering --- .../zwobble/mammoth/documents/NumberingLevel.java | 4 +++ .../zwobble/mammoth/styles/ParagraphMatcher.java | 28 ++++++++++++---- .../tests/documents/DocumentElementMakers.java | 3 +- .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 1 + .../tests/styles/ParagraphMatcherTests.java | 38 ++++++++++++++++++++++ 5 files changed, 67 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/main/java/org/zwobble/mammoth/documents/NumberingLevel.java b/src/main/java/org/zwobble/mammoth/documents/NumberingLevel.java index cdbb0c4..9baa3fc 100644 --- a/src/main/java/org/zwobble/mammoth/documents/NumberingLevel.java +++ b/src/main/java/org/zwobble/mammoth/documents/NumberingLevel.java @@ -5,6 +5,10 @@ public class NumberingLevel { return new NumberingLevel(levelIndex, true); } + public static NumberingLevel unordered(String levelIndex) { + return new NumberingLevel(levelIndex, false); + } + private final String levelIndex; private final boolean isOrdered; diff --git a/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java b/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java index 3a6432d..5ce1512 100644 --- a/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java +++ b/src/main/java/org/zwobble/mammoth/styles/ParagraphMatcher.java @@ -1,5 +1,6 @@ package org.zwobble.mammoth.styles; +import org.zwobble.mammoth.documents.NumberingLevel; import org.zwobble.mammoth.documents.Paragraph; import org.zwobble.mammoth.documents.Style; @@ -7,26 +8,36 @@ import java.util.Optional; import java.util.function.BiPredicate; public class ParagraphMatcher { - public static final ParagraphMatcher ANY = new ParagraphMatcher(Optional.empty(), Optional.empty()); + public static final ParagraphMatcher ANY = new ParagraphMatcher(Optional.empty(), Optional.empty(), Optional.empty()); public static ParagraphMatcher styleId(String styleId) { - return new ParagraphMatcher(Optional.of(styleId), Optional.empty()); + return new ParagraphMatcher(Optional.of(styleId), Optional.empty(), Optional.empty()); } public static ParagraphMatcher styleName(String styleName) { - return new ParagraphMatcher(Optional.empty(), Optional.of(styleName)); + return new ParagraphMatcher(Optional.empty(), Optional.of(styleName), Optional.empty()); + } + + public static ParagraphMatcher orderedList(String level) { + return new ParagraphMatcher(Optional.empty(), Optional.empty(), Optional.of(NumberingLevel.ordered(level))); + } + + public static ParagraphMatcher unorderedList(String level) { + return new ParagraphMatcher(Optional.empty(), Optional.empty(), Optional.of(NumberingLevel.unordered(level))); } private final Optional styleId; private final Optional styleName; + private final Optional numbering; - public ParagraphMatcher(Optional styleId, Optional styleName) { + public ParagraphMatcher(Optional styleId, Optional styleName, Optional numbering) { this.styleId = styleId; this.styleName = styleName; + this.numbering = numbering; } public boolean matches(Paragraph paragraph) { - return matchesStyleId(paragraph) && matchesStyleName(paragraph); + return matchesStyleId(paragraph) && matchesStyleName(paragraph) && matchesNumbering(paragraph); } private boolean matchesStyleId(Paragraph paragraph) { @@ -37,7 +48,12 @@ public class ParagraphMatcher { return matches(styleName, paragraph.getStyle().flatMap(Style::getName), String::equalsIgnoreCase); } - private boolean matches(Optional required, Optional actual, BiPredicate areEqual) { + private boolean matchesNumbering(Paragraph paragraph) { + return matches(numbering, paragraph.getNumbering(), (first, second) -> + first.isOrdered() == second.isOrdered() && first.getLevelIndex().equalsIgnoreCase(second.getLevelIndex())); + } + + private boolean matches(Optional required, Optional actual, BiPredicate areEqual) { return required .map(requiredValue -> actual.map(actualValue -> areEqual.test(requiredValue, actualValue)).orElse(false)) .orElse(true); diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java index 1091ab8..a80e2ea 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -15,6 +15,7 @@ import static org.zwobble.mammoth.util.MammothLists.list; public class DocumentElementMakers { public static final Property> STYLE = newProperty(); + public static final Property> NUMBERING = newProperty(); public static final Property BOLD = newProperty(); public static final Property ITALIC = newProperty(); public static final Property UNDERLINE = newProperty(); @@ -25,7 +26,7 @@ public class DocumentElementMakers { public static final Instantiator PARAGRAPH = propertyLookup -> new Paragraph( propertyLookup.valueOf(STYLE, Optional.empty()), - Optional.empty(), + propertyLookup.valueOf(NUMBERING, Optional.empty()), propertyLookup.valueOf(CHILDREN, list())); public static final Instantiator RUN = diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index 517773c..2c1d505 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -33,6 +33,7 @@ import static org.zwobble.mammoth.results.Warning.warning; import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals; import static org.zwobble.mammoth.tests.documents.DocumentElementMakers.*; import static org.zwobble.mammoth.tests.docx.BodyXmlReaderMakers.*; +import static org.zwobble.mammoth.tests.docx.BodyXmlReaderMakers.NUMBERING; import static org.zwobble.mammoth.util.MammothLists.list; import static org.zwobble.mammoth.util.MammothMaps.map; import static org.zwobble.mammoth.xml.XmlNodes.element; diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/ParagraphMatcherTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/ParagraphMatcherTests.java index fdaa075..436dc62 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/ParagraphMatcherTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/ParagraphMatcherTests.java @@ -1,6 +1,7 @@ package org.zwobble.mammoth.tests.styles; import org.junit.Test; +import org.zwobble.mammoth.documents.NumberingLevel; import org.zwobble.mammoth.documents.Paragraph; import org.zwobble.mammoth.documents.Style; import org.zwobble.mammoth.styles.ParagraphMatcher; @@ -12,6 +13,7 @@ import static com.natpryce.makeiteasy.MakeItEasy.make; import static com.natpryce.makeiteasy.MakeItEasy.with; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.zwobble.mammoth.tests.documents.DocumentElementMakers.NUMBERING; import static org.zwobble.mammoth.tests.documents.DocumentElementMakers.PARAGRAPH; import static org.zwobble.mammoth.tests.documents.DocumentElementMakers.STYLE; @@ -70,4 +72,40 @@ public class ParagraphMatcherTests { with(STYLE, Optional.of(new Style("TipsParagraph", Optional.of("Tips Paragraph")))))); assertTrue(matcher.matches(paragraphWithCorrectStyleName)); } + + @Test + public void matcherWithOrderedListOnlyMatchesParagraphsWithOrderedListAtThatLeve() { + ParagraphMatcher matcher = ParagraphMatcher.orderedList("4"); + assertFalse(matcher.matches(make(a(PARAGRAPH)))); + + Paragraph paragraphWithCorrectNumbering = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.ordered("4"))))); + assertTrue(matcher.matches(paragraphWithCorrectNumbering)); + + Paragraph paragraphWithIncorrectLevel = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.ordered("3"))))); + assertFalse(matcher.matches(paragraphWithIncorrectLevel)); + + Paragraph paragraphWithIncorrectOrdering = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.unordered("4"))))); + assertFalse(matcher.matches(paragraphWithIncorrectOrdering)); + } + + @Test + public void matcherWithUnorderedListOnlyMatchesParagraphsWithUnrderedListAtThatLeve() { + ParagraphMatcher matcher = ParagraphMatcher.unorderedList("4"); + assertFalse(matcher.matches(make(a(PARAGRAPH)))); + + Paragraph paragraphWithCorrectNumbering = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.unordered("4"))))); + assertTrue(matcher.matches(paragraphWithCorrectNumbering)); + + Paragraph paragraphWithIncorrectLevel = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.unordered("3"))))); + assertFalse(matcher.matches(paragraphWithIncorrectLevel)); + + Paragraph paragraphWithIncorrectOrdering = make(a(PARAGRAPH, + with(NUMBERING, Optional.of(NumberingLevel.ordered("4"))))); + assertFalse(matcher.matches(paragraphWithIncorrectOrdering)); + } } -- cgit v1.2.3