Subject: [PATCH 07/20] Handle structure tree only in new format --- .../fop/accessibility/StructureTreeBuilder.java | 58 ++++++++++---------- src/java/org/apache/fop/apps/Fop.java | 7 +-- src/java/org/apache/fop/area/AreaTreeParser.java | 4 +- .../org/apache/fop/fo/flow/AbstractGraphics.java | 2 +- .../fop/fo/flow/AbstractPageNumberCitation.java | 2 +- src/java/org/apache/fop/fo/flow/Block.java | 2 +- src/java/org/apache/fop/fo/flow/Character.java | 2 +- src/java/org/apache/fop/fo/flow/Inline.java | 2 +- src/java/org/apache/fop/fo/flow/PageNumber.java | 2 +- .../org/apache/fop/fo/flow/table/TableFObj.java | 2 +- .../apache/fop/render/intermediate/IFParser.java | 8 ++- .../apache/fop/render/intermediate/IFRenderer.java | 2 + .../fop/render/intermediate/IFSerializer.java | 31 ++++++----- .../org/apache/fop/render/pdf/FOToPDFRoleMap.java | 16 +++--- .../apache/fop/render/pdf/PDFDocumentHandler.java | 14 ++---- .../fop/render/pdf/PDFLogicalStructureHandler.java | 38 ++++++-------- .../org/apache/fop/render/xml/XMLRenderer.java | 20 +++----- 17 files changed, 97 insertions(+), 115 deletions(-) diff --git a/src/java/org/apache/fop/accessibility/StructureTreeBuilder.java b/src/java/org/apache/fop/accessibility/StructureTreeBuilder.java index 80a7874..b4cb804 100644 --- a/src/java/org/apache/fop/accessibility/StructureTreeBuilder.java +++ b/src/java/org/apache/fop/accessibility/StructureTreeBuilder.java @@ -19,25 +19,20 @@ package org.apache.fop.accessibility; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.sax.SAXTransformerFactory; -import javax.xml.transform.sax.TransformerHandler; +import java.util.Stack; +import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; - -import org.apache.fop.util.DelegatingContentHandler; +import org.xml.sax.helpers.DefaultHandler; /** * Helper class that re-builds a structure tree from what is stored in an - * intermediate XML file (IF XML or Area Tree XML). + * intermediate XML file (IF XML or Area Tree XML). */ public final class StructureTreeBuilder { - private final SAXTransformerFactory factory; - - private final StructureTree structureTree = new StructureTree(); + private StructureElement structureTree; /** * Creates a new instance. @@ -45,8 +40,7 @@ public final class StructureTreeBuilder { * @param factory a factory internally used to build the structures of page * sequences */ - public StructureTreeBuilder(SAXTransformerFactory factory) { - this.factory = factory; + public StructureTreeBuilder() { } /** @@ -54,7 +48,7 @@ public final class StructureTreeBuilder { * * @return the structure tree built by this object */ - public StructureTree getStructureTree() { + public StructureElement getStructureTree() { return structureTree; } @@ -67,29 +61,33 @@ public final class StructureTreeBuilder { * @throws SAXException if there is an error when creating the handler */ public ContentHandler getHandlerForNextPageSequence() throws SAXException { - TransformerHandler structureTreeBuilder; - try { - structureTreeBuilder = factory.newTransformerHandler(); - } catch (TransformerConfigurationException e) { - throw new SAXException(e); - } - final DOMResult domResult = new DOMResult(); - structureTreeBuilder.setResult(domResult); - return new DelegatingContentHandler(structureTreeBuilder) { + final Stack stack = new Stack(); + stack.push (new StructureElement("root")); + return new DefaultHandler() { + + /** {@inheritDoc} */ + public void startElement(String namespaceURI, String localName, String rawName, + Attributes attlist) throws SAXException { + StructureElement e = new StructureElement(localName); + StructureElement parent = (StructureElement)stack.peek(); + parent.addChild(e); + stack.push(e); + e.setPtr(attlist.getValue("foi:ptr")); + e.setRole(attlist.getValue("fo:role")); + e.setAltText(attlist.getValue("fox:alt-text")); + } - public void characters(char[] ch, int start, int length) throws SAXException { - /* - * There's no text node in the structure tree. This is just - * whitespace => ignore - */ + /** {@inheritDoc} */ + public void endElement(String uri, String localName, String rawName) + throws SAXException { + stack.pop(); } + public void endDocument() throws SAXException { super.endDocument(); - structureTree.addPageSequenceStructure(domResult.getNode().getFirstChild() - .getChildNodes()); + structureTree = ((StructureElement)stack.pop()).getChild(0).getChild(0); } }; } - } diff --git a/src/java/org/apache/fop/apps/Fop.java b/src/java/org/apache/fop/apps/Fop.java index 3339375..92c4f43 100644 --- a/src/java/org/apache/fop/apps/Fop.java +++ b/src/java/org/apache/fop/apps/Fop.java @@ -24,7 +24,6 @@ import java.io.OutputStream; import org.xml.sax.helpers.DefaultHandler; -import org.apache.fop.accessibility.Accessibility; import org.apache.fop.fo.FOTreeBuilder; /** @@ -111,11 +110,7 @@ public class Fop { if (foTreeBuilder == null) { createDefaultHandler(); } - if (this.foUserAgent.isAccessibilityEnabled()) { - return Accessibility.decorateDefaultHandler(this.foTreeBuilder, foUserAgent); - } else { - return this.foTreeBuilder; - } + return this.foTreeBuilder; } /** diff --git a/src/java/org/apache/fop/area/AreaTreeParser.java b/src/java/org/apache/fop/area/AreaTreeParser.java index 996e8f8..c56172f 100644 --- a/src/java/org/apache/fop/area/AreaTreeParser.java +++ b/src/java/org/apache/fop/area/AreaTreeParser.java @@ -184,6 +184,7 @@ public class AreaTreeParser { super.endDocument(); startAreaTreeElement("pageSequence", pageSequenceAttributes); pageSequenceAttributes = null; + ((PageSequence)areaStack.peek()).setStructureTree(structureTreeBuilder.getStructureTree()); } } @@ -225,8 +226,7 @@ public class AreaTreeParser { makers.put("destination", new DestinationMaker()); if (userAgent.isAccessibilityEnabled()) { - structureTreeBuilder = new StructureTreeBuilder(tFactory); - userAgent.setStructureTree(structureTreeBuilder.getStructureTree()); + structureTreeBuilder = new StructureTreeBuilder(); } } diff --git a/src/java/org/apache/fop/fo/flow/AbstractGraphics.java b/src/java/org/apache/fop/fo/flow/AbstractGraphics.java index ba7cf67..7fe3031 100644 --- a/src/java/org/apache/fop/fo/flow/AbstractGraphics.java +++ b/src/java/org/apache/fop/fo/flow/AbstractGraphics.java @@ -100,8 +100,8 @@ public abstract class AbstractGraphics extends FObj dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum(); height = pList.get(PR_HEIGHT).getLength(); id = pList.get(PR_ID).getString(); - ptr = pList.get(PR_X_PTR).getString(); // used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); inlineProgressionDimension = pList.get(PR_INLINE_PROGRESSION_DIMENSION).getLengthRange(); keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep(); keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep(); diff --git a/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java b/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java index 78b6ccd..e98f060 100644 --- a/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java +++ b/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java @@ -101,8 +101,8 @@ public abstract class AbstractPageNumberCitation extends FObj dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum(); // letterSpacing = pList.get(PR_LETTER_SPACING); lineHeight = pList.get(PR_LINE_HEIGHT).getSpace(); - ptr = pList.get(PR_X_PTR).getString(); // used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); refId = pList.get(PR_REF_ID).getString(); textDecoration = pList.getTextDecorationProps(); // textShadow = pList.get(PR_TEXT_SHADOW); diff --git a/src/java/org/apache/fop/fo/flow/Block.java b/src/java/org/apache/fop/fo/flow/Block.java index 39e870e..dfc22a2 100644 --- a/src/java/org/apache/fop/fo/flow/Block.java +++ b/src/java/org/apache/fop/fo/flow/Block.java @@ -127,8 +127,8 @@ public class Block extends FObjMixed implements BreakPropertySet, StructurePoint lineHeightShiftAdjustment = pList.get(PR_LINE_HEIGHT_SHIFT_ADJUSTMENT).getEnum(); lineStackingStrategy = pList.get(PR_LINE_STACKING_STRATEGY).getEnum(); orphans = pList.get(PR_ORPHANS).getNumeric(); - ptr = pList.get(PR_X_PTR).getString(); //used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); whiteSpaceTreatment = pList.get(PR_WHITE_SPACE_TREATMENT).getEnum(); span = pList.get(PR_SPAN).getEnum(); textAlign = pList.get(PR_TEXT_ALIGN).getEnum(); diff --git a/src/java/org/apache/fop/fo/flow/Character.java b/src/java/org/apache/fop/fo/flow/Character.java index 89bcc42..f2af2e7 100644 --- a/src/java/org/apache/fop/fo/flow/Character.java +++ b/src/java/org/apache/fop/fo/flow/Character.java @@ -112,8 +112,8 @@ public class Character extends FObj implements StructurePointerPropertySet { lineHeight = pList.get(PR_LINE_HEIGHT).getSpace(); textDecoration = pList.getTextDecorationProps(); wordSpacing = pList.get(PR_WORD_SPACING); - ptr = pList.get(PR_X_PTR).getString(); // used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/fo/flow/Inline.java b/src/java/org/apache/fop/fo/flow/Inline.java index 26ee607..3d50e13 100644 --- a/src/java/org/apache/fop/fo/flow/Inline.java +++ b/src/java/org/apache/fop/fo/flow/Inline.java @@ -70,8 +70,8 @@ public class Inline extends InlineLevel implements StructurePointerPropertySet { alignmentBaseline = pList.get(PR_ALIGNMENT_BASELINE).getEnum(); baselineShift = pList.get(PR_BASELINE_SHIFT).getLength(); dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum(); - ptr = pList.get(PR_X_PTR).getString(); // used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/fo/flow/PageNumber.java b/src/java/org/apache/fop/fo/flow/PageNumber.java index fd287d4..26d9a40 100644 --- a/src/java/org/apache/fop/fo/flow/PageNumber.java +++ b/src/java/org/apache/fop/fo/flow/PageNumber.java @@ -96,8 +96,8 @@ public class PageNumber extends FObj implements StructurePointerPropertySet { // letterSpacing = pList.get(PR_LETTER_SPACING); lineHeight = pList.get(PR_LINE_HEIGHT).getSpace(); textDecoration = pList.getTextDecorationProps(); - ptr = pList.get(PR_X_PTR).getString(); // used for accessibility role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); // textShadow = pList.get(PR_TEXT_SHADOW); // implicit properties diff --git a/src/java/org/apache/fop/fo/flow/table/TableFObj.java b/src/java/org/apache/fop/fo/flow/table/TableFObj.java index 3949e9e..c24ee62 100644 --- a/src/java/org/apache/fop/fo/flow/table/TableFObj.java +++ b/src/java/org/apache/fop/fo/flow/table/TableFObj.java @@ -76,8 +76,8 @@ public abstract class TableFObj extends FObj implements StructurePointerProperty borderBeforePrecedence = pList.get(PR_BORDER_BEFORE_PRECEDENCE).getNumeric(); borderEndPrecedence = pList.get(PR_BORDER_END_PRECEDENCE).getNumeric(); borderStartPrecedence = pList.get(PR_BORDER_START_PRECEDENCE).getNumeric(); - ptr = pList.get(PR_X_PTR).getString(); role = pList.get(PR_ROLE).getString(); // used for accessibility + ptr = newPtrId(); if (getNameId() != FO_TABLE //Separate check for fo:table in Table.java && getNameId() != FO_TABLE_CELL && getCommonBorderPaddingBackground().hasPadding( diff --git a/src/java/org/apache/fop/render/intermediate/IFParser.java b/src/java/org/apache/fop/render/intermediate/IFParser.java index bbfc5ea..5b910f0 100644 --- a/src/java/org/apache/fop/render/intermediate/IFParser.java +++ b/src/java/org/apache/fop/render/intermediate/IFParser.java @@ -169,6 +169,11 @@ public class IFParser implements IFConstants { super.endDocument(); startIFElement(EL_PAGE_SEQUENCE, pageSequenceAttributes); pageSequenceAttributes = null; + try { + documentHandler.handleExtensionObject(structureTreeBuilder.getStructureTree()); + } catch (IFException ife) { + handleIFException(ife); + } } } @@ -197,8 +202,7 @@ public class IFParser implements IFConstants { elementHandlers.put(EL_IMAGE, new ImageHandler()); if (userAgent.isAccessibilityEnabled()) { - structureTreeBuilder = new StructureTreeBuilder(tFactory); - userAgent.setStructureTree(structureTreeBuilder.getStructureTree()); + structureTreeBuilder = new StructureTreeBuilder(); } } diff --git a/src/java/org/apache/fop/render/intermediate/IFRenderer.java b/src/java/org/apache/fop/render/intermediate/IFRenderer.java index e8415b5..a0e155f 100644 --- a/src/java/org/apache/fop/render/intermediate/IFRenderer.java +++ b/src/java/org/apache/fop/render/intermediate/IFRenderer.java @@ -506,6 +506,8 @@ public class IFRenderer extends AbstractPathOrientedRenderer { establishForeignAttributes(pageSequence.getForeignAttributes()); documentHandler.getContext().setLanguage(toLocale(pageSequence)); documentHandler.startPageSequence(null); + if (pageSequence.getStructureTree() != null) + documentHandler.handleExtensionObject(pageSequence.getStructureTree()); resetForeignAttributes(); processExtensionAttachments(pageSequence); } catch (IFException e) { diff --git a/src/java/org/apache/fop/render/intermediate/IFSerializer.java b/src/java/org/apache/fop/render/intermediate/IFSerializer.java index 6ceca17..062b601 100644 --- a/src/java/org/apache/fop/render/intermediate/IFSerializer.java +++ b/src/java/org/apache/fop/render/intermediate/IFSerializer.java @@ -31,8 +31,6 @@ import java.util.Locale; import java.util.Map; import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; @@ -40,7 +38,9 @@ import org.xml.sax.helpers.AttributesImpl; import org.apache.xmlgraphics.util.QName; import org.apache.xmlgraphics.util.XMLizable; -import org.apache.fop.accessibility.StructureTree; +import org.apache.fop.accessibility.StructureElement; +import org.apache.fop.fo.extensions.ExtensionElementMapping; +import org.apache.fop.fo.extensions.InternalElementMapping; import org.apache.fop.fonts.FontInfo; import org.apache.fop.render.PrintRendererConfigurator; import org.apache.fop.render.RenderingContext; @@ -230,16 +230,6 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler XMLUtil.addAttribute(atts, XMLConstants.XML_SPACE, "preserve"); addForeignAttributes(atts); handler.startElement(EL_PAGE_SEQUENCE, atts); - if (this.getUserAgent().isAccessibilityEnabled()) { - StructureTree structureTree = getUserAgent().getStructureTree(); - handler.startElement(EL_STRUCTURE_TREE); // add structure tree - NodeList nodes = structureTree.getPageSequence(pageSequenceIndex++); - for (int i = 0, n = nodes.getLength(); i < n; i++) { - Node node = nodes.item(i); - new DOM2SAX(handler).writeFragment(node); - } - handler.endElement(EL_STRUCTURE_TREE); - } } catch (SAXException e) { throw new IFException("SAX error in startPageSequence()", e); } @@ -633,7 +623,20 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler /** {@inheritDoc} */ public void handleExtensionObject(Object extension) throws IFException { - if (extension instanceof XMLizable) { + if (extension instanceof StructureElement) { + try { + StructureElement node = (StructureElement)extension; + handler.startElement(EL_STRUCTURE_TREE); // add structure tree + handler.startPrefixMapping("foi", InternalElementMapping.URI); + handler.startPrefixMapping("fox", ExtensionElementMapping.URI); + node.toXML(handler); + handler.endPrefixMapping("fox"); + handler.endPrefixMapping("foi"); + handler.endElement(EL_STRUCTURE_TREE); + } catch (SAXException e) { + throw new IFException("SAX error in setFont()", e); + } + } else if (extension instanceof XMLizable) { try { ((XMLizable)extension).toSAX(this.handler); } catch (SAXException e) { diff --git a/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java b/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java index 6dbabdd..2f4d77a 100644 --- a/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java +++ b/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java @@ -22,8 +22,7 @@ package org.apache.fop.render.pdf; import java.util.HashMap; import java.util.Map; -import org.w3c.dom.Node; - +import org.apache.fop.accessibility.StructureElement; import org.apache.fop.events.EventBroadcaster; import org.apache.fop.pdf.PDFName; import org.apache.fop.pdf.PDFObject; @@ -180,20 +179,19 @@ final class FOToPDFRoleMap { } } - public static PDFName mapFormattingObject(Node fo, PDFObject parent, + public static PDFName mapFormattingObject(StructureElement fo, PDFObject parent, EventBroadcaster eventBroadcaster) { PDFName type = null; - Node role = fo.getAttributes().getNamedItemNS(null, "role"); + String role = fo.getRole(); if (role == null) { - type = mapFormattingObject(fo.getLocalName(), parent); + type = mapFormattingObject(fo.getName(), parent); } else { - String customType = role.getNodeValue(); - type = (PDFName) STANDARD_STRUCTURE_TYPES.get(customType); + type = (PDFName) STANDARD_STRUCTURE_TYPES.get(role); if (type == null) { - String foName = fo.getLocalName(); + String foName = fo.getName(); type = mapFormattingObject(foName, parent); PDFEventProducer.Provider.get(eventBroadcaster).nonStandardStructureType(fo, - foName, customType, type.toString().substring(1)); + foName, fo.getRole(), type.toString().substring(1)); } } assert type != null; diff --git a/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java b/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java index 6a61143..b638e63 100644 --- a/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java +++ b/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java @@ -27,13 +27,12 @@ import java.awt.geom.Rectangle2D; import java.io.IOException; import java.util.Map; -import org.w3c.dom.NodeList; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.xmlgraphics.xmp.Metadata; +import org.apache.fop.accessibility.StructureElement; import org.apache.fop.apps.MimeConstants; import org.apache.fop.fo.extensions.xmp.XMPMetadata; import org.apache.fop.pdf.PDFAnnotList; @@ -61,8 +60,6 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { /** logging instance */ private static Log log = LogFactory.getLog(PDFDocumentHandler.class); - private int pageSequenceIndex; - private boolean accessEnabled; private PDFLogicalStructureHandler logicalStructureHandler; @@ -185,11 +182,6 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { //No document-level language set, so we use the first page-sequence's language this.pdfDoc.getRoot().setLanguage(XMLUtil.toRFC3066(getContext().getLanguage())); } - - if (accessEnabled) { - NodeList nodes = getUserAgent().getStructureTree().getPageSequence(pageSequenceIndex++); - logicalStructureHandler.processStructureTree(nodes, getContext().getLanguage()); - } } /** {@inheritDoc} */ @@ -288,7 +280,9 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { /** {@inheritDoc} */ public void handleExtensionObject(Object extension) throws IFException { - if (extension instanceof XMPMetadata) { + if (extension instanceof StructureElement) { + logicalStructureHandler.processStructureTree((StructureElement)extension, getContext().getLanguage()); + } else if (extension instanceof XMPMetadata) { pdfUtil.renderXMPMetadata((XMPMetadata)extension); } else if (extension instanceof Metadata) { XMPMetadata wrapper = new XMPMetadata(((Metadata)extension)); diff --git a/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java b/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java index c37bfc5..0365c2f 100644 --- a/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java +++ b/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java @@ -23,9 +23,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - +import org.apache.fop.accessibility.StructureElement; import org.apache.fop.events.EventBroadcaster; import org.apache.fop.fo.extensions.ExtensionElementMapping; import org.apache.fop.fo.extensions.InternalElementMapping; @@ -123,7 +121,7 @@ class PDFLogicalStructureHandler { * @param structureTree the structure tree of the current page sequence * @param language language set on the page sequence */ - void processStructureTree(NodeList structureTree, Locale language) { + void processStructureTree(StructureElement structureTree, Locale language) { pdfDoc.enforceLanguageOnRoot(); PDFStructElem structElemPart = pdfDoc.getFactory().makeStructureElement( FOToPDFRoleMap.mapFormattingObject("page-sequence", rootStructureElement), @@ -134,24 +132,22 @@ class PDFLogicalStructureHandler { } for (int i = 0, n = structureTree.getLength(); i < n; i++) { - Node node = structureTree.item(i); - assert node.getLocalName().equals("flow") - || node.getLocalName().equals("static-content"); + StructureElement node = structureTree.getChild(i); + assert node.getName().equals("flow") + || node.getName().equals("static-content"); PDFStructElem structElemSect = pdfDoc.getFactory().makeStructureElement( - FOToPDFRoleMap.mapFormattingObject(node.getLocalName(), structElemPart), + FOToPDFRoleMap.mapFormattingObject(node.getName(), structElemPart), structElemPart); structElemPart.addKid(structElemSect); - NodeList childNodes = node.getChildNodes(); - for (int j = 0, m = childNodes.getLength(); j < m; j++) { - processNode(childNodes.item(j), structElemSect, true); + for (int j = 0, m = node.getLength(); j < m; j++) { + processNode(node.getChild(j), structElemSect, true); } } } - private void processNode(Node node, PDFStructElem parent, boolean addKid) { - Node attr = node.getAttributes().getNamedItemNS(InternalElementMapping.URI, "ptr"); - assert attr != null; - String ptr = attr.getNodeValue(); + private void processNode(StructureElement node, PDFStructElem parent, boolean addKid) { + String ptr = node.getPtr(); + assert ptr != null; PDFStructElem structElem = pdfDoc.getFactory().makeStructureElement( FOToPDFRoleMap.mapFormattingObject(node, parent, eventBroadcaster), parent); // TODO necessary? If a page-sequence is empty (e.g., contains a single @@ -160,20 +156,18 @@ class PDFLogicalStructureHandler { if (addKid) { parent.addKid(structElem); } - String nodeName = node.getLocalName(); + String nodeName = node.getName(); if (nodeName.equals("external-graphic") || nodeName.equals("instream-foreign-object")) { - Node altTextNode = node.getAttributes().getNamedItemNS( - ExtensionElementMapping.URI, "alt-text"); + String altTextNode = node.getAltText(); if (altTextNode != null) { - structElem.put("Alt", altTextNode.getNodeValue()); + structElem.put("Alt", altTextNode); } else { structElem.put("Alt", "No alternate text specified"); } } structTreeMap.put(ptr, structElem); - NodeList nodes = node.getChildNodes(); - for (int i = 0, n = nodes.getLength(); i < n; i++) { - processNode(nodes.item(i), structElem, false); + for (int i = 0, n = node.getLength(); i < n; i++) { + processNode(node.getChild(i), structElem, false); } } diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java index f005f3b..ac2a017 100644 --- a/src/java/org/apache/fop/render/xml/XMLRenderer.java +++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java @@ -35,13 +35,13 @@ import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.apache.xmlgraphics.util.QName; import org.apache.xmlgraphics.util.XMLizable; +import org.apache.fop.accessibility.StructureElement; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; @@ -110,8 +110,6 @@ public class XMLRenderer extends AbstractXMLRenderer { /** If not null, the XMLRenderer will mimic another renderer by using its font setup. */ protected Renderer mimic; - private int pageSequenceIndex; - /** * Creates a new XML renderer. */ @@ -460,21 +458,17 @@ public class XMLRenderer extends AbstractXMLRenderer { } transferForeignObjects(pageSequence); startElement("pageSequence", atts); - if (this.getUserAgent().isAccessibilityEnabled()) { + StructureElement node = pageSequence.getStructureTree(); + if (node != null) { String structureTreeElement = "structureTree"; startElement(structureTreeElement); try { this.handler.startPrefixMapping("foi", InternalElementMapping.URI); this.handler.startPrefixMapping("fox", ExtensionElementMapping.URI); - NodeList nodes = getUserAgent().getStructureTree().getPageSequence( - pageSequenceIndex++); - for (int i = 0, n = nodes.getLength(); i < n; i++) { - Node node = nodes.item(i); - try { - new DOM2SAX(handler).writeFragment(node); - } catch (SAXException e) { - handleSAXException(e); - } + try { + node.toXML(handler); + } catch (SAXException e) { + handleSAXException(e); } this.handler.endPrefixMapping("fox"); this.handler.endPrefixMapping("foi"); -- 1.6.4.2