elements inside of
elements
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/master by this push:
new abfc826 TIKA-2242 -- fix annotations with <p> elements inside of <p> elements
abfc826 is described below
commit abfc826959a099d6000365ccdec23925f041043f
Author: tballison <ta...@mitre.org>
AuthorDate: Fri Mar 10 14:25:45 2017 -0500
TIKA-2242 -- fix annotations with <p> elements inside of <p> elements
---
.../tika/sax/ElementMappingContentHandler.java | 8 +--
.../tika/parser/odf/OpenDocumentContentParser.java | 61 +++++++++++++++++----
.../org/apache/tika/parser/odf/ODFParserTest.java | 8 +++
.../resources/test-documents/testODTStyles3.odt | Bin 0 -> 17140 bytes
4 files changed, 63 insertions(+), 14 deletions(-)
diff --git a/tika-core/src/main/java/org/apache/tika/sax/ElementMappingContentHandler.java b/tika-core/src/main/java/org/apache/tika/sax/ElementMappingContentHandler.java
index 1307434..471667e 100644
--- a/tika-core/src/main/java/org/apache/tika/sax/ElementMappingContentHandler.java
+++ b/tika-core/src/main/java/org/apache/tika/sax/ElementMappingContentHandler.java
@@ -16,13 +16,13 @@
*/
package org.apache.tika.sax;
-import java.util.Map;
-import java.util.Collections;
import javax.xml.namespace.QName;
+import java.util.Collections;
+import java.util.Map;
-import org.xml.sax.SAXException;
-import org.xml.sax.ContentHandler;
import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
index 8ffba84..18ebc49 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
@@ -78,6 +78,17 @@ public class OpenDocumentContentParser extends AbstractParser {
private static final class OpenDocumentElementMappingContentHandler extends
ElementMappingContentHandler {
private static final char[] SPACE = new char[]{ ' '};
+ private static final String CLASS = "class";
+ private static final Attributes ANNOTATION_ATTRIBUTES = buildAttributes(CLASS, "annotation");
+ private static final Attributes NOTE_ATTRIBUTES = buildAttributes(CLASS, "note");
+ private static final Attributes NOTES_ATTRIBUTES = buildAttributes(CLASS, "notes");
+
+ private static Attributes buildAttributes(String key, String value) {
+ AttributesImpl attrs = new AttributesImpl();
+ attrs.addAttribute("", key, key, "CDATA", value);
+ return attrs;
+ }
+
private final ContentHandler handler;
private final BitSet textNodeStack = new BitSet();
private int nodeDepth = 0;
@@ -102,6 +113,9 @@ public class OpenDocumentContentParser extends AbstractParser {
//yet for the current text style
boolean hasWrittenStartStyleTags = false;
+ private int pDepth = 0; //<p> can appear inside comments and other things that are already inside <p>
+ //we need to track our pDepth and only output <p> if we're at the main level
+
private OpenDocumentElementMappingContentHandler(ContentHandler handler,
Map<QName, TargetElement> mappings) {
@@ -193,12 +207,27 @@ public class OpenDocumentContentParser extends AbstractParser {
}
private void startParagraph(String styleName) throws SAXException {
+ if (pDepth == 0) {
+ handler.startElement(XHTML, "p", "p", EMPTY_ATTRIBUTES);
+ if (styleName != null) {
+ currTextStyle = paragraphTextStyleMap.get(styleName);
+ }
+ hasWrittenStartStyleTags = false;
+ } else {
+ handler.characters(SPACE, 0, SPACE.length);
+ }
+ pDepth++;
+ }
- handler.startElement(XHTML, "p", "p", EMPTY_ATTRIBUTES);
- if (styleName != null) {
- currTextStyle = paragraphTextStyleMap.get(styleName);
+ private void endParagraph() throws SAXException {
+ closeStyleTags();
+ if (pDepth == 1) {
+ handler.endElement(XHTML, "p", "p");
+ } else {
+ handler.characters(SPACE, 0, SPACE.length);
}
- hasWrittenStartStyleTags = false;
+ pDepth--;
+
}
private void updateStyleTags() throws SAXException {
@@ -250,7 +279,7 @@ public class OpenDocumentContentParser extends AbstractParser {
}
private void endSpan() throws SAXException {
-
+ updateStyleTags();
}
private void closeStyleTags() throws SAXException {
@@ -343,6 +372,15 @@ public class OpenDocumentContentParser extends AbstractParser {
startParagraph(attrs.getValue(TEXT_NS, "style-name"));
} else if (TEXT_NS.equals(namespaceURI) && "s".equals(localName)) {
handler.characters(SPACE, 0, 1);
+ } else if ("annotation".equals(localName)) {
+ closeStyleTags();
+ handler.startElement(XHTML, "span", "p", ANNOTATION_ATTRIBUTES);
+ } else if ("note".equals(localName)) {
+ closeStyleTags();
+ handler.startElement(XHTML, "span", "p", NOTE_ATTRIBUTES);
+ } else if ("notes".equals(localName)) {
+ closeStyleTags();
+ handler.startElement(XHTML, "span", "p", NOTES_ATTRIBUTES);
} else {
super.startElement(namespaceURI, localName, qName, attrs);
}
@@ -380,8 +418,11 @@ public class OpenDocumentContentParser extends AbstractParser {
currTextStyle = null;
hasWrittenStartStyleTags = false;
} else if (TEXT_NS.equals(namespaceURI) && "p".equals(localName)) {
- closeStyleTags();
- handler.endElement(XHTML, "p", "p");
+ endParagraph();
+ } else if ("annotation".equals(localName) || "note".equals(localName) ||
+ "notes".equals(localName)) {
+ closeStyleTags();
+ handler.endElement("", localName, localName);
} else {
super.endElement(namespaceURI, localName, qName);
}
@@ -468,13 +509,13 @@ public class OpenDocumentContentParser extends AbstractParser {
new TargetElement(XHTML, "li"));
MAPPINGS.put(
new QName(TEXT_NS, "note"),
- new TargetElement(XHTML, "div"));
+ new TargetElement(XHTML, "span"));
MAPPINGS.put(
new QName(OFFICE_NS, "annotation"),
- new TargetElement(XHTML, "div"));
+ new TargetElement(XHTML, "span"));
MAPPINGS.put(
new QName(PRESENTATION_NS, "notes"),
- new TargetElement(XHTML, "div"));
+ new TargetElement(XHTML, "span"));
MAPPINGS.put(
new QName(DRAW_NS, "object"),
new TargetElement(XHTML, "object"));
diff --git a/tika-parsers/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java b/tika-parsers/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java
index ab63c8a..f9fe636 100644
--- a/tika-parsers/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java
+++ b/tika-parsers/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java
@@ -390,4 +390,12 @@ public class ODFParserTest extends TikaTest {
//test paragraph's font-style properties
assertContains("<p><b>Publicatie Onbekwaamverklaring", xml);
}
+
+ @Test //TIKA-2242
+ public void testAnnotationsAndPDepthGt1() throws Exception {
+ //not allowed in html: <p> <annotation> <p> this is an annotation </p> </annotation> </p>
+ String xml = getXML("testODTStyles3.odt").xml;
+ System.out.println(xml);
+ assertContains("<p><b>WOUTERS Rolf</b><span class=\"annotation\"> Beschermde persoon is overleden </annotation>", xml);
+ }
}
diff --git a/tika-parsers/src/test/resources/test-documents/testODTStyles3.odt b/tika-parsers/src/test/resources/test-documents/testODTStyles3.odt
new file mode 100644
index 0000000..04833e5
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testODTStyles3.odt differ
--
To stop receiving notification emails like this one, please contact
['"commits@tika.apache.org" <co...@tika.apache.org>'].