public void startElement()

in tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/PagesContentHandler.java [69:179]


    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        if (parseProperty) {
            String value = parsePrimitiveElementValue(qName, attributes);
            if (value != null) {
                Object metaDataKey = resolveMetaDataKey(metaDataLocalName);
                if (metaDataKey instanceof Property) {
                    metadata.set((Property) metaDataKey, value);
                } else {
                    metadata.add((String) metaDataKey, value);
                }
            }
        }

        if ("sl:publication-info".equals(qName)) {
            inPart = DocumentPart.METADATA;
        } else if ("sf:metadata".equals(qName)) {
            inPart = DocumentPart.METADATA;
        } else if ("sf:page-start".equals(qName) || "sl:page-group".equals(qName)) {
            if (pageCount > 0) {
                doFooter();
                xhtml.endElement("div");
            }
            xhtml.startElement("div");
            if ("sl:page-group".equals(qName)) {
                slPageCount++;
            } else {
                pageCount++;
            }
            doHeader();
        } else if ("sf:p".equals(qName)) {
            if (pageCount + slPageCount > 0) {
                inPart = DocumentPart.PARSABLE_TEXT;
                xhtml.startElement("p");
            }
        } else if ("sf:attachment".equals(qName)) {
            String kind = attributes.getValue("sf:kind");
            if ("tabular-attachment".equals(kind)) {
                activeTableId = attributes.getValue("sfa:ID");
                tableData.put(activeTableId, new ArrayList<>());
            }
        } else if ("sf:attachment-ref".equals(qName)) {
            String idRef = attributes.getValue("sfa:IDREF");
            outputTable(idRef);
        } else if ("sf:headers".equals(qName)) {
            headers = new HeaderFooter(qName);
            inPart = DocumentPart.HEADERS;
        } else if ("sf:footers".equals(qName)) {
            footers = new HeaderFooter(qName);
            inPart = DocumentPart.FOOTERS;
        } else if ("sf:header".equals(qName)) {
            inPart = headers.identifyPart(attributes.getValue("sf:name"));
        } else if ("sf:footer".equals(qName)) {
            inPart = footers.identifyPart(attributes.getValue("sf:name"));
        } else if ("sf:page-number".equals(qName)) {
            if (inPart == DocumentPart.FOOTER_ODD || inPart == DocumentPart.FOOTER_FIRST ||
                    inPart == DocumentPart.FOOTER_EVEN) {
                // We are in a footer
                footers.hasAutoPageNumber = true;
                footers.autoPageNumberFormat = attributes.getValue("sf:format");
            } else {
                headers.hasAutoPageNumber = true;
                headers.autoPageNumberFormat = attributes.getValue("sf:format");
            }

            xhtml.characters(Integer.toString(this.pageCount));
        } else if ("sf:footnotes".equals(qName)) {
            footnotes = new Footnotes();
            inPart = DocumentPart.FOOTNOTES;
        } else if ("sf:footnote-mark".equals(qName)) {
            footnotes.recordMark(attributes.getValue("sf:mark"));
        } else if ("sf:footnote".equals(qName) && inPart == DocumentPart.PARSABLE_TEXT) {
            // What about non auto-numbered?
            String footnoteMark = attributes.getValue("sf:autonumber");
            if (footnotes != null) {
                String footnoteText = footnotes.footnotes.get(footnoteMark);
                if (footnoteText != null) {
                    xhtml.startElement("div", "style", "footnote");
                    xhtml.characters("Footnote:"); // As shown in Pages
                    xhtml.characters(footnoteText);
                    xhtml.endElement("div");
                }
            }
        } else if ("sf:annotations".equals(qName)) {
            annotations = new Annotations();
            inPart = DocumentPart.ANNOTATIONS;
        } else if ("sf:annotation".equals(qName) && inPart == DocumentPart.ANNOTATIONS) {
            annotations.start(attributes.getValue("sf:target"));
        } else if ("sf:annotation-field".equals(qName) && inPart == DocumentPart.PARSABLE_TEXT) {
            xhtml.startElement("div", "style", "annotated");

            String annotationText = annotations.annotations.get(attributes.getValue("sfa:ID"));
            if (annotationText != null) {
                xhtml.startElement("div", "style", "annotation");
                xhtml.characters(annotationText);
                xhtml.endElement("div");
            }
        } else if ("sf:ghost-text".equals(qName)) {
            ghostText = true;
        }

        if (activeTableId != null) {
            parseTableData(qName, attributes);
        }

        if (inPart == DocumentPart.METADATA) {
            metaDataLocalName = localName;
            metaDataQName = qName;
            parseProperty = true;
        }
    }