You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2017/03/10 19:25:53 UTC

[tika] branch master updated: TIKA-2242 -- fix annotations with

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>'].