]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
uses a treebuilder interface so we can easily have different tree builders
authorKeiron Liddle <keiron@apache.org>
Tue, 29 Aug 2000 00:09:41 +0000 (00:09 +0000)
committerKeiron Liddle <keiron@apache.org>
Tue, 29 Aug 2000 00:09:41 +0000 (00:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193679 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/fo/ElementMapping.java
src/org/apache/fop/fo/FOTreeBuilder.java
src/org/apache/fop/fo/PropertyListMapping.java
src/org/apache/fop/fo/SVGTreeBuilder.java [new file with mode: 0644]
src/org/apache/fop/fo/StandardElementMapping.java
src/org/apache/fop/fo/StandardPropertyListMapping.java
src/org/apache/fop/fo/TreeBuilder.java [new file with mode: 0644]

index d7289536e184c4ce51df84764fcfca24fc162d30..9ed5cb3d15339feafb1823a06d8c7a6d0c247b46 100644 (file)
@@ -52,5 +52,5 @@ package org.apache.fop.fo;
 
 public interface ElementMapping {
 
-    public void addToBuilder(FOTreeBuilder builder);
+    public void addToBuilder(TreeBuilder builder);
 }
index fd19592b23e6a0d147b46d27930e6bba455164bb..4d25bc5461070bdb4c73278bb3cee72d1ea3c0bf 100644 (file)
@@ -70,7 +70,7 @@ import java.io.IOException;
 /**
  * SAX Handler that builds the formatting object tree.
  */
-public class FOTreeBuilder extends DefaultHandler {
+public class FOTreeBuilder extends DefaultHandler implements TreeBuilder {
 
     /**
      * table mapping element names to the makers of objects
index 836a51cf63ec9bafdd128f927981e61b23e953ea..23d3c889a05fe61e7b0d9ab70c668bef5c7a2d2c 100644 (file)
@@ -52,5 +52,5 @@ package org.apache.fop.fo;
 
 public interface PropertyListMapping {
 
-    public void addToBuilder(FOTreeBuilder builder);
+    public void addToBuilder(TreeBuilder builder);
 }
diff --git a/src/org/apache/fop/fo/SVGTreeBuilder.java b/src/org/apache/fop/fo/SVGTreeBuilder.java
new file mode 100644 (file)
index 0000000..2732f61
--- /dev/null
@@ -0,0 +1,305 @@
+/*-- $Id$ -- 
+
+ ============================================================================
+                   The Apache Software License, Version 1.1
+ ============================================================================
+    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of  source code must  retain the above copyright  notice,
+    this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+    include  the following  acknowledgment:  "This product includes  software
+    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
+    Alternately, this  acknowledgment may  appear in the software itself,  if
+    and wherever such third-party acknowledgments normally appear.
+ 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+    endorse  or promote  products derived  from this  software without  prior
+    written permission. For written permission, please contact
+    apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+    "Apache" appear  in their name,  without prior written permission  of the
+    Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software  Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+// FOP
+import org.apache.fop.fo.*;
+import org.apache.fop.dom.svg.*;
+import org.apache.fop.layout.AreaTree;
+import org.apache.fop.messaging.MessageHandler;
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.fo.pagination.Root;
+
+// SAX
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.InputSource;
+import org.xml.sax.Attributes;
+
+import org.w3c.dom.svg.*;
+
+// Java
+import java.util.Hashtable;
+import java.util.Stack;
+import java.io.IOException;
+
+// NOTE: This class is here since a number of FObj methods that
+// are called are protected. This should probably be fixed.
+/**
+ * SAX Handler that builds the formatting object tree.
+ */
+public class SVGTreeBuilder extends DefaultHandler implements TreeBuilder {
+
+    /**
+     * table mapping element names to the makers of objects
+     * representing formatting objects
+     */
+    protected Hashtable fobjTable = new Hashtable();
+
+    /**
+     * class that builds a property list for each formatting object
+     */
+    protected Hashtable propertylistTable = new Hashtable();
+       
+    /**
+     * current formatting object being handled
+     */
+    protected FObj currentFObj = null;
+
+    /**
+     * the root of the formatting object tree
+     */
+    protected FObj rootFObj = null;
+
+    /**
+     * set of names of formatting objects encountered but unknown
+     */
+    protected Hashtable unknownFOs = new Hashtable();
+
+    // namespace implementation ideas pinched from John Cowan
+    protected static class NSMap {
+       String prefix;
+       String uri;
+       int level;
+
+       NSMap(String prefix, String uri, int level) {
+           this.prefix = prefix;
+           this.uri = uri;
+           this.level = level;
+       }
+    }
+
+    protected int level = 0;
+    protected Stack namespaceStack = new Stack();
+
+    {
+       namespaceStack.push(new NSMap("xml",
+                                     "http://www.w3.org/XML/1998/namespace",
+                                     -1));
+       namespaceStack.push(new NSMap("", "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd", -1));
+    }
+
+    protected String findURI(String prefix) {
+       for (int i = namespaceStack.size() - 1; i >= 0; i--) {
+           NSMap nsMap = (NSMap) (namespaceStack.elementAt(i));
+           if (prefix.equals(nsMap.prefix)) return nsMap.uri;
+       }
+       return null;
+    }
+
+    protected String mapName(String name)
+       throws SAXException {
+       int colon = name.indexOf(':');
+       String prefix = "";
+       String localPart = name;
+       if (colon != -1) {
+           prefix = name.substring(0, colon);
+           localPart = name.substring(colon + 1);
+       }
+       String uri = findURI(prefix);
+       if (uri == null) {
+           if (prefix.equals("")) {
+               return "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd^" + name;
+           } else {
+               throw new SAXException(new FOPException("Unknown namespace prefix " + prefix));
+           }
+       }
+       return uri + "^" + localPart;
+    }
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addMapping(String namespaceURI, String localName,
+                          FObj.Maker maker) {
+       this.fobjTable.put(namespaceURI + "^" + localName, maker);
+    }
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addPropertyList(String namespaceURI, Hashtable list) {
+        PropertyListBuilder plb;
+        plb = (PropertyListBuilder)this.propertylistTable.get(namespaceURI);
+        if(plb == null) {
+            plb = new PropertyListBuilder();
+            plb.addList(list);
+            this.propertylistTable.put(namespaceURI, plb);
+        } else {
+            plb.addList(list);
+        }
+    }
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addElementPropertyList(String namespaceURI, String localName, Hashtable list) {
+        PropertyListBuilder plb;
+        plb = (PropertyListBuilder)this.propertylistTable.get(namespaceURI);
+        if(plb == null) {
+            plb = new PropertyListBuilder();
+            plb.addElementList(localName, list);
+            this.propertylistTable.put(namespaceURI, plb);
+        } else {
+            plb.addElementList(localName, list);
+        }
+    }
+
+    /** SAX Handler for characters */
+    public void characters(char data[], int start, int length) {
+       currentFObj.addCharacters(data, start, start + length);
+    }
+
+    /** SAX Handler for the end of an element */
+    public void endElement(
+               String uri, String localName, String rawName) {
+       currentFObj.end();
+       currentFObj = (FObj) currentFObj.getParent();
+       level--;
+       while (((NSMap) namespaceStack.peek()).level > level) {
+           namespaceStack.pop();
+       }
+    }
+
+    /** SAX Handler for the start of the document */
+    public void startDocument() {
+       MessageHandler.logln("building svg tree");
+    }
+
+    /** SAX Handler for the start of an element */
+    public void startElement(String uri,
+       String localName, String rawName, Attributes attlist)
+       throws SAXException { 
+       /* the formatting object started */
+       FObj fobj;
+       if(uri.equals("")) {
+               uri = "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd";
+       }
+
+       /* the maker for the formatting object started */
+       FObj.Maker fobjMaker;
+
+       level++;
+       int length = attlist.getLength();
+       for (int i = 0; i < length; i++) {
+           String att = attlist.getQName(i);
+           if (att.equals("xmlns")) {
+               namespaceStack.push( new NSMap("",
+                                              attlist.getValue(i),
+                                              level));
+           } else if (att.startsWith("xmlns:")) {
+               String value = attlist.getValue(i);
+               namespaceStack.push(new NSMap(att.substring(6), value,
+                                             level));
+           }
+       }
+
+       String fullName = mapName(rawName);
+
+       fobjMaker = (FObj.Maker) fobjTable.get(fullName);
+    PropertyListBuilder currentListBuilder = (PropertyListBuilder)this.propertylistTable.get(uri);
+
+       if (fobjMaker == null) {
+           if (!this.unknownFOs.containsKey(fullName)) {
+               this.unknownFOs.put(fullName, "");
+               MessageHandler.errorln("WARNING: Unknown formatting object "
+                                  + fullName);  
+           }
+           fobjMaker = new FObjMixed.Maker(); // fall back
+       }
+       
+       try {
+               PropertyList list = null;
+               if(currentListBuilder != null) {
+                       list = currentListBuilder.makeList(fullName, attlist,  
+                            (currentFObj == null) ? null : currentFObj.properties);
+               }
+           fobj = fobjMaker.make(currentFObj, list);
+       } catch (FOPException e) {
+               throw new SAXException(e);
+       }
+
+       if (rootFObj == null) {
+           rootFObj = fobj;
+           if (!fobj.getName().equals("svg:svg")) {
+               throw new SAXException(new FOPException("Root element must"
+                                                       + " be svg, not "
+                                                       + fobj.getName())); 
+           }
+       } else {
+           currentFObj.addChild(fobj);
+       }
+       
+       currentFObj = fobj;
+    }
+
+    /**
+     */
+    public SVGDocument getSVGDocument()
+    {
+       SVGDocumentImpl doc = new SVGDocumentImpl();
+        SVGSVGElement svg = (SVGSVGElement)((org.apache.fop.svg.SVG)rootFObj).createGraphic();
+        doc.appendChild(svg);
+       return doc;
+    }
+}
index 36e9991b576ae81f0df708b6d52713d9c2dd06ee..f1f9673015ed0aee8e41494756eebfc7e118d1e8 100644 (file)
@@ -56,7 +56,7 @@ import org.apache.fop.fo.pagination.*;
 
 public class StandardElementMapping implements ElementMapping {
 
-    public void addToBuilder(FOTreeBuilder builder) {
+    public void addToBuilder(TreeBuilder builder) {
 
        String uri = "http://www.w3.org/1999/XSL/Format";
 
index a98b84f56649738a08b412ee0872f38daf888723..c1d52d1419df1d12402bd4e4bb1b84a78ac94b29 100644 (file)
@@ -57,7 +57,7 @@ import java.util.Hashtable;
 
 public class StandardPropertyListMapping implements PropertyListMapping {
 
-    public void addToBuilder(FOTreeBuilder builder) {
+    public void addToBuilder(TreeBuilder builder) {
 
        String uri = "http://www.w3.org/1999/XSL/Format";
        Hashtable propertyTable = new Hashtable();
diff --git a/src/org/apache/fop/fo/TreeBuilder.java b/src/org/apache/fop/fo/TreeBuilder.java
new file mode 100644 (file)
index 0000000..66391b9
--- /dev/null
@@ -0,0 +1,102 @@
+/*-- $Id$ -- 
+
+ ============================================================================
+                   The Apache Software License, Version 1.1
+ ============================================================================
+    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of  source code must  retain the above copyright  notice,
+    this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+    include  the following  acknowledgment:  "This product includes  software
+    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
+    Alternately, this  acknowledgment may  appear in the software itself,  if
+    and wherever such third-party acknowledgments normally appear.
+ 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+    endorse  or promote  products derived  from this  software without  prior
+    written permission. For written permission, please contact
+    apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+    "Apache" appear  in their name,  without prior written permission  of the
+    Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software  Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+// FOP
+import org.apache.fop.layout.AreaTree;
+import org.apache.fop.messaging.MessageHandler;
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.fo.pagination.Root;
+
+// SAX
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.InputSource;
+import org.xml.sax.Attributes;
+
+// Java
+import java.util.Hashtable;
+import java.util.Stack;
+import java.io.IOException;
+
+/**
+ */
+public interface TreeBuilder {
+
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addMapping(String namespaceURI, String localName, FObj.Maker maker);
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addPropertyList(String namespaceURI, Hashtable list);
+
+    /**
+     * add a mapping from element name to maker.
+     *
+     * @param namespaceURI namespace URI of formatting object element
+     * @param localName local name of formatting object element
+     * @param maker Maker for class representing formatting object
+    */
+    public void addElementPropertyList(String namespaceURI, String localName, Hashtable list);
+
+}