aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/accessibility/ParsedStructureTree.java2
-rw-r--r--src/java/org/apache/fop/accessibility/SimpleStructureTree.java55
-rw-r--r--src/java/org/apache/fop/accessibility/addPtr.xsl57
-rw-r--r--src/java/org/apache/fop/accessibility/reduceFOTree.xsl146
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java26
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">
+
+ <xsl:template name="addPtr">
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:attribute name="foi:ptr">
+ <xsl:value-of select="generate-id()"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Block-level Formatting Objects -->
<xsl:template match="fo:block|fo:block-container">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:list-block|fo:list-item|fo:list-item-label|fo:list-item-body">
+
+ <!-- Inline-level Formatting Objects -->
+ <xsl:template match="fo:character|fo:inline|fo:inline-container">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:table-and-caption|fo:table-caption|fo:table|fo:table-body|fo:table-header|fo:table-footer|fo:table-row|fo:table-cell">
+
+ <xsl:template match="fo:external-graphic|fo:instream-foreign-object">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:inline|fo:wrapper|fo:basic-link|fo:character">
+
+ <xsl:template match="fo:page-number|fo:page-number-citation|fo:page-number-citation-last">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:instream-foreign-object|fo:external-graphic">
+
+ <!-- Formatting Objects for Tables -->
+ <xsl:template match="fo:table-and-caption|fo:table-caption|fo:table">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:page-number|fo:page-number-citation|fo:page-number-citation-last">
+
+ <xsl:template match="fo:table-header|fo:table-footer|fo:table-body|fo:table-row|fo:table-cell">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:footnote|fo:footnote-body">
+
+ <!-- Formatting Objects for Lists -->
+ <xsl:template match="fo:list-block|fo:list-item|fo:list-item-label|fo:list-item-body">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template match="fo:marker">
+
+ <!-- Dynamic Effects: Link and Multi Formatting Objects -->
+ <xsl:template match="fo:basic-link">
<xsl:call-template name="addPtr"/>
</xsl:template>
- <xsl:template name="addPtr">
- <xsl:element name="{name()}" namespace="{namespace-uri()}">
- <xsl:apply-templates select="@*"/>
- <xsl:attribute name="foi:ptr">
- <xsl:value-of select="generate-id()"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:element>
+
+ <!-- Out-of-Line Formatting Objects -->
+ <xsl:template match="fo:float|fo:footnote|fo:footnote-body">
+ <xsl:call-template name="addPtr"/>
</xsl:template>
+
+ <!-- Other Formatting Objects -->
+ <xsl:template match="fo:wrapper|fo:marker">
+ <xsl:call-template name="addPtr"/>
+ </xsl:template>
+
+
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
+
</xsl:stylesheet>
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.
-->
<!-- $Id$ -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:foi="http://xmlgraphics.apache.org/fop/internal"
- version="1.0">
- <xsl:output method="xml" indent="no"/>
-
- <xsl:template match="*">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="@master-reference|@flow-name"></xsl:template>
-
- <xsl:template match="fo:block">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="fo:inline|fo:wrapper|fo:page-number|fo:page-number-citation|fo:page-number-citation-last">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="fo:table-cell|fo:table|fo:table-body|fo:table-footer|fo:table-row|fo:table-header">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="fo:list-block|fo:list-item|fo:list-item-label|fo:list-item-body">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="fo:basic-link|fo:block-container|fo:character|fo:instream-foreign-object|fo:marker">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="fo:external-graphic|fo:instream-foreign-object">
- <xsl:element name="{name()}">
- <xsl:copy-of select="@fox:alt-text|@foi:ptr"/>
- <xsl:apply-templates/>
- </xsl:element>
- </xsl:template>
-
- <!-- the following nodes are being ignored/filtered -->
-
- <xsl:template match="text()"/>
-
- <xsl:template match="fo:layout-master-set | comment() | processing-instruction() | fo:simple-page-master | fo:table-column | fo:leader | fo:retrieve-marker "/>
-
- <xsl:template match="svg:svg | svg | fo:inline-container | fo:float | fo:bidi-override"/>
-
+ xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
+ xmlns:foi="http://xmlgraphics.apache.org/fop/internal">
+
+ <xsl:output method="xml" indent="no"/>
+
+ <xsl:template name="copy">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Declarations and Pagination and Layout Formatting Objects -->
+ <xsl:template match="fo:root|fo:page-sequence|fo:static-content|fo:flow">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Block-level Formatting Objects -->
+ <xsl:template match="fo:block|fo:block-container">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Inline-level Formatting Objects -->
+ <xsl:template match="fo:character|fo:inline|fo:inline-container">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <xsl:template match="fo:external-graphic|fo:instream-foreign-object">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <xsl:template match="fo:page-number|fo:page-number-citation|fo:page-number-citation-last">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Formatting Objects for Tables -->
+ <xsl:template match="fo:table-and-caption|fo:table-caption|fo:table">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <xsl:template match="fo:table-header|fo:table-footer|fo:table-body|fo:table-row|fo:table-cell">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Formatting Objects for Lists -->
+ <xsl:template match="fo:list-block|fo:list-item|fo:list-item-label|fo:list-item-body">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Dynamic Effects: Link and Multi Formatting Objects -->
+ <xsl:template match="fo:basic-link">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Out-of-Line Formatting Objects -->
+ <xsl:template match="fo:float|fo:footnote|fo:footnote-body">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+ <!-- Other Formatting Objects -->
+ <xsl:template match="fo:wrapper|fo:marker">
+ <xsl:call-template name="copy"/>
+ </xsl:template>
+
+
+ <!-- Discard descendants of fo:leader -->
+ <xsl:template match="fo:leader"/>
+
+
+ <!-- Keep foi:ptr and fox:alt-text attributes, discard everything else -->
+ <xsl:template match="@foi:ptr|@fox:alt-text">
+ <xsl:copy-of select="."/>
+ </xsl:template>
+
+ <xsl:template match="@*"/>
+
+
+ <!-- Discard text -->
+ <xsl:template match="text()"/>
+
</xsl:stylesheet>
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 {