From a3960ce47f877ae7c9d767dc3804be1bc4ffae24 Mon Sep 17 00:00:00 2001 From: Vincent Hennebert Date: Thu, 15 Oct 2009 10:47:34 +0000 Subject: Made the structure tree processing chain more robust by removing any assumption about prefix names for namespaces. Avoid warnings issued by reduceFOTree.xsl when FO file contains foreign elements (like MathML). SimpleStructureTree: replaced XPath query with simple DOM method calls. Cleaned up, simplified and re-organized reduceFOTree and addPtr stylesheets. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_Accessibility@825461 13f79535-47bb-0310-9956-ffa450edef68 --- .../fop/accessibility/ParsedStructureTree.java | 2 +- .../fop/accessibility/SimpleStructureTree.java | 55 +------- src/java/org/apache/fop/accessibility/addPtr.xsl | 57 +++++--- .../org/apache/fop/accessibility/reduceFOTree.xsl | 146 +++++++++++---------- .../fop/render/pdf/PDFLogicalStructureHandler.java | 26 ++-- 5 files changed, 141 insertions(+), 145 deletions(-) diff --git a/src/java/org/apache/fop/accessibility/ParsedStructureTree.java b/src/java/org/apache/fop/accessibility/ParsedStructureTree.java index 3aa95b627..646496252 100644 --- a/src/java/org/apache/fop/accessibility/ParsedStructureTree.java +++ b/src/java/org/apache/fop/accessibility/ParsedStructureTree.java @@ -82,7 +82,7 @@ public class ParsedStructureTree implements StructureTree { public void characters(char[] ch, int start, int length) throws SAXException { /* - * There's not text node in the structure tree. This is just + * There's no text node in the structure tree. This is just * whitespace => ignore */ } diff --git a/src/java/org/apache/fop/accessibility/SimpleStructureTree.java b/src/java/org/apache/fop/accessibility/SimpleStructureTree.java index e67757207..c009b7b30 100644 --- a/src/java/org/apache/fop/accessibility/SimpleStructureTree.java +++ b/src/java/org/apache/fop/accessibility/SimpleStructureTree.java @@ -21,17 +21,11 @@ package org.apache.fop.accessibility; import java.io.StringWriter; import java.io.Writer; -import java.util.Iterator; -import javax.xml.namespace.NamespaceContext; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -45,57 +39,16 @@ final class SimpleStructureTree implements StructureTree { private final Node reducedFOTree; - private static class NamespaceContextImpl implements NamespaceContext { - - private String uri; - private String prefix; - - public NamespaceContextImpl() { - } - - public NamespaceContextImpl(String prefix, String uri) { - this.uri = uri; - this.prefix = prefix; - } - - public String getNamespaceURI(String prefix) { - return uri; - } - - public void setNamespaceURI(String uri) { - this.uri = uri; - } - - public String getPrefix(String uri) { - return prefix; - } - - public void setPrefix(String prefix) { - this.prefix = prefix; - } - - public Iterator getPrefixes(String uri) { - return null; - } - } - SimpleStructureTree(Node reducedFOTree) { this.reducedFOTree = reducedFOTree; } /** {@inheritDoc} */ public NodeList getPageSequence(int number) { - XPath xpath = XPathFactory.newInstance().newXPath(); - NamespaceContext namespaceContext = new NamespaceContextImpl("fo", - "http://www.w3.org/1999/XSL/Format"); - xpath.setNamespaceContext(namespaceContext); - String xpathExpr = "/fo:root/fo:page-sequence[" + Integer.toString(number) + "]/*"; - - try { - return (NodeList) xpath.evaluate(xpathExpr, reducedFOTree, XPathConstants.NODESET); - } catch (XPathExpressionException e) { - throw new RuntimeException(e); - } + Node pageSequence = reducedFOTree.getFirstChild().getChildNodes().item(number - 1); + assert pageSequence.getNodeType() == Node.ELEMENT_NODE + && pageSequence.getLocalName().equals("page-sequence"); + return pageSequence.getChildNodes(); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/accessibility/addPtr.xsl b/src/java/org/apache/fop/accessibility/addPtr.xsl index 35645906a..b3984d426 100644 --- a/src/java/org/apache/fop/accessibility/addPtr.xsl +++ b/src/java/org/apache/fop/accessibility/addPtr.xsl @@ -20,42 +20,69 @@ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foi="http://xmlgraphics.apache.org/fop/internal"> + + + + + + + + + + + + - + + + - + + - + + - + + + - + + - + + + - + + + - - - - - - - - + + + + + + + + + + + + diff --git a/src/java/org/apache/fop/accessibility/reduceFOTree.xsl b/src/java/org/apache/fop/accessibility/reduceFOTree.xsl index 84c500639..8e9bcfc13 100644 --- a/src/java/org/apache/fop/accessibility/reduceFOTree.xsl +++ b/src/java/org/apache/fop/accessibility/reduceFOTree.xsl @@ -16,71 +16,85 @@ limitations under the License. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" + xmlns:foi="http://xmlgraphics.apache.org/fop/internal"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java b/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java index e1f1fae68..2313431f0 100644 --- a/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java +++ b/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java @@ -26,6 +26,8 @@ import java.util.Map; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.apache.fop.fo.extensions.ExtensionElementMapping; +import org.apache.fop.fo.extensions.InternalElementMapping; import org.apache.fop.pdf.PDFArray; import org.apache.fop.pdf.PDFDictionary; import org.apache.fop.pdf.PDFDocument; @@ -129,22 +131,21 @@ class PDFLogicalStructureHandler { for (int i = 0, n = structureTree.getLength(); i < n; i++) { Node node = structureTree.item(i); - if (node.getNodeName().equals("fo:flow") - || node.getNodeName().equals("fo:static-content")) { - PDFStructElem structElemSect = pdfDoc.getFactory().makeStructureElement( - FOToPDFRoleMap.mapFormattingObject(node.getLocalName(), 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); - } + assert node.getLocalName().equals("flow") + || node.getLocalName().equals("static-content"); + PDFStructElem structElemSect = pdfDoc.getFactory().makeStructureElement( + FOToPDFRoleMap.mapFormattingObject(node.getLocalName(), 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); } } } private void processNode(Node node, PDFStructElem parent, boolean addKid) { - Node attr = node.getAttributes().getNamedItem("foi:ptr"); + Node attr = node.getAttributes().getNamedItemNS(InternalElementMapping.URI, "ptr"); assert attr != null; String ptr = attr.getNodeValue(); String nodeName = node.getLocalName(); @@ -157,7 +158,8 @@ class PDFLogicalStructureHandler { parent.addKid(structElem); } if (nodeName.equals("external-graphic") || nodeName.equals("instream-foreign-object")) { - Node altTextNode = node.getAttributes().getNamedItem("fox:alt-text"); + Node altTextNode = node.getAttributes().getNamedItemNS( + ExtensionElementMapping.URI, "alt-text"); if (altTextNode != null) { structElem.put("Alt", altTextNode.getNodeValue()); } else { -- cgit v1.2.3