From 999fbc8dc29b87a0f9c4497ec680915ac7ecae26 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 9 Sep 2020 11:28:05 +0100 Subject: Handle underline elements where w:val is "none" --- NEWS | 2 + .../internal/docx/StatefulBodyXmlReader.java | 6 ++- .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 48 ++++++++++++++++++++-- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index d56d1ac..5680540 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ * Support soft hyphens. +* Handle underline elements where w:val is "none". + # 1.4.1 * Read the children of v:rect elements. diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java index d5f594f..af6b70f 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -205,7 +205,11 @@ class StatefulBodyXmlReader { } private boolean isUnderline(XmlElementLike properties) { - return readBooleanElement(properties, "w:u"); + return properties.findChild("w:u") + .map(child -> child.getAttributeOrNone("w:val") + .map(value -> !value.equals("false") && !value.equals("0") && !value.equals("none")) + .orElse(true)) + .orElse(false); } private boolean isStrikethrough(XmlElementLike properties) { 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 aaaf1e2..647f54f 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -506,16 +506,58 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - hasProperty("underline", equalTo(false))); + hasProperty("underline", equalTo(false)) + ); } @Test - public void runIsUnderlinedIfUnderlineElementIsPresent() { + public void runIsUnderlinedIfUnderlineElementIsPresentWithoutValAttribute() { XmlElement element = runXmlWithProperties(element("w:u")); assertThat( readSuccess(bodyReader(), element), - hasProperty("underline", equalTo(true))); + hasProperty("underline", equalTo(true)) + ); + } + + @Test + public void runIsNotUnderlinedIfUnderlineElementIsPresentAndValIsFalse() { + XmlElement element = runXmlWithProperties(element("w:u", map("w:val", "false"))); + + assertThat( + readSuccess(bodyReader(), element), + hasProperty("underline", equalTo(false)) + ); + } + + @Test + public void runIsNotUnderlinedIfUnderlineElementIsPresentAndValIs0() { + XmlElement element = runXmlWithProperties(element("w:u", map("w:val", "0"))); + + assertThat( + readSuccess(bodyReader(), element), + hasProperty("underline", equalTo(false)) + ); + } + + @Test + public void runIsNotUnderlinedIfUnderlineElementIsPresentAndValIsNone() { + XmlElement element = runXmlWithProperties(element("w:u", map("w:val", "none"))); + + assertThat( + readSuccess(bodyReader(), element), + hasProperty("underline", equalTo(false)) + ); + } + + @Test + public void runIsUnderlinedIfUnderlineElementIsPresentAndValIsNotNoneNorFalsy() { + XmlElement element = runXmlWithProperties(element("w:u", map("w:val", "single"))); + + assertThat( + readSuccess(bodyReader(), element), + hasProperty("underline", equalTo(true)) + ); } @Test -- cgit v1.2.3