From 2d5ab06e462f2db69e64bd1dcbba98e8752fd146 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 22 Apr 2017 15:53:54 +0100 Subject: Handle complex fields that do not have a "separate" fldChar. --- .../internal/docx/StatefulBodyXmlReader.java | 2 ++ .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 26 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'src') 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 2e0bdc6..2097822 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -245,6 +245,7 @@ class StatefulBodyXmlReader { private ReadResult readFieldChar(XmlElement element) { String type = element.getAttributeOrNone("w:fldCharType").orElse(""); if (type.equals("begin")) { + complexFieldStack.add(ComplexField.UNKNOWN); currentInstrText.setLength(0); } else if (type.equals("end")) { complexFieldStack.remove(); @@ -253,6 +254,7 @@ class StatefulBodyXmlReader { ComplexField complexField = parseHyperlinkFieldCode(instrText) .map(href -> ComplexField.hyperlink(href)) .orElse(ComplexField.UNKNOWN); + complexFieldStack.remove(); complexFieldStack.add(complexField); } return ReadResult.EMPTY_SUCCESS; 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 a28086d..4a750a5 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -307,6 +307,32 @@ public class BodyXmlTests { isEmptyRun() ))); } + + @Test + public void fieldWithoutSeparateFldCharIsIgnored() { + XmlElement hyperlinkRunXml = runXml("this is a hyperlink"); + XmlElement element = paragraphXml(list( + BEGIN_COMPLEX_FIELD, + HYPERLINK_INSTRTEXT, + SEPARATE_COMPLEX_FIELD, + BEGIN_COMPLEX_FIELD, + END_COMPLEX_FIELD, + hyperlinkRunXml, + END_COMPLEX_FIELD + )); + DocumentElement paragraph = readSuccess(bodyReader(), element); + + assertThat(paragraph, isParagraph(hasChildren( + isEmptyRun(), + isEmptyHyperlinkedRun(), + isEmptyHyperlinkedRun(), + isEmptyHyperlinkedRun(), + isHyperlinkedRun(hasChildren( + isTextElement("this is a hyperlink") + )), + isEmptyRun() + ))); + } } @Test -- cgit v1.2.3