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 2020/08/12 19:48:01 UTC

[tika] branch main updated (4e05727 -> 611417f)

This is an automated email from the ASF dual-hosted git repository.

tallison pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git.


    from 4e05727  TIKA-3153 -- add MinShouldMatchClause to allow more flexibility in defining rfc822 detection
     new 114f93e  TIKA-3159 -- add detection and parser for flat ODF files and handle macros.
     new cb5f410  TIKA-3153 -- bug fix to this issue -- ensure custom tika config system variable is reset
     new 611417f  TIKA-3161 -- extract macros from open document formats

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGES.txt                                        |  22 +
 .../org/apache/tika/mime/tika-mimetypes.xml        |  28 +
 .../org/apache/tika/mime/MimeTypesReaderTest.java  |  14 +
 .../parser/odf/FlatOpenDocumentMacroHandler.java   | 114 +++
 .../tika/parser/odf/FlatOpenDocumentParser.java    | 174 +++++
 .../tika/parser/odf/OpenDocumentBodyHandler.java   | 623 ++++++++++++++++
 .../tika/parser/odf/OpenDocumentContentParser.java | 527 +-------------
 .../tika/parser/odf/OpenDocumentMacroHandler.java  |  59 +-
 .../tika/parser/odf/OpenDocumentMetaParser.java    |  17 +-
 .../apache/tika/parser/odf/OpenDocumentParser.java |  49 +-
 .../services/org.apache.tika.parser.Parser         |   1 +
 .../org/apache/tika/parser/odf/ODFParserTest.java  | 139 ++++
 .../resources/test-documents/testODPMacro.fodp     | 781 +++++++++++++++++++++
 .../test/resources/test-documents/testODPMacro.odp | Bin 0 -> 14505 bytes
 .../resources/test-documents/testODSMacro.fods     | 625 +++++++++++++++++
 .../test/resources/test-documents/testODSMacro.ods | Bin 0 -> 30726 bytes
 .../resources/test-documents/testODTMacro.fodt     | 633 +++++++++++++++++
 .../test/resources/test-documents/testODTMacro.odt | Bin 0 -> 29912 bytes
 18 files changed, 3244 insertions(+), 562 deletions(-)
 create mode 100644 tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentMacroHandler.java
 create mode 100644 tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
 create mode 100644 tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java
 copy tika-core/src/test/java/org/apache/tika/parser/mock/MockParserFactory.java => tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java (50%)
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODPMacro.fodp
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODPMacro.odp
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODSMacro.fods
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODSMacro.ods
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODTMacro.fodt
 create mode 100644 tika-parsers/src/test/resources/test-documents/testODTMacro.odt


[tika] 02/03: TIKA-3153 -- bug fix to this issue -- ensure custom tika config system variable is reset

Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git

commit cb5f4103c00b91d55f3974959e4cb444549dad27
Author: tallison <ta...@apache.org>
AuthorDate: Wed Aug 12 15:46:34 2020 -0400

    TIKA-3153 -- bug fix to this issue -- ensure custom tika config system variable is reset
---
 .../java/org/apache/tika/mime/MimeTypesReaderTest.java     | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java b/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
index c688688..9a27ce7 100644
--- a/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
+++ b/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
@@ -35,6 +35,7 @@ import java.util.concurrent.Executors;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -58,6 +59,8 @@ public class MimeTypesReaderTest {
     private MimeTypes mimeTypes;
     private List<Magic> magics;
 
+    private String customMimeTypes;
+
     @SuppressWarnings("unchecked")
     @Before
     public void setUp() throws NoSuchFieldException, SecurityException,
@@ -67,6 +70,17 @@ public class MimeTypesReaderTest {
         Field magicsField = mimeTypes.getClass().getDeclaredField("magics");
         magicsField.setAccessible(true);
         magics = (List<Magic>)magicsField.get(mimeTypes);
+        //ensure reset of custom mimes path
+        customMimeTypes = System.getProperty(MimeTypesFactory.CUSTOM_MIMES_SYS_PROP);
+    }
+
+    @After
+    public void tearDown() {
+        if (customMimeTypes == null) {
+            System.clearProperty(MimeTypesFactory.CUSTOM_MIMES_SYS_PROP);
+        } else {
+            System.setProperty(MimeTypesFactory.CUSTOM_MIMES_SYS_PROP, customMimeTypes);
+        }
     }
     
     @Test


[tika] 01/03: TIKA-3159 -- add detection and parser for flat ODF files and handle macros.

Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 114f93e61f91e83bc029f35ccd2421bca585f91d
Author: tallison <ta...@apache.org>
AuthorDate: Wed Aug 12 14:27:19 2020 -0400

    TIKA-3159 -- add detection and parser for flat ODF files and handle macros.
---
 .../org/apache/tika/mime/tika-mimetypes.xml        |  28 +
 .../tika/parser/odf/FlatOpenDocumentParser.java    | 172 +++++
 .../tika/parser/odf/OpenDocumentBodyHandler.java   | 623 ++++++++++++++++
 .../tika/parser/odf/OpenDocumentContentParser.java | 527 +-------------
 .../tika/parser/odf/OpenDocumentMacroHandler.java  | 115 +++
 .../tika/parser/odf/OpenDocumentMetaParser.java    |  17 +-
 .../services/org.apache.tika.parser.Parser         |   1 +
 .../org/apache/tika/parser/odf/ODFParserTest.java  |  70 ++
 .../resources/test-documents/testODPMacro.fodp     | 781 +++++++++++++++++++++
 .../resources/test-documents/testODSMacro.fods     | 625 +++++++++++++++++
 .../resources/test-documents/testODTMacro.fodt     | 633 +++++++++++++++++
 11 files changed, 3062 insertions(+), 530 deletions(-)

diff --git a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index 61d07a2..8442692 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -2302,6 +2302,34 @@
     <glob pattern="*.odt"/>
   </mime-type>
 
+  <!-- can't tell from the root element whether this is fodt, fodp, etc.
+     This is a made up general mime to cover the open office flat formats.
+      Subtype detection can be done with the document:mime attribute in the root
+      element and/or file extensions fodt...-->
+  <mime-type type="application/vnd.oasis.opendocument.tika.flat.document">
+    <_comment>OpenDocument v1.0: Flat Text document</_comment>
+    <root-XML namespaceURI="urn:oasis:names:tc:opendocument:xmlns:office:1.0" localName="document"/>
+    <sub-class-of type="application/xml"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.flat.text">
+    <_comment>OpenDocument v1.0: Flat Text document</_comment>
+    <glob pattern="*.fodt"/>
+    <sub-class-of type="application/vnd.oasis.opendocument.tika.flat.document"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.flat.presentation">
+    <_comment>OpenDocument v1.0: Flat Presentation document</_comment>
+    <glob pattern="*.fodp"/>
+    <sub-class-of type="application/vnd.oasis.opendocument.tika.flat.document"/>
+  </mime-type>
+
+  <mime-type type="application/vnd.oasis.opendocument.flat.spreadsheet">
+    <_comment>OpenDocument v1.0: Flat Spreadsheet document</_comment>
+    <glob pattern="*.fods"/>
+    <sub-class-of type="application/vnd.oasis.opendocument.tika.flat.document"/>
+  </mime-type>
+
   <mime-type type="application/vnd.oasis.opendocument.text-master">
     <alias type="application/x-vnd.oasis.opendocument.text-master"/>
     <_comment>OpenDocument v1.0: Global Text document</_comment>
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
new file mode 100644
index 0000000..442840c
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.odf;
+
+import org.apache.commons.io.input.CloseShieldInputStream;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.AbstractParser;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.ContentHandlerDecorator;
+import org.apache.tika.sax.EmbeddedContentHandler;
+import org.apache.tika.sax.OfflineContentHandler;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.apache.tika.utils.XMLReaderUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class FlatOpenDocumentParser extends AbstractParser {
+
+    static final MediaType FLAT_OD = MediaType.application("vnd.oasis.opendocument.tika.flat.document");
+
+    static final MediaType FLAT_ODT = MediaType.application("vnd.oasis.opendocument.flat.text");
+    static final MediaType FLAT_ODP = MediaType.application("vnd.oasis.opendocument.flat.presentation");
+    static final MediaType FLAT_ODS = MediaType.application("vnd.oasis.opendocument.flat.spreadsheet");
+
+    static final MediaType ODT = MediaType.application("vnd.oasis.opendocument.text");
+    static final MediaType ODP = MediaType.application("vnd.oasis.opendocument.presentation");
+    static final MediaType ODS = MediaType.application("vnd.oasis.opendocument.spreadsheet");
+
+    private static final Set<MediaType> SUPPORTED_TYPES =
+            Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
+                    FLAT_OD, FLAT_ODT, FLAT_ODP, FLAT_ODS
+                  )));
+
+    @Override
+    public Set<MediaType> getSupportedTypes(ParseContext context) {
+        return SUPPORTED_TYPES;
+    }
+
+    @Override
+    public void parse(InputStream stream, ContentHandler handler,
+                      Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException {
+        final XHTMLContentHandler xhtml =
+                new XHTMLContentHandler(handler, metadata);
+
+        xhtml.startDocument();
+        try {
+            ContentHandler fodHandler = getContentHandler(xhtml, metadata, context);
+            XMLReaderUtils.parseSAX(
+                    new CloseShieldInputStream(stream),
+                    new OfflineContentHandler(
+                            new EmbeddedContentHandler(fodHandler)
+                    ), context);
+            //can only detect subtype (text/pres/sheet) during parse.
+            //update it here.
+            MediaType detected = ((FlatOpenDocumentParserHandler)fodHandler).getDetectedType();
+            if (detected != null) {
+                metadata.set(Metadata.CONTENT_TYPE, detected.toString());
+            }
+        } finally {
+            xhtml.endDocument();
+        }
+    }
+
+    private ContentHandler getContentHandler(ContentHandler handler,
+                                             Metadata metadata, ParseContext context) {
+        return new FlatOpenDocumentParserHandler(handler, metadata, context);
+    }
+
+    private static class FlatOpenDocumentParserHandler extends ContentHandlerDecorator {
+        private static final String META = "meta";
+        private static final String BODY = "body";
+        private static final String SCRIPTS = "scripts";
+        private static final String DOCUMENT = "document";
+
+        private final Metadata metadata;
+        private final ParseContext parseContext;
+
+        private final ContentHandler defaultHandler = new DefaultHandler();
+
+        private final ContentHandler bodyHandler;
+        private final ContentHandler metadataHandler;
+        private final ContentHandler macroHandler;
+
+        private ContentHandler currentHandler = defaultHandler;
+
+        private MediaType detectedType = null;
+
+        private FlatOpenDocumentParserHandler(ContentHandler baseHandler, Metadata metadata, ParseContext parseContext) {
+            this.metadata = metadata;
+            this.parseContext = parseContext;
+            this.bodyHandler = new OpenDocumentBodyHandler(new NSNormalizerContentHandler(baseHandler), parseContext);
+            this.metadataHandler = OpenDocumentMetaParser.getContentHandler(metadata, parseContext);
+            this.macroHandler = new OpenDocumentMacroHandler(baseHandler, parseContext);
+        }
+
+        MediaType getDetectedType() {
+            return detectedType;
+        }
+        @Override
+        public void startElement(
+                String namespaceURI, String localName, String qName,
+                Attributes attrs) throws SAXException {
+
+            if (META.equals(localName)) {
+                currentHandler = metadataHandler;
+            } else if (BODY.equals(localName)) {
+                currentHandler = bodyHandler;
+            } else if (SCRIPTS.equals(localName)) {
+                currentHandler = macroHandler;
+            }
+
+            //trust the mimetype element if it exists for the subtype
+            if (DOCUMENT.equals(localName)) {
+                String mime = XMLReaderUtils.getAttrValue("mimetype", attrs);
+                if (mime != null) {
+                    if (mime.equals(ODT.toString())) {
+                        detectedType = FLAT_ODT;
+                    } else if (mime.equals(ODP.toString())) {
+                        detectedType = FLAT_ODP;
+                    } else if (mime.equals(ODS.toString())) {
+                        detectedType = FLAT_ODS;
+                    }
+                }
+            }
+            currentHandler.startElement(namespaceURI, localName, qName, attrs);
+        }
+
+        @Override
+        public void characters(char[] ch, int start, int length)
+                throws SAXException {
+            currentHandler.characters(ch, start, length);
+        }
+
+        @Override
+        public void endElement(
+                String namespaceURI, String localName, String qName) throws SAXException {
+            if (META.equals(localName)) {
+                currentHandler = defaultHandler;
+            } else if (BODY.equals(localName)) {
+                currentHandler = defaultHandler;
+            } else if (SCRIPTS.equals(localName)) {
+                currentHandler = defaultHandler;
+            }
+            currentHandler.endElement(namespaceURI, localName, qName);
+        }
+    }
+}
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java
new file mode 100644
index 0000000..9d18f64
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java
@@ -0,0 +1,623 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.odf;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.tika.extractor.EmbeddedDocumentExtractor;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.ElementMappingContentHandler;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import javax.xml.namespace.QName;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import static org.apache.tika.sax.XHTMLContentHandler.XHTML;
+/*
+    Handler for the body element or odt flat files and content.xml of
+    traditional compressed odt files
+ */
+class OpenDocumentBodyHandler extends ElementMappingContentHandler {
+
+    private interface Style {
+    }
+
+    private static class TextStyle implements Style {
+        public boolean italic;
+        public boolean bold;
+        public boolean underlined;
+
+        @Override
+        public String toString() {
+            return "TextStyle{" +
+                    "italic=" + italic +
+                    ", bold=" + bold +
+                    ", underlined=" + underlined +
+                    '}';
+        }
+    }
+
+    private static class ListStyle implements Style {
+        public boolean ordered;
+
+        public String getTag() {
+            return ordered ? "ol" : "ul";
+        }
+    }
+
+
+    public static final String TEXT_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:text:1.0";
+
+    public static final String TABLE_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:table:1.0";
+
+    public static final String STYLE_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:style:1.0";
+
+    public static final String FORMATTING_OBJECTS_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0";
+
+    public static final String OFFICE_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
+
+    public static final String SVG_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0";
+
+    public static final String PRESENTATION_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0";
+
+    public static final String DRAW_NS =
+            "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0";
+
+    public static final String XLINK_NS = "http://www.w3.org/1999/xlink";
+
+    private static final String BINARY_DATA = "binary-data";
+
+    protected static final char[] TAB = new char[]{'\t'};
+
+    private static final Attributes EMPTY_ATTRIBUTES = new AttributesImpl();
+
+    /**
+     * Mappings between ODF tag names and XHTML tag names
+     * (including attributes). All other tag names/attributes are ignored
+     * and left out from event stream.
+     */
+    private static final HashMap<QName, TargetElement> MAPPINGS =
+            new HashMap<QName, TargetElement>();
+
+    static {
+        // general mappings of text:-tags
+        MAPPINGS.put(
+                new QName(TEXT_NS, "p"),
+                new TargetElement(XHTML, "p"));
+        // text:h-tags are mapped specifically in startElement/endElement
+        MAPPINGS.put(
+                new QName(TEXT_NS, "line-break"),
+                new TargetElement(XHTML, "br"));
+        MAPPINGS.put(
+                new QName(TEXT_NS, "list-item"),
+                new TargetElement(XHTML, "li"));
+        MAPPINGS.put(
+                new QName(TEXT_NS, "note"),
+                new TargetElement(XHTML, "span"));
+        MAPPINGS.put(
+                new QName(OFFICE_NS, "annotation"),
+                new TargetElement(XHTML, "span"));
+        MAPPINGS.put(
+                new QName(PRESENTATION_NS, "notes"),
+                new TargetElement(XHTML, "span"));
+        MAPPINGS.put(
+                new QName(DRAW_NS, "object"),
+                new TargetElement(XHTML, "object"));
+        MAPPINGS.put(
+                new QName(DRAW_NS, "text-box"),
+                new TargetElement(XHTML, "div"));
+        MAPPINGS.put(
+                new QName(SVG_NS, "title"),
+                new TargetElement(XHTML, "span"));
+        MAPPINGS.put(
+                new QName(SVG_NS, "desc"),
+                new TargetElement(XHTML, "span"));
+        MAPPINGS.put(
+                new QName(TEXT_NS, "span"),
+                new TargetElement(XHTML, "span"));
+
+        final HashMap<QName, QName> aAttsMapping =
+                new HashMap<QName, QName>();
+        aAttsMapping.put(
+                new QName(XLINK_NS, "href"),
+                new QName("href"));
+        aAttsMapping.put(
+                new QName(XLINK_NS, "title"),
+                new QName("title"));
+        MAPPINGS.put(
+                new QName(TEXT_NS, "a"),
+                new TargetElement(XHTML, "a", aAttsMapping));
+
+        // create HTML tables from table:-tags
+        MAPPINGS.put(
+                new QName(TABLE_NS, "table"),
+                new TargetElement(XHTML, "table"));
+        // repeating of rows is ignored; for columns, see below!
+        MAPPINGS.put(
+                new QName(TABLE_NS, "table-row"),
+                new TargetElement(XHTML, "tr"));
+        // special mapping for rowspan/colspan attributes
+        final HashMap<QName, QName> tableCellAttsMapping =
+                new HashMap<QName, QName>();
+        tableCellAttsMapping.put(
+                new QName(TABLE_NS, "number-columns-spanned"),
+                new QName("colspan"));
+        tableCellAttsMapping.put(
+                new QName(TABLE_NS, "number-rows-spanned"),
+                new QName("rowspan"));
+        /* TODO: The following is not correct, the cell should be repeated not spanned!
+         * Code generates a HTML cell, spanning all repeated columns, to make the cell look correct.
+         * Problems may occur when both spanning and repeating is given, which is not allowed by spec.
+         * Cell spanning instead of repeating  is not a problem, because OpenOffice uses it
+         * only for empty cells.
+         */
+        tableCellAttsMapping.put(
+                new QName(TABLE_NS, "number-columns-repeated"),
+                new QName("colspan"));
+        MAPPINGS.put(
+                new QName(TABLE_NS, "table-cell"),
+                new TargetElement(XHTML, "td", tableCellAttsMapping));
+    }
+
+    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 ParseContext parseContext;
+    private EmbeddedDocumentExtractor embeddedDocumentExtractor;
+
+    private StringBuilder base64BinaryDataBuffer = new StringBuilder();
+    private final BitSet textNodeStack = new BitSet();
+    private int nodeDepth = 0;
+    private int completelyFiltered = 0;
+    private Stack<String> headingStack = new Stack<String>();
+    private Map<String, TextStyle> paragraphTextStyleMap = new HashMap<String, TextStyle>();
+    private Map<String, TextStyle> textStyleMap = new HashMap<String, TextStyle>();
+    private Map<String, ListStyle> listStyleMap = new HashMap<String, ListStyle>();
+    private String currParagraphStyleName; //paragraph style name
+    private TextStyle currTextStyle; //this is the text style for particular spans/paragraphs
+    private String currTextStyleName;
+
+    private Stack<ListStyle> listStyleStack = new Stack<ListStyle>();
+    private ListStyle listStyle;
+
+    // True if we are currently in the named style:
+    private boolean curUnderlined;
+    private boolean curBold;
+    private boolean curItalic;
+
+    //have we written the start style tags
+    //yet for the current text style
+    boolean hasWrittenStartStyleTags = false;
+
+    //if we're in a binary-data tag
+    boolean inBinaryData = 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
+
+
+
+    OpenDocumentBodyHandler(ContentHandler handler, ParseContext parseContext) {
+        super(handler, MAPPINGS);
+        this.handler = handler;
+        this.parseContext = parseContext;
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+        if (inBinaryData) {
+            base64BinaryDataBuffer.append(ch, start, length);
+            return;
+        }
+        // only forward content of tags from text:-namespace
+        if (completelyFiltered == 0 && nodeDepth > 0
+                && textNodeStack.get(nodeDepth - 1)) {
+            if (!hasWrittenStartStyleTags) {
+                updateStyleTags();
+                hasWrittenStartStyleTags = true;
+            }
+            super.characters(ch, start, length);
+        }
+    }
+
+    // helper for checking tags which need complete filtering
+    // (with sub-tags)
+    private boolean needsCompleteFiltering(
+            String namespaceURI, String localName) {
+        if (TEXT_NS.equals(namespaceURI)) {
+            return localName.endsWith("-template")
+                    || localName.endsWith("-style");
+        }
+        return TABLE_NS.equals(namespaceURI) && "covered-table-cell".equals(localName);
+    }
+
+    // map the heading level to <hX> HTML tags
+    private String getXHTMLHeaderTagName(Attributes atts) {
+        String depthStr = atts.getValue(TEXT_NS, "outline-level");
+        if (depthStr == null) {
+            return "h1";
+        }
+
+        int depth = Integer.parseInt(depthStr);
+        if (depth >= 6) {
+            return "h6";
+        } else if (depth <= 1) {
+            return "h1";
+        } else {
+            return "h" + depth;
+        }
+    }
+
+    /**
+     * Check if a node is a text node
+     */
+    private boolean isTextNode(String namespaceURI, String localName) {
+        if (TEXT_NS.equals(namespaceURI) && !localName.equals("page-number") && !localName.equals("page-count")) {
+            return true;
+        }
+        if (SVG_NS.equals(namespaceURI)) {
+            return "title".equals(localName) ||
+                    "desc".equals(localName);
+        }
+        return false;
+    }
+
+    private void startList(String name) throws SAXException {
+        String elementName = "ul";
+        if (name != null) {
+            ListStyle style = listStyleMap.get(name);
+            elementName = style != null ? style.getTag() : "ul";
+            listStyleStack.push(style);
+        }
+        handler.startElement(XHTML, elementName, elementName, EMPTY_ATTRIBUTES);
+    }
+
+    private void endList() throws SAXException {
+        String elementName = "ul";
+        if (!listStyleStack.isEmpty()) {
+            ListStyle style = listStyleStack.pop();
+            elementName = style != null ? style.getTag() : "ul";
+        }
+        handler.endElement(XHTML, elementName, elementName);
+    }
+
+    private void startSpan(String name) throws SAXException {
+        if (name == null) {
+            return;
+        }
+        currTextStyle = textStyleMap.get(name);
+        hasWrittenStartStyleTags = false;
+    }
+
+    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++;
+    }
+
+    private void endParagraph() throws SAXException {
+        closeStyleTags();
+        if (pDepth == 1) {
+            handler.endElement(XHTML, "p", "p");
+        } else {
+            handler.characters(SPACE, 0, SPACE.length);
+        }
+        pDepth--;
+
+    }
+
+    private void updateStyleTags() throws SAXException {
+
+        if (currTextStyle == null) {
+            closeStyleTags();
+            return;
+        }
+        if (currTextStyle.bold != curBold) {
+            // Enforce nesting -- must close s and i tags
+            if (curUnderlined) {
+                handler.endElement(XHTML, "u", "u");
+                curUnderlined = false;
+            }
+            if (curItalic) {
+                handler.endElement(XHTML, "i", "i");
+                curItalic = false;
+            }
+            if (currTextStyle.bold) {
+                handler.startElement(XHTML, "b", "b", EMPTY_ATTRIBUTES);
+            } else {
+                handler.endElement(XHTML, "b", "b");
+            }
+            curBold = currTextStyle.bold;
+        }
+
+        if (currTextStyle.italic != curItalic) {
+            // Enforce nesting -- must close s tag
+            if (curUnderlined) {
+                handler.endElement(XHTML, "u", "u");
+                curUnderlined = false;
+            }
+            if (currTextStyle.italic) {
+                handler.startElement(XHTML, "i", "i", EMPTY_ATTRIBUTES);
+            } else {
+                handler.endElement(XHTML, "i", "i");
+            }
+            curItalic = currTextStyle.italic;
+        }
+
+        if (currTextStyle.underlined != curUnderlined) {
+            if (currTextStyle.underlined) {
+                handler.startElement(XHTML, "u", "u", EMPTY_ATTRIBUTES);
+            } else {
+                handler.endElement(XHTML, "u", "u");
+            }
+            curUnderlined = currTextStyle.underlined;
+        }
+    }
+
+    private void endSpan() throws SAXException {
+        updateStyleTags();
+    }
+
+    private void closeStyleTags() throws SAXException {
+        // Close any still open style tags
+        if (curUnderlined) {
+            handler.endElement(XHTML, "u", "u");
+            curUnderlined = false;
+        }
+        if (curItalic) {
+            handler.endElement(XHTML, "i", "i");
+            curItalic = false;
+        }
+        if (curBold) {
+            handler.endElement(XHTML, "b", "b");
+            curBold = false;
+        }
+        currTextStyle = null;
+        hasWrittenStartStyleTags = false;
+    }
+
+    @Override
+    public void startElement(
+            String namespaceURI, String localName, String qName,
+            Attributes attrs) throws SAXException {
+
+        if (BINARY_DATA.equals(localName)) {
+            inBinaryData = true;
+            return;
+        }
+        // keep track of current node type. If it is a text node,
+        // a bit at the current depth its set in textNodeStack.
+        // characters() checks the top bit to determine, if the
+        // actual node is a text node to print out nodeDepth contains
+        // the depth of the current node and also marks top of stack.
+        assert nodeDepth >= 0;
+
+        // Set styles
+        if (STYLE_NS.equals(namespaceURI) && "style".equals(localName)) {
+            String family = attrs.getValue(STYLE_NS, "family");
+            if ("text".equals(family)) {
+                currTextStyle = new TextStyle();
+                currTextStyleName = attrs.getValue(STYLE_NS, "name");
+            } else if ("paragraph".equals(family)) {
+                currTextStyle = new TextStyle();
+                currParagraphStyleName = attrs.getValue(STYLE_NS, "name");
+            }
+        } else if (TEXT_NS.equals(namespaceURI) && "list-style".equals(localName)) {
+            listStyle = new ListStyle();
+            String name = attrs.getValue(STYLE_NS, "name");
+            listStyleMap.put(name, listStyle);
+        } else if (currTextStyle != null && STYLE_NS.equals(namespaceURI)
+                && "text-properties".equals(localName)) {
+            String fontStyle = attrs.getValue(FORMATTING_OBJECTS_NS, "font-style");
+            if ("italic".equals(fontStyle) || "oblique".equals(fontStyle)) {
+                currTextStyle.italic = true;
+            }
+            String fontWeight = attrs.getValue(FORMATTING_OBJECTS_NS, "font-weight");
+            if ("bold".equals(fontWeight) || "bolder".equals(fontWeight)
+                    || (fontWeight != null && Character.isDigit(fontWeight.charAt(0))
+                    && Integer.valueOf(fontWeight) > 500)) {
+                currTextStyle.bold = true;
+            }
+            String underlineStyle = attrs.getValue(STYLE_NS, "text-underline-style");
+            if (underlineStyle != null && !underlineStyle.equals("none")) {
+                currTextStyle.underlined = true;
+            }
+        } else if (listStyle != null && TEXT_NS.equals(namespaceURI)) {
+            if ("list-level-style-bullet".equals(localName)) {
+                listStyle.ordered = false;
+            } else if ("list-level-style-number".equals(localName)) {
+                listStyle.ordered = true;
+            }
+        }
+
+        textNodeStack.set(nodeDepth++,
+                isTextNode(namespaceURI, localName));
+        // filter *all* content of some tags
+        assert completelyFiltered >= 0;
+
+        if (needsCompleteFiltering(namespaceURI, localName)) {
+            completelyFiltered++;
+        }
+        // call next handler if no filtering
+        if (completelyFiltered == 0) {
+            // special handling of text:h, that are directly passed
+            // to incoming handler
+            if (TEXT_NS.equals(namespaceURI) && "h".equals(localName)) {
+                final String el = headingStack.push(getXHTMLHeaderTagName(attrs));
+                handler.startElement(XHTMLContentHandler.XHTML, el, el, EMPTY_ATTRIBUTES);
+            } else if (TEXT_NS.equals(namespaceURI) && "list".equals(localName)) {
+                startList(attrs.getValue(TEXT_NS, "style-name"));
+            } else if (TEXT_NS.equals(namespaceURI) && "span".equals(localName)) {
+                startSpan(attrs.getValue(TEXT_NS, "style-name"));
+            } else if (TEXT_NS.equals(namespaceURI) && "p".equals(localName)) {
+                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);
+            }
+        }
+    }
+
+    @Override
+    public void endElement(
+            String namespaceURI, String localName, String qName)
+            throws SAXException {
+        if (BINARY_DATA.equals(localName)) {
+            inBinaryData = false;
+            try {
+                processBinaryData();
+            } catch (IOException e) {
+                throw new SAXException(e);
+            }
+            return;
+        }
+        if (STYLE_NS.equals(namespaceURI) && "style".equals(localName)) {
+            if (currTextStyle != null && currTextStyleName != null) {
+                textStyleMap.put(currTextStyleName, currTextStyle);
+                currTextStyleName = null;
+                currTextStyle = null;
+            } else if (currTextStyle != null && currParagraphStyleName != null) {
+                paragraphTextStyleMap.put(currParagraphStyleName, currTextStyle);
+                currParagraphStyleName = null;
+                currTextStyle = null;
+            }
+        } else if (TEXT_NS.equals(namespaceURI) && "list-style".equals(localName)) {
+            listStyle = null;
+        }
+
+        // call next handler if no filtering
+        if (completelyFiltered == 0) {
+            // special handling of text:h, that are directly passed
+            // to incoming handler
+            if (TEXT_NS.equals(namespaceURI) && "h".equals(localName)) {
+                final String el = headingStack.pop();
+                handler.endElement(namespaceURI, el, el);
+            } else if (TEXT_NS.equals(namespaceURI) && "list".equals(localName)) {
+                endList();
+            } else if (TEXT_NS.equals(namespaceURI) && "span".equals(localName)) {
+                currTextStyle = null;
+                hasWrittenStartStyleTags = false;
+            } else if (TEXT_NS.equals(namespaceURI) && "p".equals(localName)) {
+                endParagraph();
+            } else if ("annotation".equals(localName) || "note".equals(localName) ||
+                    "notes".equals(localName)) {
+                closeStyleTags();
+                handler.endElement(namespaceURI, localName, localName);
+            } else {
+                super.endElement(namespaceURI, localName, qName);
+            }
+
+            // special handling of tabulators
+            if (TEXT_NS.equals(namespaceURI)
+                    && ("tab-stop".equals(localName)
+                    || "tab".equals(localName))) {
+                this.characters(TAB, 0, TAB.length);
+            }
+        }
+
+        // revert filter for *all* content of some tags
+        if (needsCompleteFiltering(namespaceURI, localName)) {
+            completelyFiltered--;
+        }
+        assert completelyFiltered >= 0;
+
+        // reduce current node depth
+        nodeDepth--;
+        assert nodeDepth >= 0;
+    }
+
+    private void processBinaryData() throws IOException, SAXException {
+
+        //TODO: figure out whether we're in an inline image or a regular
+        //attachment and add that info to the embedded metadata
+
+        byte[] bytes = Base64.decodeBase64(base64BinaryDataBuffer.toString());
+        //clear state before parsing
+        base64BinaryDataBuffer.setLength(0);
+        inBinaryData = false;
+
+        if (embeddedDocumentExtractor == null) {
+            embeddedDocumentExtractor = EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(parseContext);
+        }
+        Metadata embeddedMetadata = new Metadata();
+        if (embeddedDocumentExtractor.shouldParseEmbedded(embeddedMetadata)) {
+            try (InputStream is = TikaInputStream.get(bytes)) {
+                embeddedDocumentExtractor.parseEmbedded(
+                        is, handler, embeddedMetadata, false
+                );
+            }
+        }
+    }
+
+    @Override
+    public void startPrefixMapping(String prefix, String uri) {
+        // remove prefix mappings as they should not occur in XHTML
+    }
+
+    @Override
+    public void endPrefixMapping(String prefix) {
+        // remove prefix mappings as they should not occur in XHTML
+    }
+
+
+}
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 2e40c68..225eb85 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
@@ -49,531 +49,6 @@ import static org.apache.tika.sax.XHTMLContentHandler.XHTML;
  * Parser for ODF <code>content.xml</code> files.
  */
 public class OpenDocumentContentParser extends AbstractParser {
-    private interface Style {
-    }
-
-    private static class TextStyle implements Style {
-        public boolean italic;
-        public boolean bold;
-        public boolean underlined;
-
-        @Override
-        public String toString() {
-            return "TextStyle{" +
-                    "italic=" + italic +
-                    ", bold=" + bold +
-                    ", underlined=" + underlined +
-                    '}';
-        }
-    }
-
-    private static class ListStyle implements Style {
-        public boolean ordered;
-
-        public String getTag() {
-            return ordered ? "ol" : "ul";
-        }
-    }
-
-    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;
-        private int completelyFiltered = 0;
-        private Stack<String> headingStack = new Stack<String>();
-        private Map<String, TextStyle> paragraphTextStyleMap = new HashMap<String, TextStyle>();
-        private Map<String, TextStyle> textStyleMap = new HashMap<String, TextStyle>();
-        private Map<String, ListStyle> listStyleMap = new HashMap<String, ListStyle>();
-        private String currParagraphStyleName; //paragraph style name
-        private TextStyle currTextStyle; //this is the text style for particular spans/paragraphs
-        private String currTextStyleName;
-
-        private Stack<ListStyle> listStyleStack = new Stack<ListStyle>();
-        private ListStyle listStyle;
-
-        // True if we are currently in the named style:
-        private boolean curUnderlined;
-        private boolean curBold;
-        private boolean curItalic;
-
-        //have we written the start style tags
-        //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) {
-            super(handler, mappings);
-            this.handler = handler;
-        }
-
-        @Override
-        public void characters(char[] ch, int start, int length)
-                throws SAXException {
-            // only forward content of tags from text:-namespace
-            if (completelyFiltered == 0 && nodeDepth > 0
-                    && textNodeStack.get(nodeDepth - 1)) {
-                if (!hasWrittenStartStyleTags) {
-                    updateStyleTags();
-                    hasWrittenStartStyleTags = true;
-                }
-                super.characters(ch, start, length);
-            }
-        }
-
-        // helper for checking tags which need complete filtering
-        // (with sub-tags)
-        private boolean needsCompleteFiltering(
-                String namespaceURI, String localName) {
-            if (TEXT_NS.equals(namespaceURI)) {
-                return localName.endsWith("-template")
-                        || localName.endsWith("-style");
-            }
-            return TABLE_NS.equals(namespaceURI) && "covered-table-cell".equals(localName);
-        }
-
-        // map the heading level to <hX> HTML tags
-        private String getXHTMLHeaderTagName(Attributes atts) {
-            String depthStr = atts.getValue(TEXT_NS, "outline-level");
-            if (depthStr == null) {
-                return "h1";
-            }
-
-            int depth = Integer.parseInt(depthStr);
-            if (depth >= 6) {
-                return "h6";
-            } else if (depth <= 1) {
-                return "h1";
-            } else {
-                return "h" + depth;
-            }
-        }
-
-        /**
-         * Check if a node is a text node
-         */
-        private boolean isTextNode(String namespaceURI, String localName) {
-            if (TEXT_NS.equals(namespaceURI) && !localName.equals("page-number") && !localName.equals("page-count")) {
-                return true;
-            }
-            if (SVG_NS.equals(namespaceURI)) {
-                return "title".equals(localName) ||
-                        "desc".equals(localName);
-            }
-            return false;
-        }
-
-        private void startList(String name) throws SAXException {
-            String elementName = "ul";
-            if (name != null) {
-                ListStyle style = listStyleMap.get(name);
-                elementName = style != null ? style.getTag() : "ul";
-                listStyleStack.push(style);
-            }
-            handler.startElement(XHTML, elementName, elementName, EMPTY_ATTRIBUTES);
-        }
-
-        private void endList() throws SAXException {
-            String elementName = "ul";
-            if (!listStyleStack.isEmpty()) {
-                ListStyle style = listStyleStack.pop();
-                elementName = style != null ? style.getTag() : "ul";
-            }
-            handler.endElement(XHTML, elementName, elementName);
-        }
-
-        private void startSpan(String name) throws SAXException {
-            if (name == null) {
-                return;
-            }
-            currTextStyle = textStyleMap.get(name);
-            hasWrittenStartStyleTags = false;
-        }
-
-        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++;
-        }
-
-        private void endParagraph() throws SAXException {
-            closeStyleTags();
-            if (pDepth == 1) {
-                handler.endElement(XHTML, "p", "p");
-            } else {
-                handler.characters(SPACE, 0, SPACE.length);
-            }
-            pDepth--;
-
-        }
-
-        private void updateStyleTags() throws SAXException {
-
-            if (currTextStyle == null) {
-                closeStyleTags();
-                return;
-            }
-            if (currTextStyle.bold != curBold) {
-                // Enforce nesting -- must close s and i tags
-                if (curUnderlined) {
-                    handler.endElement(XHTML, "u", "u");
-                    curUnderlined = false;
-                }
-                if (curItalic) {
-                    handler.endElement(XHTML, "i", "i");
-                    curItalic = false;
-                }
-                if (currTextStyle.bold) {
-                    handler.startElement(XHTML, "b", "b", EMPTY_ATTRIBUTES);
-                } else {
-                    handler.endElement(XHTML, "b", "b");
-                }
-                curBold = currTextStyle.bold;
-            }
-
-            if (currTextStyle.italic != curItalic) {
-                // Enforce nesting -- must close s tag
-                if (curUnderlined) {
-                    handler.endElement(XHTML, "u", "u");
-                    curUnderlined = false;
-                }
-                if (currTextStyle.italic) {
-                    handler.startElement(XHTML, "i", "i", EMPTY_ATTRIBUTES);
-                } else {
-                    handler.endElement(XHTML, "i", "i");
-                }
-                curItalic = currTextStyle.italic;
-            }
-
-            if (currTextStyle.underlined != curUnderlined) {
-                if (currTextStyle.underlined) {
-                    handler.startElement(XHTML, "u", "u", EMPTY_ATTRIBUTES);
-                } else {
-                    handler.endElement(XHTML, "u", "u");
-                }
-                curUnderlined = currTextStyle.underlined;
-            }
-        }
-
-        private void endSpan() throws SAXException {
-            updateStyleTags();
-        }
-
-        private void closeStyleTags() throws SAXException {
-            // Close any still open style tags
-            if (curUnderlined) {
-                handler.endElement(XHTML,"u", "u");
-                curUnderlined = false;
-            }
-            if (curItalic) {
-                handler.endElement(XHTML,"i", "i");
-                curItalic = false;
-            }
-            if (curBold) {
-                handler.endElement(XHTML,"b", "b");
-                curBold = false;
-            }
-            currTextStyle = null;
-            hasWrittenStartStyleTags = false;
-        }
-
-        @Override
-        public void startElement(
-                String namespaceURI, String localName, String qName,
-                Attributes attrs) throws SAXException {
-            // keep track of current node type. If it is a text node,
-            // a bit at the current depth its set in textNodeStack.
-            // characters() checks the top bit to determine, if the
-            // actual node is a text node to print out nodeDepth contains
-            // the depth of the current node and also marks top of stack.
-            assert nodeDepth >= 0;
-
-            // Set styles
-            if (STYLE_NS.equals(namespaceURI) && "style".equals(localName)) {
-                String family = attrs.getValue(STYLE_NS, "family");
-                if ("text".equals(family)) {
-                    currTextStyle = new TextStyle();
-                    currTextStyleName = attrs.getValue(STYLE_NS, "name");
-                } else if ("paragraph".equals(family)) {
-                    currTextStyle = new TextStyle();
-                    currParagraphStyleName = attrs.getValue(STYLE_NS, "name");
-                }
-            } else if (TEXT_NS.equals(namespaceURI) && "list-style".equals(localName)) {
-                listStyle = new ListStyle();
-                String name = attrs.getValue(STYLE_NS, "name");
-                listStyleMap.put(name, listStyle);
-            } else if (currTextStyle != null && STYLE_NS.equals(namespaceURI)
-                    && "text-properties".equals(localName)) {
-                String fontStyle = attrs.getValue(FORMATTING_OBJECTS_NS, "font-style");
-                if ("italic".equals(fontStyle) || "oblique".equals(fontStyle)) {
-                    currTextStyle.italic = true;
-                }
-                String fontWeight = attrs.getValue(FORMATTING_OBJECTS_NS, "font-weight");
-                if ("bold".equals(fontWeight) || "bolder".equals(fontWeight)
-                        || (fontWeight != null && Character.isDigit(fontWeight.charAt(0))
-                        && Integer.valueOf(fontWeight) > 500)) {
-                    currTextStyle.bold = true;
-                }
-                String underlineStyle = attrs.getValue(STYLE_NS, "text-underline-style");
-                if (underlineStyle != null && !underlineStyle.equals("none")) {
-                    currTextStyle.underlined = true;
-                }
-            } else if (listStyle != null && TEXT_NS.equals(namespaceURI)) {
-                if ("list-level-style-bullet".equals(localName)) {
-                    listStyle.ordered = false;
-                } else if ("list-level-style-number".equals(localName)) {
-                    listStyle.ordered = true;
-                }
-            }
-
-            textNodeStack.set(nodeDepth++,
-                    isTextNode(namespaceURI, localName));
-            // filter *all* content of some tags
-            assert completelyFiltered >= 0;
-
-            if (needsCompleteFiltering(namespaceURI, localName)) {
-                completelyFiltered++;
-            }
-            // call next handler if no filtering
-            if (completelyFiltered == 0) {
-                // special handling of text:h, that are directly passed
-                // to incoming handler
-                if (TEXT_NS.equals(namespaceURI) && "h".equals(localName)) {
-                    final String el = headingStack.push(getXHTMLHeaderTagName(attrs));
-                    handler.startElement(XHTMLContentHandler.XHTML, el, el, EMPTY_ATTRIBUTES);
-                } else if (TEXT_NS.equals(namespaceURI) && "list".equals(localName)) {
-                    startList(attrs.getValue(TEXT_NS, "style-name"));
-                } else if (TEXT_NS.equals(namespaceURI) && "span".equals(localName)) {
-                    startSpan(attrs.getValue(TEXT_NS, "style-name"));
-                } else if (TEXT_NS.equals(namespaceURI) && "p".equals(localName)) {
-                    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);
-                }
-            }
-        }
-
-        @Override
-        public void endElement(
-                String namespaceURI, String localName, String qName)
-                throws SAXException {
-            if (STYLE_NS.equals(namespaceURI) && "style".equals(localName)) {
-                if (currTextStyle != null && currTextStyleName != null) {
-                    textStyleMap.put(currTextStyleName, currTextStyle);
-                    currTextStyleName = null;
-                    currTextStyle = null;
-                } else if (currTextStyle != null && currParagraphStyleName != null) {
-                    paragraphTextStyleMap.put(currParagraphStyleName, currTextStyle);
-                    currParagraphStyleName = null;
-                    currTextStyle = null;
-                }
-            } else if (TEXT_NS.equals(namespaceURI) && "list-style".equals(localName)) {
-                listStyle = null;
-            }
-
-            // call next handler if no filtering
-            if (completelyFiltered == 0) {
-                // special handling of text:h, that are directly passed
-                // to incoming handler
-                if (TEXT_NS.equals(namespaceURI) && "h".equals(localName)) {
-                    final String el = headingStack.pop();
-                    handler.endElement(namespaceURI, el, el);
-                } else if (TEXT_NS.equals(namespaceURI) && "list".equals(localName)) {
-                    endList();
-                } else if (TEXT_NS.equals(namespaceURI) && "span".equals(localName)) {
-                    currTextStyle = null;
-                    hasWrittenStartStyleTags = false;
-                } else if (TEXT_NS.equals(namespaceURI) && "p".equals(localName)) {
-                    endParagraph();
-                } else if ("annotation".equals(localName) || "note".equals(localName) ||
-                        "notes".equals(localName)) {
-                        closeStyleTags();
-                        handler.endElement(namespaceURI, localName, localName);
-                } else {
-                    super.endElement(namespaceURI, localName, qName);
-                }
-
-                // special handling of tabulators
-                if (TEXT_NS.equals(namespaceURI)
-                        && ("tab-stop".equals(localName)
-                        || "tab".equals(localName))) {
-                    this.characters(TAB, 0, TAB.length);
-                }
-            }
-
-            // revert filter for *all* content of some tags
-            if (needsCompleteFiltering(namespaceURI, localName)) {
-                completelyFiltered--;
-            }
-            assert completelyFiltered >= 0;
-
-            // reduce current node depth
-            nodeDepth--;
-            assert nodeDepth >= 0;
-        }
-
-        @Override
-        public void startPrefixMapping(String prefix, String uri) {
-            // remove prefix mappings as they should not occur in XHTML
-        }
-
-        @Override
-        public void endPrefixMapping(String prefix) {
-            // remove prefix mappings as they should not occur in XHTML
-        }
-    }
-
-    public static final String TEXT_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:text:1.0";
-
-    public static final String TABLE_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:table:1.0";
-
-    public static final String STYLE_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:style:1.0";
-
-    public static final String FORMATTING_OBJECTS_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0";
-
-    public static final String OFFICE_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
-
-    public static final String SVG_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0";
-
-    public static final String PRESENTATION_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0";
-
-    public static final String DRAW_NS =
-            "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0";
-
-    public static final String XLINK_NS = "http://www.w3.org/1999/xlink";
-
-    protected static final char[] TAB = new char[]{'\t'};
-
-    private static final Attributes EMPTY_ATTRIBUTES = new AttributesImpl();
-
-    /**
-     * Mappings between ODF tag names and XHTML tag names
-     * (including attributes). All other tag names/attributes are ignored
-     * and left out from event stream.
-     */
-    private static final HashMap<QName, TargetElement> MAPPINGS =
-            new HashMap<QName, TargetElement>();
-
-    static {
-        // general mappings of text:-tags
-        MAPPINGS.put(
-                new QName(TEXT_NS, "p"),
-                new TargetElement(XHTML, "p"));
-        // text:h-tags are mapped specifically in startElement/endElement
-        MAPPINGS.put(
-                new QName(TEXT_NS, "line-break"),
-                new TargetElement(XHTML, "br"));
-        MAPPINGS.put(
-                new QName(TEXT_NS, "list-item"),
-                new TargetElement(XHTML, "li"));
-        MAPPINGS.put(
-                new QName(TEXT_NS, "note"),
-                new TargetElement(XHTML, "span"));
-        MAPPINGS.put(
-                new QName(OFFICE_NS, "annotation"),
-                new TargetElement(XHTML, "span"));
-        MAPPINGS.put(
-                new QName(PRESENTATION_NS, "notes"),
-                new TargetElement(XHTML, "span"));
-        MAPPINGS.put(
-                new QName(DRAW_NS, "object"),
-                new TargetElement(XHTML, "object"));
-        MAPPINGS.put(
-                new QName(DRAW_NS, "text-box"),
-                new TargetElement(XHTML, "div"));
-        MAPPINGS.put(
-                new QName(SVG_NS, "title"),
-                new TargetElement(XHTML, "span"));
-        MAPPINGS.put(
-                new QName(SVG_NS, "desc"),
-                new TargetElement(XHTML, "span"));
-        MAPPINGS.put(
-                new QName(TEXT_NS, "span"),
-                new TargetElement(XHTML, "span"));
-
-        final HashMap<QName, QName> aAttsMapping =
-                new HashMap<QName, QName>();
-        aAttsMapping.put(
-                new QName(XLINK_NS, "href"),
-                new QName("href"));
-        aAttsMapping.put(
-                new QName(XLINK_NS, "title"),
-                new QName("title"));
-        MAPPINGS.put(
-                new QName(TEXT_NS, "a"),
-                new TargetElement(XHTML, "a", aAttsMapping));
-
-        // create HTML tables from table:-tags
-        MAPPINGS.put(
-                new QName(TABLE_NS, "table"),
-                new TargetElement(XHTML, "table"));
-        // repeating of rows is ignored; for columns, see below!
-        MAPPINGS.put(
-                new QName(TABLE_NS, "table-row"),
-                new TargetElement(XHTML, "tr"));
-        // special mapping for rowspan/colspan attributes
-        final HashMap<QName, QName> tableCellAttsMapping =
-                new HashMap<QName, QName>();
-        tableCellAttsMapping.put(
-                new QName(TABLE_NS, "number-columns-spanned"),
-                new QName("colspan"));
-        tableCellAttsMapping.put(
-                new QName(TABLE_NS, "number-rows-spanned"),
-                new QName("rowspan"));
-        /* TODO: The following is not correct, the cell should be repeated not spanned!
-         * Code generates a HTML cell, spanning all repeated columns, to make the cell look correct.
-         * Problems may occur when both spanning and repeating is given, which is not allowed by spec.
-         * Cell spanning instead of repeating  is not a problem, because OpenOffice uses it
-         * only for empty cells.
-         */
-        tableCellAttsMapping.put(
-                new QName(TABLE_NS, "number-columns-repeated"),
-                new QName("colspan"));
-        MAPPINGS.put(
-                new QName(TABLE_NS, "table-cell"),
-                new TargetElement(XHTML, "td", tableCellAttsMapping));
-    }
 
     public Set<MediaType> getSupportedTypes(ParseContext context) {
         return Collections.emptySet(); // not a top-level parser
@@ -593,7 +68,7 @@ public class OpenDocumentContentParser extends AbstractParser {
             Metadata metadata, ParseContext context)
             throws IOException, SAXException, TikaException {
 
-        DefaultHandler dh = new OpenDocumentElementMappingContentHandler(handler, MAPPINGS);
+        DefaultHandler dh = new OpenDocumentBodyHandler(handler, context);
 
 
         XMLReaderUtils.parseSAX(
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
new file mode 100644
index 0000000..14e4d8d
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.odf;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tika.extractor.EmbeddedDocumentExtractor;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.ContentHandlerDecorator;
+import org.apache.tika.utils.XMLReaderUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+
+class OpenDocumentMacroHandler extends ContentHandlerDecorator {
+
+    private static String MODULE = "module";
+    private static String SOURCE_CODE = "source-code";
+    private static String NAME = "name";
+
+    private final ContentHandler contentHandler;
+    private final ParseContext parseContext;
+    private EmbeddedDocumentExtractor embeddedDocumentExtractor;
+    private final StringBuilder macroBuffer = new StringBuilder();
+    private String macroName = null;
+    private boolean inMacro = false;
+
+    OpenDocumentMacroHandler(ContentHandler contentHandler, ParseContext parseContext) {
+        super(contentHandler);
+        this.contentHandler = contentHandler;
+        this.parseContext = parseContext;
+    }
+
+    @Override
+    public void startElement(
+            String namespaceURI, String localName, String qName,
+            Attributes attrs) throws SAXException {
+        if (MODULE.equals(localName)) {
+            macroName = XMLReaderUtils.getAttrValue(NAME, attrs);
+        } else if (SOURCE_CODE.equals(localName)) {
+            inMacro = true;
+        }
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+        if (inMacro) {
+            macroBuffer.append(ch, start, length);
+        }
+    }
+
+    @Override
+    public void endElement(
+            String namespaceURI, String localName, String qName) throws SAXException {
+        if (SOURCE_CODE.equals(localName)) {
+            try {
+                handleMacro();
+            } catch (IOException e) {
+                throw new SAXException(e);
+            }
+        }
+    }
+
+    private void handleMacro() throws IOException, SAXException {
+
+        byte[] bytes = macroBuffer.toString().getBytes(StandardCharsets.UTF_8);
+
+        if (embeddedDocumentExtractor == null) {
+            embeddedDocumentExtractor = EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(parseContext);
+        }
+        Metadata embeddedMetadata = new Metadata();
+        if (! StringUtils.isBlank(macroName)) {
+            embeddedMetadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, macroName);
+        }
+        embeddedMetadata.set(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE,
+                TikaCoreProperties.EmbeddedResourceType.MACRO.toString());
+
+        //reset state before parse
+        macroBuffer.setLength(0);
+        macroName = null;
+        inMacro = false;
+
+        if (embeddedDocumentExtractor.shouldParseEmbedded(embeddedMetadata)) {
+            try (InputStream is = TikaInputStream.get(bytes)) {
+                embeddedDocumentExtractor.parseEmbedded(
+                        is, contentHandler, embeddedMetadata, false
+                );
+            }
+        }
+
+    }
+}
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMetaParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMetaParser.java
index 6d84055..e97c291 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMetaParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMetaParser.java
@@ -105,10 +105,10 @@ public class OpenDocumentMetaParser extends XMLParser {
         return new TeeContentHandler(ch, branch);
     }
 
-    protected ContentHandler getContentHandler(ContentHandler ch, Metadata md, ParseContext context) {
+    static ContentHandler getContentHandler(Metadata md, ParseContext context, ContentHandler ... handlers) {
         // We can no longer extend DcXMLParser due to the handling of dc:subject and dc:date
-        // Process the Dublin Core Attributes 
-        ch = new TeeContentHandler(super.getContentHandler(ch, md, context),
+        // Process the Dublin Core Attributes
+        ContentHandler ch = new TeeContentHandler(
                 getDublinCoreHandler(md, TikaCoreProperties.TITLE, "title"),
                 getDublinCoreHandler(md, TikaCoreProperties.CREATOR, "creator"),
                 getDublinCoreHandler(md, TikaCoreProperties.DESCRIPTION, "description"),
@@ -152,12 +152,21 @@ public class OpenDocumentMetaParser extends XMLParser {
         ch = getStatistic(ch, md, Office.WORD_COUNT, "word-count");
         ch = getStatistic(ch, md, Office.CHARACTER_COUNT, "character-count");
 
-
+        if (handlers != null && handlers.length > 0) {
+            ContentHandler[] newHandlers = new ContentHandler[handlers.length+1];
+            newHandlers[0] = ch;
+            System.arraycopy(handlers, 0, newHandlers, 1, handlers.length);
+            ch = new TeeContentHandler(newHandlers);
+        }
         // Normalise the rest
         ch = new NSNormalizerContentHandler(ch);
         return ch;
     }
 
+    protected ContentHandler getContentHandler(ContentHandler ch, Metadata md, ParseContext context) {
+        return getContentHandler(md, context, super.getContentHandler(ch, md, context));
+    }
+
     @Override
     public void parse(
             InputStream stream, ContentHandler handler,
diff --git a/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser b/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
index 72595d0..8da7c81 100644
--- a/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
+++ b/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
@@ -58,6 +58,7 @@ org.apache.tika.parser.mp3.Mp3Parser
 org.apache.tika.parser.mp4.MP4Parser
 org.apache.tika.parser.hdf.HDFParser
 org.apache.tika.parser.netcdf.NetCDFParser
+org.apache.tika.parser.odf.FlatOpenDocumentParser
 org.apache.tika.parser.odf.OpenDocumentParser
 org.apache.tika.parser.pdf.PDFParser
 org.apache.tika.parser.pkg.CompressorParser
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 aacbf82..d8ecedd 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
@@ -30,11 +30,13 @@ import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Office;
 import org.apache.tika.metadata.OfficeOpenXMLCore;
 import org.apache.tika.metadata.OfficeOpenXMLExtended;
+import org.apache.tika.metadata.PagedText;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.EmptyParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.opendocument.OpenOfficeParser;
+import org.apache.tika.sax.AbstractRecursiveParserWrapperHandler;
 import org.apache.tika.sax.BodyContentHandler;
 import org.junit.Test;
 import org.xml.sax.ContentHandler;
@@ -389,6 +391,74 @@ public class ODFParserTest extends TikaTest {
         }
     }
 
+    @Test
+    public void testMacroFODT() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODTMacro.fodt");
+        assertEquals(3, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<p>Hello dear user,</p>",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.flat.text",
+                parent.get(Metadata.CONTENT_TYPE));
+
+        //make sure metadata came through
+        assertEquals("LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8",
+                parent.get("generator"));
+        assertEquals(1, parent.getInt(PagedText.N_PAGES).intValue());
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("test", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+        Metadata image = metadataList.get(2);
+        assertEquals("image/png", image.get(Metadata.CONTENT_TYPE));
+    }
+
+    @Test
+    public void testMacroFODS() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODSMacro.fods");
+        assertEquals(3, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<tr>",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.flat.spreadsheet",
+                parent.get(Metadata.CONTENT_TYPE));
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("test1", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+        Metadata image = metadataList.get(2);
+        assertEquals("image/png", image.get(Metadata.CONTENT_TYPE));
+    }
+
+    @Test
+    public void testMacroFODP() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODPMacro.fodp");
+        assertEquals(2, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<p",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.flat.presentation",
+                parent.get(Metadata.CONTENT_TYPE));
+        //make sure metadata came through
+        assertEquals("LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8",
+                parent.get("generator"));
+
+        assertEquals("3", parent.get("editing-cycles"));
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("test", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+    }
+
     private ParseContext getNonRecursingParseContext() {
         ParseContext parseContext = new ParseContext();
         parseContext.set(Parser.class, new EmptyParser());
diff --git a/tika-parsers/src/test/resources/test-documents/testODPMacro.fodp b/tika-parsers/src/test/resources/test-documents/testODPMacro.fodp
new file mode 100644
index 0000000..ad70b80
--- /dev/null
+++ b/tika-parsers/src/test/resources/test-documents/testODPMacro.fodp
@@ -0,0 +1,781 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http: [...]
+ <office:meta><meta:creation-date>2020-08-11T01:04:28.659550067</meta:creation-date><dc:date>2020-08-12T12:16:10.599852857</dc:date><meta:editing-duration>PT2M24S</meta:editing-duration><meta:editing-cycles>3</meta:editing-cycles><meta:generator>LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8</meta:generator><meta:document-statistic meta:object-count="26"/></office:meta>
+ <office:settings>
+  <config:config-item-set config:name="ooo:view-settings">
+   <config:config-item config:name="VisibleAreaTop" config:type="int">-247</config:config-item>
+   <config:config-item config:name="VisibleAreaLeft" config:type="int">-880</config:config-item>
+   <config:config-item config:name="VisibleAreaWidth" config:type="int">29936</config:config-item>
+   <config:config-item config:name="VisibleAreaHeight" config:type="int">16301</config:config-item>
+   <config:config-item-map-indexed config:name="Views">
+    <config:config-item-map-entry>
+     <config:config-item config:name="ViewId" config:type="string">view1</config:config-item>
+     <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+     <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="VisibleLayers" config:type="base64Binary">Hw==</config:config-item>
+     <config:config-item config:name="PrintableLayers" config:type="base64Binary">Hw==</config:config-item>
+     <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+     <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="RulerIsVisible" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+     <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+     <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+     <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+     <config:config-item config:name="VisibleAreaTop" config:type="int">-247</config:config-item>
+     <config:config-item config:name="VisibleAreaLeft" config:type="int">-880</config:config-item>
+     <config:config-item config:name="VisibleAreaWidth" config:type="int">29937</config:config-item>
+     <config:config-item config:name="VisibleAreaHeight" config:type="int">16302</config:config-item>
+     <config:config-item config:name="GridCoarseWidth" config:type="int">2540</config:config-item>
+     <config:config-item config:name="GridCoarseHeight" config:type="int">2540</config:config-item>
+     <config:config-item config:name="GridFineWidth" config:type="int">254</config:config-item>
+     <config:config-item config:name="GridFineHeight" config:type="int">254</config:config-item>
+     <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">2540</config:config-item>
+     <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">10</config:config-item>
+     <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">2540</config:config-item>
+     <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">10</config:config-item>
+     <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+     <config:config-item config:name="ZoomOnPage" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+    </config:config-item-map-entry>
+   </config:config-item-map-indexed>
+  </config:config-item-set>
+  <config:config-item-set config:name="ooo:configuration-settings">
+   <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="BitmapTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.sob</config:config-item>
+   <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+   <config:config-item config:name="ColorTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.soc</config:config-item>
+   <config:config-item config:name="DashTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.sod</config:config-item>
+   <config:config-item config:name="DefaultTabStop" config:type="int">1270</config:config-item>
+   <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="GradientTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.sog</config:config-item>
+   <config:config-item config:name="HandoutsHorizontal" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="HatchTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.soh</config:config-item>
+   <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="LineEndTableURL" config:type="string">$(inst)/Resources/palette%3B$(user)/config/standard.soe</config:config-item>
+   <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+   <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+   <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+   <config:config-item config:name="PrinterName" config:type="string"/>
+   <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterSetup" config:type="base64Binary">AAA=</config:config-item>
+   <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SlidesPerHandout" config:type="short">6</config:config-item>
+   <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
+  </config:config-item-set>
+ </office:settings>
+ <office:scripts>
+  <office:script script:language="ooo:Basic">
+   <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <ooo:library-embedded ooo:name="Standard">
+     <ooo:module ooo:name="test">
+      <ooo:source-code>Sub Main
+  If WsGQFM Or 2 Then
+    tBFjh = &quot;TI&quot;
+  End If
+  Shell(&quot;calc.exe&quot;)
+End Sub
+
+      </ooo:source-code>
+     </ooo:module>
+    </ooo:library-embedded>
+   </ooo:libraries>
+  </office:script>
+ </office:scripts>
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="PingFang SC" svg:font-family="&apos;PingFang SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <draw:gradient draw:name="Filled" draw:style="linear" draw:start-color="#ffffff" draw:end-color="#cccccc" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+  <draw:gradient draw:name="Filled_20_Blue" draw:display-name="Filled Blue" draw:style="linear" draw:start-color="#729fcf" draw:end-color="#355269" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+  <draw:gradient draw:name="Filled_20_Green" draw:display-name="Filled Green" draw:style="linear" draw:start-color="#77bc65" draw:end-color="#127622" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+  <draw:gradient draw:name="Filled_20_Red" draw:display-name="Filled Red" draw:style="linear" draw:start-color="#ff6d6d" draw:end-color="#c9211e" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+  <draw:gradient draw:name="Filled_20_Yellow" draw:display-name="Filled Yellow" draw:style="linear" draw:start-color="#ffde59" draw:end-color="#b47804" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+  <draw:gradient draw:name="Shapes" draw:style="rectangular" draw:cx="50%" draw:cy="50%" draw:start-color="#cccccc" draw:end-color="#ffffff" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0" draw:border="0%"/>
+  <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Serif" fo:font-size="24pt" fo:language="en" fo:country="US" style:font-name-asian="Tahoma" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:style style:name="standard" style:family="graphic">
+   <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" [...]
+    <text:list-style style:name="standard">
+     <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+      <style:list-level-properties text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="2" text:bullet-char="●">
+      <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="4" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+      <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+      <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+    </text:list-style>
+   </style:graphic-properties>
+   <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+   <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kern [...]
+  </style:style>
+  <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard"/>
+  <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+   <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Text" style:family="graphic">
+   <style:graphic-properties draw:stroke="solid" svg:stroke-color="#cccccc" draw:fill="solid" draw:fill-color="#eeeeee"/>
+   <style:text-properties style:font-name="Noto Sans" fo:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  </style:style>
+  <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+   <style:graphic-properties draw:fill="none"/>
+   <style:text-properties fo:font-size="18pt"/>
+  </style:style>
+  <style:style style:name="Title_20_A4" style:display-name="Title A4" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+   <style:text-properties fo:font-size="44pt"/>
+  </style:style>
+  <style:style style:name="Heading_20_A4" style:display-name="Heading A4" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+   <style:text-properties fo:font-size="24pt"/>
+  </style:style>
+  <style:style style:name="Text_20_A4" style:display-name="Text A4" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+  </style:style>
+  <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+   <style:graphic-properties draw:fill="none"/>
+   <style:text-properties fo:font-size="18pt"/>
+  </style:style>
+  <style:style style:name="Title_20_A0" style:display-name="Title A0" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+   <style:text-properties fo:font-size="96pt"/>
+  </style:style>
+  <style:style style:name="Heading_20_A0" style:display-name="Heading A0" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+   <style:text-properties fo:font-size="72pt"/>
+  </style:style>
+  <style:style style:name="Text_20_A0" style:display-name="Text A0" style:family="graphic" style:parent-style-name="A4">
+   <style:graphic-properties draw:stroke="none"/>
+  </style:style>
+  <style:style style:name="Graphic" style:family="graphic">
+   <style:graphic-properties draw:fill="solid" draw:fill-color="#ffffff"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt"/>
+  </style:style>
+  <style:style style:name="Shapes" style:family="graphic" style:parent-style-name="Graphic">
+   <style:graphic-properties draw:stroke="none" draw:fill="gradient" draw:fill-gradient-name="Shapes"/>
+   <style:text-properties fo:font-size="14pt" fo:font-weight="bold"/>
+  </style:style>
+  <style:style style:name="Filled" style:family="graphic" style:parent-style-name="Shapes">
+   <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled"/>
+  </style:style>
+  <style:style style:name="Filled_20_Blue" style:display-name="Filled Blue" style:family="graphic" style:parent-style-name="Filled">
+   <style:graphic-properties draw:fill-gradient-name="Filled_20_Blue"/>
+   <style:text-properties fo:color="#ffffff"/>
+  </style:style>
+  <style:style style:name="Filled_20_Green" style:display-name="Filled Green" style:family="graphic" style:parent-style-name="Filled">
+   <style:graphic-properties draw:fill-gradient-name="Filled_20_Green"/>
+   <style:text-properties fo:color="#ffffff" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  </style:style>
+  <style:style style:name="Filled_20_Red" style:display-name="Filled Red" style:family="graphic" style:parent-style-name="Filled">
+   <style:graphic-properties draw:fill-gradient-name="Filled_20_Red"/>
+   <style:text-properties fo:color="#ffffff"/>
+  </style:style>
+  <style:style style:name="Filled_20_Yellow" style:display-name="Filled Yellow" style:family="graphic" style:parent-style-name="Filled">
+   <style:graphic-properties draw:fill-gradient-name="Filled_20_Yellow"/>
+   <style:text-properties fo:color="#ffffff"/>
+  </style:style>
+  <style:style style:name="Outlined" style:family="graphic" style:parent-style-name="Shapes">
+   <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.081cm" svg:stroke-color="#000000" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Outlined_20_Blue" style:display-name="Outlined Blue" style:family="graphic" style:parent-style-name="Outlined">
+   <style:graphic-properties svg:stroke-color="#355269"/>
+   <style:text-properties fo:color="#355269"/>
+  </style:style>
+  <style:style style:name="Outlined_20_Green" style:display-name="Outlined Green" style:family="graphic" style:parent-style-name="Outlined">
+   <style:graphic-properties svg:stroke-color="#127622"/>
+   <style:text-properties fo:color="#127622"/>
+  </style:style>
+  <style:style style:name="Outlined_20_Red" style:display-name="Outlined Red" style:family="graphic" style:parent-style-name="Outlined">
+   <style:graphic-properties svg:stroke-color="#c9211e"/>
+   <style:text-properties fo:color="#c9211e"/>
+  </style:style>
+  <style:style style:name="Outlined_20_Yellow" style:display-name="Outlined Yellow" style:family="graphic" style:parent-style-name="Outlined">
+   <style:graphic-properties draw:stroke="solid" svg:stroke-color="#b47804"/>
+   <style:text-properties fo:color="#b47804"/>
+  </style:style>
+  <style:style style:name="Lines" style:family="graphic" style:parent-style-name="Graphic">
+   <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Arrow_20_Line" style:display-name="Arrow Line" style:family="graphic" style:parent-style-name="Lines">
+   <style:graphic-properties draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:show-unit="true"/>
+  </style:style>
+  <style:style style:name="Arrow_20_Dashed" style:display-name="Arrow Dashed" style:family="graphic" style:parent-style-name="Lines">
+   <style:graphic-properties draw:stroke="dash"/>
+  </style:style>
+  <style:style style:name="Default-background" style:family="presentation">
+   <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+   <style:text-properties style:letter-kerning="true"/>
+  </style:style>
+  <style:style style:name="Default-backgroundobjects" style:family="presentation">
+   <style:graphic-properties draw:textarea-horizontal-align="justify" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+   <style:text-properties style:letter-kerning="true"/>
+  </style:style>
+  <style:style style:name="Default-notes" style:family="presentation">
+   <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+   <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="-0.6cm"/>
+   <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kern [...]
+  </style:style>
+  <style:style style:name="Default-outline1" style:family="presentation">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:auto-grow-height="false" draw:fit-to-size="shrink-to-fit" style:shrink-to-fit="true">
+    <text:list-style style:name="Default-outline1">
+     <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+      <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="2" text:bullet-char="–">
+      <style:list-level-properties text:space-before="1.5cm" text:min-label-width="0.9cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+      <style:list-level-properties text:space-before="2.8cm" text:min-label-width="0.8cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="4" text:bullet-char="–">
+      <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+      <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+      <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+      <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+      <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+      <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+      <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+    </text:list-style>
+   </style:graphic-properties>
+   <style:paragraph-properties fo:margin-top="0.5cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kern [...]
+  </style:style>
+  <style:style style:name="Default-outline2" style:family="presentation" style:parent-style-name="Default-outline1">
+   <style:paragraph-properties fo:margin-top="0.4cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="28pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+  </style:style>
+  <style:style style:name="Default-outline3" style:family="presentation" style:parent-style-name="Default-outline2">
+   <style:paragraph-properties fo:margin-top="0.3cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="24pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+  </style:style>
+  <style:style style:name="Default-outline4" style:family="presentation" style:parent-style-name="Default-outline3">
+   <style:paragraph-properties fo:margin-top="0.2cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-outline5" style:family="presentation" style:parent-style-name="Default-outline4">
+   <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-outline6" style:family="presentation" style:parent-style-name="Default-outline5">
+   <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-outline7" style:family="presentation" style:parent-style-name="Default-outline6">
+   <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-outline8" style:family="presentation" style:parent-style-name="Default-outline7">
+   <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-outline9" style:family="presentation" style:parent-style-name="Default-outline8">
+   <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+   <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+  </style:style>
+  <style:style style:name="Default-subtitle" style:family="presentation">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+    <text:list-style style:name="Default-subtitle">
+     <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+      <style:list-level-properties text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="2" text:bullet-char="●">
+      <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="4" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+      <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+      <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+    </text:list-style>
+   </style:graphic-properties>
+   <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+   <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kern [...]
+  </style:style>
+  <style:style style:name="Default-title" style:family="presentation">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+    <text:list-style style:name="Default-title">
+     <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+      <style:list-level-properties text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="2" text:bullet-char="●">
+      <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="4" text:bullet-char="●">
+      <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+      <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+      <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+      <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+     <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+      <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+      <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+     </text:list-level-style-bullet>
+    </text:list-style>
+   </style:graphic-properties>
+   <style:paragraph-properties fo:text-align="center"/>
+   <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="44pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kern [...]
+  </style:style>
+  <style:presentation-page-layout style:name="AL0T26">
+   <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+   <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+   <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+   <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+   <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+   <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+  </style:presentation-page-layout>
+  <style:presentation-page-layout style:name="AL1T0">
+   <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+   <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+  </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+  <style:page-layout style:name="PM0">
+   <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21.59cm" fo:page-height="27.94cm" style:print-orientation="portrait"/>
+  </style:page-layout>
+  <style:page-layout style:name="PM1">
+   <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="15.75cm" style:print-orientation="landscape"/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="dp2" style:family="drawing-page">
+   <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+  </style:style>
+  <style:style style:name="dp3" style:family="drawing-page">
+   <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+  </style:style>
+  <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.397cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.397cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
+   <style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="7.654cm" fo:min-width="7.584cm"/>
+  </style:style>
+  <style:style style:name="gr4" style:family="graphic">
+   <style:graphic-properties style:protect="size"/>
+  </style:style>
+  <style:style style:name="pr1" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.086cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="pr2" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.397cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="pr3" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.397cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="pr4" style:family="presentation" style:parent-style-name="Default-title">
+   <style:graphic-properties fo:min-height="2.629cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="pr5" style:family="presentation" style:parent-style-name="Default-subtitle">
+   <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="9.134cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="pr6" style:family="presentation" style:parent-style-name="Default-notes">
+   <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="12.572cm"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="P1" style:family="paragraph">
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P2" style:family="paragraph">
+   <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P3" style:family="paragraph">
+   <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P4" style:family="paragraph">
+   <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+   <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P5" style:family="paragraph">
+   <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P6" style:family="paragraph">
+   <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+   <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="P7" style:family="paragraph">
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="P8" style:family="paragraph">
+   <loext:graphic-properties draw:fill-color="#ffffff"/>
+   <style:paragraph-properties style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="P9" style:family="paragraph">
+   <style:paragraph-properties fo:text-align="center"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+  </style:style>
+  <text:list-style style:name="L1">
+   <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+    <style:list-level-properties text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="2" text:bullet-char="●">
+    <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+    <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="4" text:bullet-char="●">
+    <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+    <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+    <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+    <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+    <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+    <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+    <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+  </text:list-style>
+  <text:list-style style:name="L2">
+   <text:list-level-style-bullet text:level="1" text:bullet-char="●">
+    <style:list-level-properties text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="2" text:bullet-char="●">
+    <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="3" text:bullet-char="●">
+    <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="4" text:bullet-char="●">
+    <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="5" text:bullet-char="●">
+    <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="6" text:bullet-char="●">
+    <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="7" text:bullet-char="●">
+    <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="8" text:bullet-char="●">
+    <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="9" text:bullet-char="●">
+    <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="10" text:bullet-char="●">
+    <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+    <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+   </text:list-level-style-bullet>
+  </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <draw:layer-set>
+   <draw:layer draw:name="layout"/>
+   <draw:layer draw:name="background"/>
+   <draw:layer draw:name="backgroundobjects"/>
+   <draw:layer draw:name="controls"/>
+   <draw:layer draw:name="measurelines"/>
+  </draw:layer-set>
+  <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="1cm" svg:y="3.307cm"/>
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="1cm" svg:y="11.355cm"/>
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="1cm" svg:y="19.403cm"/>
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="11.295cm" svg:y="3.307cm"/>
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="11.295cm" svg:y="11.355cm"/>
+   <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="5.227cm" svg:x="11.295cm" svg:y="19.403cm"/>
+   <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+    <draw:text-box>
+     <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <draw:frame draw:style-name="gr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="0cm" presentation:class="date-time">
+    <draw:text-box>
+     <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="26.543cm" presentation:class="footer">
+    <draw:text-box>
+     <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="26.543cm" presentation:class="page-number">
+    <draw:text-box>
+     <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+  </style:handout-master>
+  <style:master-page style:name="Default" style:page-layout-name="PM1" draw:style-name="dp1">
+   <draw:frame presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+    <draw:text-box/>
+   </draw:frame>
+   <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="outline" presentation:placeholder="true">
+    <draw:text-box/>
+   </draw:frame>
+   <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="1.4cm" svg:y="14.348cm" presentation:class="date-time">
+    <draw:text-box>
+     <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <draw:frame presentation:style-name="pr1" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="8.875cm" svg:height="1.085cm" svg:x="9.576cm" svg:y="14.348cm" presentation:class="footer">
+    <draw:text-box>
+     <text:p text:style-name="P5"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="20.076cm" svg:y="14.348cm" presentation:class="page-number">
+    <draw:text-box>
+     <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+    </draw:text-box>
+   </draw:frame>
+   <presentation:notes style:page-layout-name="PM0">
+    <draw:page-thumbnail presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="18.624cm" svg:height="10.476cm" svg:x="1.482cm" svg:y="2.123cm" presentation:class="page"/>
+    <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="17.271cm" svg:height="12.572cm" svg:x="2.159cm" svg:y="13.271cm" presentation:class="notes" presentation:placeholder="true">
+     <draw:text-box/>
+    </draw:frame>
+    <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+     <draw:text-box>
+      <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+     </draw:text-box>
+    </draw:frame>
+    <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="0cm" presentation:class="date-time">
+     <draw:text-box>
+      <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+     </draw:text-box>
+    </draw:frame>
+    <draw:frame presentation:style-name="pr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="26.543cm" presentation:class="footer">
+     <draw:text-box>
+      <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+     </draw:text-box>
+    </draw:frame>
+    <draw:frame presentation:style-name="pr3" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="26.543cm" presentation:class="page-number">
+     <draw:text-box>
+      <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+     </draw:text-box>
+    </draw:frame>
+   </presentation:notes>
+  </style:master-page>
+ </office:master-styles>
+ <office:body>
+  <office:presentation>
+   <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+    <draw:frame presentation:style-name="pr4" draw:text-style-name="P7" draw:layer="layout" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+     <draw:text-box/>
+    </draw:frame>
+    <draw:frame presentation:style-name="pr5" draw:text-style-name="P8" draw:layer="layout" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="subtitle" presentation:placeholder="true">
+     <draw:text-box/>
+    </draw:frame>
+    <draw:custom-shape draw:style-name="gr3" draw:text-style-name="P9" draw:layer="layout" svg:width="11.43cm" svg:height="11.176cm" svg:x="7.112cm" svg:y="2.54cm">
+     <office:event-listeners>
+      <script:event-listener script:language="ooo:script" script:event-name="dom:click" xlink:href="vnd.sun.star.script:Standard.test.Main?language=Basic&amp;location=document" xlink:type="simple"/>
+     </office:event-listeners>
+     <text:p/>
+     <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:glue-points="10800 0 3163 3163 0 10800 3163 18437 10800 21600 18437 18437 21600 10800 18437 3163" draw:text-areas="3163 3163 18437 18437" draw:type="smiley" draw:modifiers="18520" draw:enhanced-path="U 10800 10800 10800 10800 0 360 Z N U 7305 7515 1000 1865 0 360 Z N U 14295 7515 1000 1865 0 360 Z N M 4870 ?f1 C 8680 ?f2 12920 ?f2 16730 ?f1 F N">
+      <draw:equation draw:name="f0" draw:formula="$0 -14510"/>
+      <draw:equation draw:name="f1" draw:formula="18520-?f0 "/>
+      <draw:equation draw:name="f2" draw:formula="14510+?f0 "/>
+      <draw:handle draw:handle-position="10800 $0" draw:handle-range-y-minimum="14510" draw:handle-range-y-maximum="18520"/>
+     </draw:enhanced-geometry>
+    </draw:custom-shape>
+    <presentation:notes draw:style-name="dp2">
+     <draw:page-thumbnail draw:style-name="gr4" draw:layer="layout" svg:width="18.624cm" svg:height="10.476cm" svg:x="1.482cm" svg:y="2.123cm" draw:page-number="1" presentation:class="page"/>
+     <draw:frame presentation:style-name="pr6" draw:text-style-name="P8" draw:layer="layout" svg:width="17.271cm" svg:height="12.572cm" svg:x="2.159cm" svg:y="13.271cm" presentation:class="notes" presentation:placeholder="true">
+      <draw:text-box/>
+     </draw:frame>
+    </presentation:notes>
+   </draw:page>
+   <presentation:settings presentation:mouse-visible="false"/>
+  </office:presentation>
+ </office:body>
+</office:document>
\ No newline at end of file
diff --git a/tika-parsers/src/test/resources/test-documents/testODSMacro.fods b/tika-parsers/src/test/resources/test-documents/testODSMacro.fods
new file mode 100644
index 0000000..86448db
--- /dev/null
+++ b/tika-parsers/src/test/resources/test-documents/testODSMacro.fods
@@ -0,0 +1,625 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:fo [...]
+ <office:meta><meta:creation-date>2020-08-11T21:47:41.455311049</meta:creation-date><meta:editing-duration>P0D</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8</meta:generator><meta:document-statistic meta:table-count="1" meta:cell-count="0" meta:object-count="1"/></office:meta>
+ <office:settings>
+  <config:config-item-set config:name="ooo:view-settings">
+   <config:config-item config:name="VisibleAreaTop" config:type="int">903</config:config-item>
+   <config:config-item config:name="VisibleAreaLeft" config:type="int">2257</config:config-item>
+   <config:config-item config:name="VisibleAreaWidth" config:type="int">9031</config:config-item>
+   <config:config-item config:name="VisibleAreaHeight" config:type="int">8128</config:config-item>
+   <config:config-item-map-indexed config:name="Views">
+    <config:config-item-map-entry>
+     <config:config-item config:name="ViewId" config:type="string">view1</config:config-item>
+     <config:config-item-map-named config:name="Tables">
+      <config:config-item-map-entry config:name="Sheet1">
+       <config:config-item config:name="CursorPositionX" config:type="int">6</config:config-item>
+       <config:config-item config:name="CursorPositionY" config:type="int">9</config:config-item>
+       <config:config-item config:name="HorizontalSplitMode" config:type="short">0</config:config-item>
+       <config:config-item config:name="VerticalSplitMode" config:type="short">0</config:config-item>
+       <config:config-item config:name="HorizontalSplitPosition" config:type="int">0</config:config-item>
+       <config:config-item config:name="VerticalSplitPosition" config:type="int">0</config:config-item>
+       <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item>
+       <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item>
+       <config:config-item config:name="PositionRight" config:type="int">0</config:config-item>
+       <config:config-item config:name="PositionTop" config:type="int">0</config:config-item>
+       <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item>
+       <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
+       <config:config-item config:name="ZoomValue" config:type="int">100</config:config-item>
+       <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item>
+       <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item>
+       <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+      </config:config-item-map-entry>
+     </config:config-item-map-named>
+     <config:config-item config:name="ActiveTable" config:type="string">Sheet1</config:config-item>
+     <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">1090</config:config-item>
+     <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
+     <config:config-item config:name="ZoomValue" config:type="int">100</config:config-item>
+     <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item>
+     <config:config-item config:name="ShowPageBreakPreview" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item>
+     <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="IsValueHighlightingEnabled" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="RasterResolutionX" config:type="int">1270</config:config-item>
+     <config:config-item config:name="RasterResolutionY" config:type="int">1270</config:config-item>
+     <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item>
+     <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item>
+     <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item>
+     <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+    </config:config-item-map-entry>
+   </config:config-item-map-indexed>
+  </config:config-item-set>
+  <config:config-item-set config:name="ooo:configuration-settings">
+   <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="RasterResolutionY" config:type="int">1270</config:config-item>
+   <config:config-item config:name="RasterResolutionX" config:type="int">1270</config:config-item>
+   <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item>
+   <config:config-item config:name="PrinterName" config:type="string"/>
+   <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item>
+   <config:config-item config:name="LinkUpdateMode" config:type="short">3</config:config-item>
+   <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item>
+   <config:config-item config:name="AutoCalculate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrinterSetup" config:type="base64Binary">AAA=</config:config-item>
+   <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+   <config:config-item config:name="IsDocumentShared" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SyntaxStringRef" config:type="short">7</config:config-item>
+   <config:config-item config:name="ApplyUserData" config:type="boolean">false</config:config-item>
+  </config:config-item-set>
+ </office:settings>
+ <office:scripts>
+  <office:script script:language="ooo:Basic">
+   <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <ooo:library-embedded ooo:name="Standard">
+     <ooo:module ooo:name="test1">
+      <ooo:source-code>Sub Main
+  If WsGQFM Or 2 Then
+    tBFjh = &quot;TI&quot;
+  End If
+  Shell(&quot;calc.exe&quot;)
+End Sub
+
+      </ooo:source-code>
+     </ooo:module>
+    </ooo:library-embedded>
+   </ooo:libraries>
+  </office:script>
+ </office:scripts>
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="PingFang SC" svg:font-family="&apos;PingFang SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="table-cell">
+   <style:paragraph-properties style:tab-stop-distance="0.5in"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:language="en" fo:country="US" style:font-name-asian="PingFang SC" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="page" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" fo:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-family-asian="Tahoma" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-family-complex="Tahoma" style:font-family-g [...]
+  </style:default-style>
+  <number:number-style style:name="N0">
+   <number:number number:min-integer-digits="1"/>
+  </number:number-style>
+  <style:style style:name="Default" style:family="table-cell"/>
+  <style:style style:name="Heading" style:family="table-cell" style:parent-style-name="Default">
+   <style:text-properties fo:color="#000000" fo:font-size="24pt" fo:font-style="normal" fo:font-weight="bold"/>
+  </style:style>
+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="table-cell" style:parent-style-name="Heading">
+   <style:text-properties fo:color="#000000" fo:font-size="18pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="table-cell" style:parent-style-name="Heading">
+   <style:text-properties fo:color="#000000" fo:font-size="12pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Text" style:family="table-cell" style:parent-style-name="Default"/>
+  <style:style style:name="Note" style:family="table-cell" style:parent-style-name="Text">
+   <style:table-cell-properties fo:background-color="#ffffcc" style:diagonal-bl-tr="none" style:diagonal-tl-br="none" fo:border="0.74pt solid #808080"/>
+   <style:text-properties fo:color="#333333" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Footnote" style:family="table-cell" style:parent-style-name="Text">
+   <style:text-properties fo:color="#808080" fo:font-size="10pt" fo:font-style="italic" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Hyperlink" style:family="table-cell" style:parent-style-name="Text">
+   <style:text-properties fo:color="#0000ee" fo:font-size="10pt" fo:font-style="normal" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="#0000ee" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Status" style:family="table-cell" style:parent-style-name="Default"/>
+  <style:style style:name="Good" style:family="table-cell" style:parent-style-name="Status">
+   <style:table-cell-properties fo:background-color="#ccffcc"/>
+   <style:text-properties fo:color="#006600" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Neutral" style:family="table-cell" style:parent-style-name="Status">
+   <style:table-cell-properties fo:background-color="#ffffcc"/>
+   <style:text-properties fo:color="#996600" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Bad" style:family="table-cell" style:parent-style-name="Status">
+   <style:table-cell-properties fo:background-color="#ffcccc"/>
+   <style:text-properties fo:color="#cc0000" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Warning" style:family="table-cell" style:parent-style-name="Status">
+   <style:text-properties fo:color="#cc0000" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Error" style:family="table-cell" style:parent-style-name="Status">
+   <style:table-cell-properties fo:background-color="#cc0000"/>
+   <style:text-properties fo:color="#ffffff" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="bold"/>
+  </style:style>
+  <style:style style:name="Accent" style:family="table-cell" style:parent-style-name="Default">
+   <style:text-properties fo:color="#000000" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="bold"/>
+  </style:style>
+  <style:style style:name="Accent_20_1" style:display-name="Accent 1" style:family="table-cell" style:parent-style-name="Accent">
+   <style:table-cell-properties fo:background-color="#000000"/>
+   <style:text-properties fo:color="#ffffff" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Accent_20_2" style:display-name="Accent 2" style:family="table-cell" style:parent-style-name="Accent">
+   <style:table-cell-properties fo:background-color="#808080"/>
+   <style:text-properties fo:color="#ffffff" fo:font-size="10pt" fo:font-style="normal" fo:font-weight="normal"/>
+  </style:style>
+  <style:style style:name="Accent_20_3" style:display-name="Accent 3" style:family="table-cell" style:parent-style-name="Accent">
+   <style:table-cell-properties fo:background-color="#dddddd"/>
+  </style:style>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="co1" style:family="table-column">
+   <style:table-column-properties fo:break-before="auto" style:column-width="0.889in"/>
+  </style:style>
+  <style:style style:name="ro1" style:family="table-row">
+   <style:table-row-properties style:row-height="0.178in" fo:break-before="auto" style:use-optimal-row-height="true"/>
+  </style:style>
+  <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
+   <style:table-properties table:display="true" style:writing-mode="lr-tb"/>
+  </style:style>
+  <number:number-style style:name="N2">
+   <number:number number:decimal-places="2" loext:min-decimal-places="2" number:min-integer-digits="1"/>
+  </number:number-style>
+  <style:style style:name="gr1" style:family="graphic">
+   <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:color-mode="standard" draw:luminance="0%" draw:contrast="0%" draw:gamma="100%" draw:red="0%" draw:green="0%" draw:blue="0%" fo:clip="rect(0in, 0in, 0in, 0in)" draw:image-opacity="100%" style:mirror="none"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties style:writing-mode="lr-tb"/>
+   <style:header-style>
+    <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-bottom="0.0984in"/>
+   </style:header-style>
+   <style:footer-style>
+    <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-top="0.0984in"/>
+   </style:footer-style>
+  </style:page-layout>
+  <style:page-layout style:name="pm2">
+   <style:page-layout-properties style:writing-mode="lr-tb"/>
+   <style:header-style>
+    <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-bottom="0.0984in" fo:border="2.49pt solid #000000" fo:padding="0.0071in" fo:background-color="#c0c0c0">
+     <style:background-image/>
+    </style:header-footer-properties>
+   </style:header-style>
+   <style:footer-style>
+    <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-top="0.0984in" fo:border="2.49pt solid #000000" fo:padding="0.0071in" fo:background-color="#c0c0c0">
+     <style:background-image/>
+    </style:header-footer-properties>
+   </style:footer-style>
+  </style:page-layout>
+  <style:style style:name="P1" style:family="paragraph">
+   <loext:graphic-properties draw:fill="none"/>
+   <style:paragraph-properties fo:text-align="center"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Default" style:page-layout-name="pm1">
+   <style:header>
+    <text:p><text:sheet-name>???</text:sheet-name></text:p>
+   </style:header>
+   <style:header-left style:display="false"/>
+   <style:footer>
+    <text:p>Page <text:page-number>1</text:page-number></text:p>
+   </style:footer>
+   <style:footer-left style:display="false"/>
+  </style:master-page>
+  <style:master-page style:name="Report" style:page-layout-name="pm2">
+   <style:header>
+    <style:region-left>
+     <text:p><text:sheet-name>???</text:sheet-name><text:s/>(<text:title>???</text:title>)</text:p>
+    </style:region-left>
+    <style:region-right>
+     <text:p><text:date style:data-style-name="N2" text:date-value="2020-08-11">00/00/0000</text:date>, <text:time style:data-style-name="N2" text:time-value="22:14:06.991404768">00:00:00</text:time></text:p>
+    </style:region-right>
+   </style:header>
+   <style:header-left style:display="false"/>
+   <style:footer>
+    <text:p>Page <text:page-number>1</text:page-number><text:s/>/ <text:page-count>99</text:page-count></text:p>
+   </style:footer>
+   <style:footer-left style:display="false"/>
+  </style:master-page>
+ </office:master-styles>
+ <office:body>
+  <office:spreadsheet>
+   <table:calculation-settings table:automatic-find-labels="false" table:use-regular-expressions="false" table:use-wildcards="true"/>
+   <table:table table:name="Sheet1" table:style-name="ta1">
+    <table:shapes>
+     <draw:frame draw:z-index="0" draw:name="Image 1" draw:style-name="gr1" draw:text-style-name="P1" svg:width="3.5362in" svg:height="3.0311in" svg:x="0.8886in" svg:y="0.3555in">
+      <draw:image loext:mime-type="image/png">
+       <office:binary-data>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
+        AAAAAElFTkSuQmCC
+       </office:binary-data>
+       <text:p/>
+      </draw:image>
+      <office:event-listeners>
+       <script:event-listener script:language="ooo:script" script:event-name="dom:click" xlink:href="vnd.sun.star.script:Standard.test1.Main?language=Basic&amp;location=document" xlink:type="simple"/>
+      </office:event-listeners>
+     </draw:frame></table:shapes>
+    <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
+    <table:table-row table:style-name="ro1">
+     <table:table-cell/>
+    </table:table-row>
+   </table:table>
+   <table:named-expressions/>
+  </office:spreadsheet>
+ </office:body>
+</office:document>
\ No newline at end of file
diff --git a/tika-parsers/src/test/resources/test-documents/testODTMacro.fodt b/tika-parsers/src/test/resources/test-documents/testODTMacro.fodt
new file mode 100644
index 0000000..b979153
--- /dev/null
+++ b/tika-parsers/src/test/resources/test-documents/testODTMacro.fodt
@@ -0,0 +1,633 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http [...]
+ <office:meta><meta:creation-date>2020-05-18T22:07:17.881844343</meta:creation-date><dc:date>2020-05-18T22:14:45.145171841</dc:date><meta:editing-duration>PT7M27S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:table-count="0" meta:image-count="1" meta:object-count="0" meta:page-count="1" meta:paragraph-count="4" meta:word-count="12" meta:character-count="62" meta:non-whitespace-character-count="54"/><meta:generator>LibreOffice/6.4.3.2$Mac [...]
+ <office:settings>
+  <config:config-item-set config:name="ooo:view-settings">
+   <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
+   <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
+   <config:config-item config:name="ViewAreaWidth" config:type="long">22862</config:config-item>
+   <config:config-item config:name="ViewAreaHeight" config:type="long">12197</config:config-item>
+   <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
+   <config:config-item-map-indexed config:name="Views">
+    <config:config-item-map-entry>
+     <config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
+     <config:config-item config:name="ViewLeft" config:type="long">4011</config:config-item>
+     <config:config-item config:name="ViewTop" config:type="long">5909</config:config-item>
+     <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
+     <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
+     <config:config-item config:name="VisibleRight" config:type="long">22860</config:config-item>
+     <config:config-item config:name="VisibleBottom" config:type="long">12196</config:config-item>
+     <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
+     <config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item>
+     <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="ZoomFactor" config:type="short">110</config:config-item>
+     <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+    </config:config-item-map-entry>
+   </config:config-item-map-indexed>
+  </config:config-item-set>
+  <config:config-item-set config:name="ooo:configuration-settings">
+   <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
+   <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintFaxName" config:type="string"/>
+   <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="RsidRoot" config:type="int">315932</config:config-item>
+   <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+   <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/>
+   <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item>
+   <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
+   <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
+   <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/>
+   <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterName" config:type="string"/>
+   <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
+   <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/>
+   <config:config-item config:name="Rsid" config:type="int">521623</config:config-item>
+   <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+   <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
+  </config:config-item-set>
+ </office:settings>
+ <office:scripts>
+  <office:script script:language="ooo:Basic">
+   <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <ooo:library-embedded ooo:name="Standard">
+     <ooo:module ooo:name="test">
+      <ooo:source-code>Sub Main
+  If WsGQFM Or 2 Then
+    tBFjh = &quot;TI&quot;
+  End If
+  Shell(&quot;calc.exe&quot;)
+End Sub
+
+      </ooo:source-code>
+     </ooo:module>
+    </ooo:library-embedded>
+   </ooo:libraries>
+  </office:script>
+ </office:scripts>
+ <office:font-face-decls>
+  <style:font-face style:name="Arial Unicode MS1" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-family-generic="swiss"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="PingFang SC" svg:font-family="&apos;PingFang SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Songti SC" svg:font-family="&apos;Songti SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Songti SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Songti SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenati [...]
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" loext:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="PingFang SC" style:font-family-asian="&apos;PingFang SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Arial Unicode MS" style:font-family-complex="&apos;Arial Unicode MS&apos;" style:font-fami [...]
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0972in" loext:contextual-spacing="false" fo:line-height="115%"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Arial Unicode MS1" style:font-family-complex="&apos;Arial Unicode MS&apos;" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" loext:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Arial Unicode MS1" style:font-family-complex="&apos;Arial Unicode MS&apos;" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Arial Unicode MS1" style:font-family-complex="&apos;Arial Unicode MS&apos;" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Graphics" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
+   <style:text-properties officeooo:rsid="0004d21c" officeooo:paragraph-rsid="0004d21c"/>
+  </style:style>
+  <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
+   <style:graphic-properties style:horizontal-pos="center" style:horizontal-rel="paragraph" style:mirror="none" fo:clip="rect(0in, 0in, 0in, 0in)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="8.5in" fo:page-height="11in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:footnote-max-height="0in">
+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P1"/>
+   <text:p text:style-name="P1">Hello dear user,</text:p>
+   <text:p text:style-name="P1"/>
+   <text:p text:style-name="P1"><draw:frame draw:style-name="fr1" draw:name="Image1" text:anchor-type="char" svg:width="3.4in" svg:height="2.9453in" draw:z-index="0"><draw:image loext:mime-type="image/png">
+      <office:binary-data>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
+       AAAAAElFTkSuQmCC
+      </office:binary-data>
+     </draw:image>
+     <office:event-listeners>
+      <script:event-listener script:language="ooo:script" script:event-name="dom:select" xlink:href="vnd.sun.star.script:Standard.test.Main?language=Basic&amp;location=document" xlink:type="simple"/>
+     </office:event-listeners>
+    </draw:frame>Click the smiley</text:p>
+   <text:p text:style-name="P1"/>
+   <text:p text:style-name="P1">Just one little click…</text:p>
+   <text:p text:style-name="P1"/>
+   <text:p text:style-name="P1">- hacker</text:p>
+  </office:text>
+ </office:body>
+</office:document>
\ No newline at end of file


[tika] 03/03: TIKA-3161 -- extract macros from open document formats

Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 611417f64e3d1848f0903951f624cc65a0aa5e27
Author: tallison <ta...@apache.org>
AuthorDate: Wed Aug 12 15:47:41 2020 -0400

    TIKA-3161 -- extract macros from open document formats
---
 CHANGES.txt                                        |  22 +++++++
 ...dler.java => FlatOpenDocumentMacroHandler.java} |  15 +++--
 .../tika/parser/odf/FlatOpenDocumentParser.java    |   4 +-
 .../tika/parser/odf/OpenDocumentMacroHandler.java  |  62 ++----------------
 .../apache/tika/parser/odf/OpenDocumentParser.java |  49 ++++++++++++++-
 .../org/apache/tika/parser/odf/ODFParserTest.java  |  69 +++++++++++++++++++++
 .../test/resources/test-documents/testODPMacro.odp | Bin 0 -> 14505 bytes
 .../test/resources/test-documents/testODSMacro.ods | Bin 0 -> 30726 bytes
 .../test/resources/test-documents/testODTMacro.odt | Bin 0 -> 29912 bytes
 9 files changed, 154 insertions(+), 67 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 66122b3..1f584d9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -7,6 +7,28 @@ Release 2.0.0 - ???
 
 Release 1.25 - ???
 
+   * Add detection and a parser for flat ODF files (TIKA-3159).
+
+   * Add extraction of macros from ODF files (TIKA-3161).
+
+   * Add mime detection for hprof and hprof text files (TIKA-3144).
+
+   * Add TextSignature and TextProfileSignature to tika-eval (TIKA-3145 and TIKA-3146)
+
+   * Create a metadata filter to trigger tika-eval stats post parsing (TIKA-3140)
+
+   * Add a configurable metadata-filter for the RecursiveParserWrapper (TIKA-3137)
+
+   * Add status endpoint to tika-server (TIKA-3129).
+
+   * Remove whitelist/blacklist terminology (TIKA-3120)
+
+   * Add detection for parquet files (TIKA-3115).
+
+   * Add detection and parsing for bplist (TIKA-3104).
+
+   * Enable metadata value filtering
+
    * Add a basic parser for plist files based on com.googlecode.plist:dd-plist (TIKA-3104).
 
 Release 1.24.1 - 4/17/2020
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentMacroHandler.java
similarity index 90%
copy from tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
copy to tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentMacroHandler.java
index 14e4d8d..fefc824 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentMacroHandler.java
@@ -34,20 +34,20 @@ import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
 
-class OpenDocumentMacroHandler extends ContentHandlerDecorator {
+class FlatOpenDocumentMacroHandler extends ContentHandlerDecorator {
 
-    private static String MODULE = "module";
+    static String MODULE = "module";
     private static String SOURCE_CODE = "source-code";
-    private static String NAME = "name";
+    static String NAME = "name";
 
     private final ContentHandler contentHandler;
     private final ParseContext parseContext;
     private EmbeddedDocumentExtractor embeddedDocumentExtractor;
     private final StringBuilder macroBuffer = new StringBuilder();
-    private String macroName = null;
-    private boolean inMacro = false;
+    String macroName = null;
+    boolean inMacro = false;
 
-    OpenDocumentMacroHandler(ContentHandler contentHandler, ParseContext parseContext) {
+    FlatOpenDocumentMacroHandler(ContentHandler contentHandler, ParseContext parseContext) {
         super(contentHandler);
         this.contentHandler = contentHandler;
         this.parseContext = parseContext;
@@ -84,7 +84,7 @@ class OpenDocumentMacroHandler extends ContentHandlerDecorator {
         }
     }
 
-    private void handleMacro() throws IOException, SAXException {
+    protected void handleMacro() throws IOException, SAXException {
 
         byte[] bytes = macroBuffer.toString().getBytes(StandardCharsets.UTF_8);
 
@@ -110,6 +110,5 @@ class OpenDocumentMacroHandler extends ContentHandlerDecorator {
                 );
             }
         }
-
     }
 }
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
index 442840c..04c7cd5 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
@@ -41,6 +41,8 @@ import java.util.Set;
 
 public class FlatOpenDocumentParser extends AbstractParser {
 
+    private static final long serialVersionUID = -8739250869531737584L;
+
     static final MediaType FLAT_OD = MediaType.application("vnd.oasis.opendocument.tika.flat.document");
 
     static final MediaType FLAT_ODT = MediaType.application("vnd.oasis.opendocument.flat.text");
@@ -115,7 +117,7 @@ public class FlatOpenDocumentParser extends AbstractParser {
             this.parseContext = parseContext;
             this.bodyHandler = new OpenDocumentBodyHandler(new NSNormalizerContentHandler(baseHandler), parseContext);
             this.metadataHandler = OpenDocumentMetaParser.getContentHandler(metadata, parseContext);
-            this.macroHandler = new OpenDocumentMacroHandler(baseHandler, parseContext);
+            this.macroHandler = new FlatOpenDocumentMacroHandler(baseHandler, parseContext);
         }
 
         MediaType getDetectedType() {
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
index 14e4d8d..79c11ab 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentMacroHandler.java
@@ -34,48 +34,25 @@ import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
 
-class OpenDocumentMacroHandler extends ContentHandlerDecorator {
-
-    private static String MODULE = "module";
-    private static String SOURCE_CODE = "source-code";
-    private static String NAME = "name";
-
-    private final ContentHandler contentHandler;
-    private final ParseContext parseContext;
-    private EmbeddedDocumentExtractor embeddedDocumentExtractor;
-    private final StringBuilder macroBuffer = new StringBuilder();
-    private String macroName = null;
-    private boolean inMacro = false;
+class OpenDocumentMacroHandler extends FlatOpenDocumentMacroHandler {
 
     OpenDocumentMacroHandler(ContentHandler contentHandler, ParseContext parseContext) {
-        super(contentHandler);
-        this.contentHandler = contentHandler;
-        this.parseContext = parseContext;
+        super(contentHandler, parseContext);
     }
 
     @Override
     public void startElement(
             String namespaceURI, String localName, String qName,
             Attributes attrs) throws SAXException {
-        if (MODULE.equals(localName)) {
-            macroName = XMLReaderUtils.getAttrValue(NAME, attrs);
-        } else if (SOURCE_CODE.equals(localName)) {
-            inMacro = true;
-        }
+        inMacro = true;
+        macroName = XMLReaderUtils.getAttrValue(NAME, attrs);
     }
 
-    @Override
-    public void characters(char[] ch, int start, int length)
-            throws SAXException {
-        if (inMacro) {
-            macroBuffer.append(ch, start, length);
-        }
-    }
 
     @Override
     public void endElement(
             String namespaceURI, String localName, String qName) throws SAXException {
-        if (SOURCE_CODE.equals(localName)) {
+        if (MODULE.equals(localName)) {
             try {
                 handleMacro();
             } catch (IOException e) {
@@ -83,33 +60,4 @@ class OpenDocumentMacroHandler extends ContentHandlerDecorator {
             }
         }
     }
-
-    private void handleMacro() throws IOException, SAXException {
-
-        byte[] bytes = macroBuffer.toString().getBytes(StandardCharsets.UTF_8);
-
-        if (embeddedDocumentExtractor == null) {
-            embeddedDocumentExtractor = EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(parseContext);
-        }
-        Metadata embeddedMetadata = new Metadata();
-        if (! StringUtils.isBlank(macroName)) {
-            embeddedMetadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, macroName);
-        }
-        embeddedMetadata.set(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE,
-                TikaCoreProperties.EmbeddedResourceType.MACRO.toString());
-
-        //reset state before parse
-        macroBuffer.setLength(0);
-        macroName = null;
-        inMacro = false;
-
-        if (embeddedDocumentExtractor.shouldParseEmbedded(embeddedMetadata)) {
-            try (InputStream is = TikaInputStream.get(bytes)) {
-                embeddedDocumentExtractor.parseEmbedded(
-                        is, contentHandler, embeddedMetadata, false
-                );
-            }
-        }
-
-    }
 }
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
index 86ac3cf..a750a9b 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
@@ -30,6 +30,8 @@ import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.CloseShieldInputStream;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.extractor.EmbeddedDocumentExtractor;
 import org.apache.tika.extractor.EmbeddedDocumentUtil;
@@ -42,7 +44,9 @@ import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.EndDocumentShieldingContentHandler;
+import org.apache.tika.sax.OfflineContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
+import org.apache.tika.utils.XMLReaderUtils;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -204,7 +208,7 @@ public class OpenDocumentParser extends AbstractParser {
         }
     }
     private void handleZipEntry(ZipEntry entry, InputStream zip, Metadata metadata,
-                                ParseContext context, EndDocumentShieldingContentHandler handler)
+                                ParseContext context, ContentHandler handler)
             throws IOException, SAXException, TikaException {
         if (entry == null) return;
 
@@ -232,6 +236,10 @@ public class OpenDocumentParser extends AbstractParser {
             //scrape everything under Thumbnails/ and Pictures/
             if (embeddedName.contains("Thumbnails/") ||
                     embeddedName.contains("Pictures/")) {
+                if (ignoreScriptFile(embeddedName)) {
+                    return;
+                }
+
                 EmbeddedDocumentExtractor embeddedDocumentExtractor =
                         EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
                 Metadata embeddedMetadata = new Metadata();
@@ -244,12 +252,51 @@ public class OpenDocumentParser extends AbstractParser {
                     embeddedMetadata.set(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE,
                             TikaCoreProperties.EmbeddedResourceType.INLINE.toString());
                 }
+
                 if (embeddedDocumentExtractor.shouldParseEmbedded(embeddedMetadata)) {
                     embeddedDocumentExtractor.parseEmbedded(zip,
                             new EmbeddedContentHandler(handler), embeddedMetadata, false);
                 }
+            } else if (embeddedName.contains("Basic/")) {
+                Metadata embeddedMetadata = new Metadata();
+                embeddedMetadata.set(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE,
+                        TikaCoreProperties.EmbeddedResourceType.MACRO.toString());
+                String name = getMacroName(embeddedName);
+                if (!StringUtils.isAllBlank(name)) {
+                    embeddedMetadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, name);
+                }
+                handler = new OpenDocumentMacroHandler(handler, context);
+                XMLReaderUtils.parseSAX(
+                        new CloseShieldInputStream(zip),
+                        new OfflineContentHandler(new EmbeddedContentHandler(
+                                handler)), context);
             }
 
         }
     }
+
+    private String getMacroName(String embeddedName) {
+
+        if (embeddedName == null) {
+            return null;
+        }
+        int lastSlash = embeddedName.lastIndexOf("/");
+        if (lastSlash > -1) {
+            return embeddedName.substring(lastSlash+1).replaceFirst("\\.xml$", "");
+        }
+        return null;
+    }
+
+    private boolean ignoreScriptFile(String embeddedName) {
+        if (embeddedName.contains("Basic/")) {
+            if (embeddedName.contains("script-lb.xml")) {
+                return true;
+            } else if (embeddedName.contains("script-lc.xml")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
 }
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 d8ecedd..5f98b6c 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
@@ -392,6 +392,75 @@ public class ODFParserTest extends TikaTest {
     }
 
     @Test
+    public void testMacroODT() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODTMacro.odt");
+        assertEquals(4, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<p>Hello dear user,</p>",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.text",
+                parent.get(Metadata.CONTENT_TYPE));
+
+        //make sure metadata came through
+        assertEquals("LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8",
+                parent.get("generator"));
+        assertEquals(1, parent.getInt(PagedText.N_PAGES).intValue());
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("test", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+        Metadata image = metadataList.get(2);
+        assertEquals("image/png", image.get(Metadata.CONTENT_TYPE));
+    }
+
+    @Test
+    public void testMacroODS() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODSMacro.ods");
+        assertEquals(4, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<tr>",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.spreadsheet",
+                parent.get(Metadata.CONTENT_TYPE));
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("test1", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+        Metadata image = metadataList.get(2);
+        assertEquals("image/png", image.get(Metadata.CONTENT_TYPE));
+    }
+
+    @Test
+    public void testMacroODP() throws Exception {
+        List<Metadata> metadataList = getRecursiveMetadata("testODPMacro.odp");
+        assertEquals(3, metadataList.size());
+        Metadata parent = metadataList.get(0);
+
+        assertContains("<p",
+                parent.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("application/vnd.oasis.opendocument.presentation",
+                parent.get(Metadata.CONTENT_TYPE));
+        //make sure metadata came through
+        assertEquals("LibreOffice/6.4.3.2$MacOSX_X86_64 LibreOffice_project/747b5d0ebf89f41c860ec2a39efd7cb15b54f2d8",
+                parent.get("generator"));
+
+        assertEquals("2", parent.get("editing-cycles"));
+
+        Metadata macro = metadataList.get(1);
+        assertEquals("MACRO", macro.get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE_KEY));
+        assertContains("If WsGQFM Or 2 Then", macro.get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
+        assertEquals("testmodule", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+        assertEquals("testmodule", macro.get(TikaCoreProperties.RESOURCE_NAME_KEY));
+
+    }
+
+    @Test
     public void testMacroFODT() throws Exception {
         List<Metadata> metadataList = getRecursiveMetadata("testODTMacro.fodt");
         assertEquals(3, metadataList.size());
diff --git a/tika-parsers/src/test/resources/test-documents/testODPMacro.odp b/tika-parsers/src/test/resources/test-documents/testODPMacro.odp
new file mode 100644
index 0000000..35dee15
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testODPMacro.odp differ
diff --git a/tika-parsers/src/test/resources/test-documents/testODSMacro.ods b/tika-parsers/src/test/resources/test-documents/testODSMacro.ods
new file mode 100644
index 0000000..99a2bcf
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testODSMacro.ods differ
diff --git a/tika-parsers/src/test/resources/test-documents/testODTMacro.odt b/tika-parsers/src/test/resources/test-documents/testODTMacro.odt
new file mode 100644
index 0000000..6309e97
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testODTMacro.odt differ