From d62f5f811c40bc3f0b20f0ae8d75cfb240be9c67 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Fri, 21 Nov 2008 16:07:58 +0000 Subject: [PATCH] Added support for SVG 1.2 inside fo:instream-foreign-object. The code just used the basic SVGDOMImplementation for SVG 1.1. Now it delegates the DOM building to Batik code instead of to a normal DOM builder. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@719616 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fo/XMLObj.java | 1 + .../svg/SVGDOMContentHandlerFactory.java | 82 +++++++++++++++++++ .../fop/fo/extensions/svg/SVGElement.java | 61 ++++---------- .../fop/svg/FOPSAXSVGDocumentFactory.java | 11 +++ status.xml | 3 + 5 files changed, 113 insertions(+), 45 deletions(-) create mode 100644 src/java/org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java diff --git a/src/java/org/apache/fop/fo/XMLObj.java b/src/java/org/apache/fop/fo/XMLObj.java index 3330f41a5..e1eb47b46 100644 --- a/src/java/org/apache/fop/fo/XMLObj.java +++ b/src/java/org/apache/fop/fo/XMLObj.java @@ -217,6 +217,7 @@ public abstract class XMLObj extends FONode implements ObjectBuiltListener { /** {@inheritDoc} */ public void notifyObjectBuilt(Object obj) { this.doc = (Document)obj; + this.element = this.doc.getDocumentElement(); } } diff --git a/src/java/org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java b/src/java/org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java new file mode 100644 index 000000000..c5064da3f --- /dev/null +++ b/src/java/org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.fo.extensions.svg; + +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + +import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.util.XMLResourceDescriptor; + +import org.apache.fop.svg.FOPSAXSVGDocumentFactory; +import org.apache.fop.util.ContentHandlerFactory; + +/** + * ContentHandlerFactory which constructs ContentHandlers that build SVG DOM Documents. + */ +public class SVGDOMContentHandlerFactory implements ContentHandlerFactory { + + /** + * Default Constructor. + */ + public SVGDOMContentHandlerFactory() { + //nop + } + + /** {@inheritDoc} */ + public String[] getSupportedNamespaces() { + return new String[] {SVGDOMImplementation.SVG_NAMESPACE_URI}; + } + + /** {@inheritDoc} */ + public ContentHandler createContentHandler() throws SAXException { + return new Handler(); + } + + private static class Handler extends FOPSAXSVGDocumentFactory + implements ContentHandlerFactory.ObjectSource { + + private ObjectBuiltListener obListener; + + public Handler() throws SAXException { + super(XMLResourceDescriptor.getXMLParserClassName()); + } + + /** {@inheritDoc} */ + public Object getObject() { + return getDocument(); + } + + /** {@inheritDoc} */ + public void setObjectBuiltListener(ObjectBuiltListener listener) { + this.obListener = listener; + } + + /** {@inheritDoc} */ + public void endDocument() throws SAXException { + super.endDocument(); + if (obListener != null) { + obListener.notifyObjectBuilt(getObject()); + } + } + + } + +} diff --git a/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java b/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java index a40b80190..917e8c0d8 100644 --- a/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java +++ b/src/java/org/apache/fop/fo/extensions/svg/SVGElement.java @@ -20,35 +20,28 @@ package org.apache.fop.fo.extensions.svg; // FOP -import org.apache.fop.apps.FOPException; -import org.apache.fop.fo.FONode; -import org.apache.fop.fo.PropertyList; -import org.apache.fop.util.ContentHandlerFactory; -import org.apache.fop.util.DOMBuilderContentHandlerFactory; +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.net.URL; -import org.apache.batik.dom.svg.SVGOMDocument; -import org.apache.batik.dom.svg.SVGOMElement; -import org.apache.batik.dom.svg.SVGContext; -import org.apache.batik.dom.util.XMLSupport; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGDocument; -import org.xml.sax.Attributes; -import org.xml.sax.Locator; -import org.apache.batik.bridge.UnitProcessor; -import org.apache.batik.util.SVGConstants; - -import org.w3c.dom.DOMImplementation; +import org.apache.batik.bridge.UnitProcessor; +import org.apache.batik.dom.svg.SVGContext; import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.dom.svg.SVGOMDocument; +import org.apache.batik.dom.svg.SVGOMElement; +import org.apache.batik.dom.util.XMLSupport; +import org.apache.batik.util.SVGConstants; -import java.net.URL; -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; +import org.apache.fop.fo.FONode; +import org.apache.fop.util.ContentHandlerFactory; /** - * class representing the SVG root element - * for constructing an svg document. + * Class representing the SVG root element + * for constructing an SVG document. */ public class SVGElement extends SVGObj { @@ -61,21 +54,9 @@ public class SVGElement extends SVGObj { super(parent); } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public ContentHandlerFactory getContentHandlerFactory() { - return new DOMBuilderContentHandlerFactory(getNamespaceURI(), - SVGDOMImplementation.getDOMImplementation()); - } - - /** - * {@inheritDoc} - */ - public void processNode(String elementName, Locator locator, - Attributes attlist, PropertyList propertyList) throws FOPException { - super.processNode(elementName, locator, attlist, propertyList); - init(); + return new SVGDOMContentHandlerFactory(); } /** @@ -170,16 +151,6 @@ public class SVGElement extends SVGObj { return p2d; } - private void init() { - DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); - String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; - doc = impl.createDocument(svgNS, "svg", null); - - element = doc.getDocumentElement(); - - buildTopLevel(doc, element); - } - /** * Get the size of the SVG root element. * @param size the font size diff --git a/src/java/org/apache/fop/svg/FOPSAXSVGDocumentFactory.java b/src/java/org/apache/fop/svg/FOPSAXSVGDocumentFactory.java index 720795cb2..fce6ed2b6 100644 --- a/src/java/org/apache/fop/svg/FOPSAXSVGDocumentFactory.java +++ b/src/java/org/apache/fop/svg/FOPSAXSVGDocumentFactory.java @@ -21,6 +21,8 @@ package org.apache.fop.svg; import java.io.IOException; +import org.w3c.dom.Document; + import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -71,4 +73,13 @@ public class FOPSAXSVGDocumentFactory extends SAXSVGDocumentFactory { return super.resolveEntity(publicId, systemId); } + /** + * Returns the document built up by handling the incoming SAX events. This method will not + * return any instance for the first SAX events have been received. + * @return the DOM document + */ + public Document getDocument() { + return this.document; + } + } diff --git a/status.xml b/status.xml index 2a951cb42..1ea87e4c9 100644 --- a/status.xml +++ b/status.xml @@ -53,6 +53,9 @@ + + Added support for SVG 1.2 functionality inside fo:instream-foreign-object. + Fixed a bug when combining break-before with a span change. -- 2.39.5