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;
}
}