You are viewing a plain text version of this content. The canonical link for it is here.
Posted to odf-commits@incubator.apache.org by ms...@apache.org on 2018/05/14 13:13:47 UTC
[odftoolkit] 02/02: ODFTOOLKIT-475 validator: fix checking
character content in foreign elements
This is an automated email from the ASF dual-hosted git repository.
mst pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/odftoolkit.git
commit 536201d92c7f65f5be8923762069add053e4aca9
Author: Michael Stahl <Mi...@cib.de>
AuthorDate: Tue May 8 14:03:54 2018 +0200
ODFTOOLKIT-475 validator: fix checking character content in foreign elements
... below text:p.
If the ODF element does not allow character content itself,
then for any child foreign element the character content should be
ignored.
See ODF 1.2 part 1 section 3.17 Foreign Elements and Attributes.
It's apparently not possible to ask the RelaxNG validator if an element
allows character content, so add a hard-coded list.
---
.../odfvalidator/ForeignContentFilter.java | 63 ++++++++++++++++++++-
.../org/odftoolkit/odfvalidator/ValidTest.java | 20 +++++++
validator/src/test/resources/sender-initials.odt | Bin 0 -> 8647 bytes
3 files changed, 82 insertions(+), 1 deletion(-)
diff --git a/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java b/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java
index 58fb76a..6f61d04 100644
--- a/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java
+++ b/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java
@@ -34,6 +34,9 @@ class ForeignContentFilter extends XMLFilterImpl {
private static final String OFFICE_NAMESPACE_URI = OdfDocumentNamespace.OFFICE.getUri();
private static final String TEXT_NAMESPACE_URI = OdfDocumentNamespace.TEXT.getUri();
+ private static final String DRAW_NAMESPACE_URI = OdfDocumentNamespace.DRAW.getUri();
+ private static final String DR3D_NAMESPACE_URI = OdfDocumentNamespace.DR3D.getUri();
+ private static final String PRESENTATION_NAMESPACE_URI = OdfDocumentNamespace.PRESENTATION.getUri();
private static final String H = "h";
private static final String P = "p";
@@ -163,7 +166,65 @@ class ForeignContentFilter extends XMLFilterImpl {
}
boolean bParagraphAncestor = hasParagraphAncestorElement();
- bParagraphAncestor |= ((aLocalName.equals(P) || aLocalName.equals(H)) && aUri.equals(TEXT_NAMESPACE_URI));
+ if ((aLocalName.equals(P) || aLocalName.equals(H)) && aUri.equals(TEXT_NAMESPACE_URI))
+ bParagraphAncestor = true;
+ else if ((aUri.equals(TEXT_NAMESPACE_URI) && (
+ aLocalName.equals("s")
+ || aLocalName.equals("tab")
+ || aLocalName.equals("line-break")
+ || aLocalName.equals("soft-page-break")
+ || aLocalName.equals("bookmark")
+ || aLocalName.equals("bookmark-start")
+ || aLocalName.equals("bookmark-end")
+ || aLocalName.equals("reference-mark")
+ || aLocalName.equals("reference-mark-start")
+ || aLocalName.equals("reference-mark-end")
+ || aLocalName.equals("note")
+ || aLocalName.equals("change")
+ || aLocalName.equals("change-start")
+ || aLocalName.equals("change-end")
+ || aLocalName.equals("toc-mark")
+ || aLocalName.equals("toc-mark-start")
+ || aLocalName.equals("toc-mark-end")
+ || aLocalName.equals("alphabetical-index-mark")
+ || aLocalName.equals("alphabetical-index-mark-start")
+ || aLocalName.equals("alphabetical-index-mark-end")
+ || aLocalName.equals("user-index-mark")
+ || aLocalName.equals("user-index-mark-start")
+ || aLocalName.equals("user-index-mark-end")))
+ || (aUri.equals(OFFICE_NAMESPACE_URI) && (
+ aLocalName.equals("annotation")
+ || aLocalName.equals("annotation-end")))
+ || (aUri.equals(DRAW_NAMESPACE_URI) && (
+ aLocalName.equals("a")
+ || aLocalName.equals("rect")
+ || aLocalName.equals("line")
+ || aLocalName.equals("polyline")
+ || aLocalName.equals("polygon")
+ || aLocalName.equals("regular-polygon")
+ || aLocalName.equals("path")
+ || aLocalName.equals("circle")
+ || aLocalName.equals("g")
+ || aLocalName.equals("page-thumbnail")
+ || aLocalName.equals("frame")
+ || aLocalName.equals("measure")
+ || aLocalName.equals("caption")
+ || aLocalName.equals("connector")
+ || aLocalName.equals("control")
+ || aLocalName.equals("custom-shape")))
+ || (aUri.equals(DR3D_NAMESPACE_URI) && (
+ aLocalName.equals("scene")))
+ || (aUri.equals(PRESENTATION_NAMESPACE_URI) && (
+ aLocalName.equals("header")
+ || aLocalName.equals("footer")
+ || aLocalName.equals("date-time"))))
+ {
+ // elements that do not contain character data - by ODF 1.2
+ // part 1 3.17, the character data in foreign elements
+ // below these should be ignored by default
+ bParagraphAncestor = false;
+ }
+
m_aParagraphAncestorElements.add(bParagraphAncestor);
super.startElement(aUri, aLocalName, aQName, aAtts);
diff --git a/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java b/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java
index 8d63d1e..c6e4633 100644
--- a/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java
+++ b/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java
@@ -142,4 +142,24 @@ public class ValidTest extends OdfValidatorTestBase {
Assert.assertTrue(output.contains("styles.xml[34,79]:"));
}
+ @Test
+ public void validateForeignElementCharacterContentExtendedInNonCharacterElement() {
+ String output = "";
+ try {
+ String name = "sender-initials.odt";
+ output = doValidation(name, OdfVersion.V1_2, OdfValidatorMode.EXTENDED_CONFORMANCE, true);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Assert.fail(t.toString());
+ }
+ if(output.contains("Exception")){
+ System.out.println("OUTPUT:" + output);
+ Assert.fail("An exception occurred during validation!");
+ }
+ System.out.println("OUTPUT:" + output);
+ Assert.assertFalse(output.contains("unexpected character literal"));
+ Assert.assertFalse(output.contains("Error:"));
+ }
+
+
}
diff --git a/validator/src/test/resources/sender-initials.odt b/validator/src/test/resources/sender-initials.odt
new file mode 100644
index 0000000..61097ac
Binary files /dev/null and b/validator/src/test/resources/sender-initials.odt differ
--
To stop receiving notification emails like this one, please contact
mst@apache.org.