You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by hi...@apache.org on 2001/02/06 15:17:04 UTC

cvs commit: xml-batik/sources/org/apache/batik/transcoder/svg2svg PrettyPrinter.java SVGTranscoder.java

hillion     01/02/06 06:17:04

  Modified:    sources/org/apache/batik/apps/svgpp Main.java
               sources/org/apache/batik/dom/util DOMUtilities.java
               sources/org/apache/batik/transcoder/svg2svg
                        PrettyPrinter.java SVGTranscoder.java
  Log:
  The SVG transcoder can now be used for DOM serialization.
  
  Revision  Changes    Path
  1.3       +2 -1      xml-batik/sources/org/apache/batik/apps/svgpp/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/apps/svgpp/Main.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Main.java	2001/01/23 09:30:31	1.2
  +++ Main.java	2001/02/06 14:17:03	1.3
  @@ -25,7 +25,7 @@
    * svgpp is a pretty-printer for SVG source files.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: Main.java,v 1.2 2001/01/23 09:30:31 hillion Exp $
  + * @version $Id: Main.java,v 1.3 2001/02/06 14:17:03 hillion Exp $
    */
   public class Main {
   
  @@ -112,6 +112,7 @@
               }
               transcoder.transcode(in, out);
           } catch (Exception e) {
  +            e.printStackTrace();
               printUsage();
           }
       }
  
  
  
  1.4       +118 -2    xml-batik/sources/org/apache/batik/dom/util/DOMUtilities.java
  
  Index: DOMUtilities.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/util/DOMUtilities.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DOMUtilities.java	2001/01/02 07:02:31	1.3
  +++ DOMUtilities.java	2001/02/06 14:17:03	1.4
  @@ -8,7 +8,11 @@
   
   package org.apache.batik.dom.util;
   
  +import java.io.IOException;
  +import java.io.Writer;
  +
   import org.apache.batik.util.XMLUtilities;
  +
   import org.w3c.dom.Attr;
   import org.w3c.dom.Document;
   import org.w3c.dom.DOMException;
  @@ -21,7 +25,7 @@
    * A collection of utility functions for the DOM.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: DOMUtilities.java,v 1.3 2001/01/02 07:02:31 hillion Exp $
  + * @version $Id: DOMUtilities.java,v 1.4 2001/02/06 14:17:03 hillion Exp $
    */
   public class DOMUtilities extends XMLUtilities {
       /**
  @@ -31,6 +35,118 @@
       }
   
       /**
  +     * Writes the given document using the given writer.
  +     */
  +    public static void writeDocument(Document doc, Writer w) throws IOException {
  +        for (Node n = doc.getFirstChild();
  +             n != null;
  +             n = n.getNextSibling()) {
  +            writeNode(n, w);
  +        }
  +    }
  +
  +    /**
  +     * Writes a node using the given writer.
  +     */
  +    public static void writeNode(Node n, Writer w) throws IOException {
  +        switch (n.getNodeType()) {
  +        case Node.ELEMENT_NODE:
  +            w.write("<");
  +            w.write(n.getNodeName());
  +
  +            if (n.hasAttributes()) {
  +                NamedNodeMap attr = n.getAttributes();
  +                int len = attr.getLength();
  +                for (int i = 0; i < len; i++) {
  +                    Attr a = (Attr)attr.item(i);
  +                    w.write(" ");
  +                    w.write(a.getNodeName());
  +                    w.write("=\"");
  +                    w.write(contentToString(a.getNodeValue()));
  +                    w.write("\"");
  +                }
  +            }
  +
  +            Node c = n.getFirstChild();
  +            if (c != null) {
  +                w.write(">");
  +                for (; c != null;
  +                     c = c.getNextSibling()) {
  +                    writeNode(c, w);
  +                }
  +                w.write("</");
  +                w.write(n.getNodeName());
  +                w.write(">");
  +            } else {
  +                w.write("/>");
  +            }
  +            break;
  +        case Node.TEXT_NODE:
  +            w.write(contentToString(n.getNodeValue()));
  +            break;
  +        case Node.CDATA_SECTION_NODE:
  +            w.write("<![CDATA[");
  +            w.write(n.getNodeValue());
  +            w.write("]]>");
  +            break;
  +        case Node.ENTITY_REFERENCE_NODE:
  +            w.write("&");
  +            w.write(n.getNodeName());
  +            w.write(";");
  +            break;
  +        case Node.PROCESSING_INSTRUCTION_NODE:
  +            w.write("<?");
  +            w.write(n.getNodeName());
  +            w.write(n.getNodeValue());
  +            w.write("?>");
  +            break;
  +        case Node.COMMENT_NODE:
  +            w.write("<!--");
  +            w.write(n.getNodeValue());
  +            w.write("-->");
  +            break;
  +        case Node.DOCUMENT_TYPE_NODE:
  +            break;
  +        default:
  +            throw new Error("Internal error (" + n.getNodeType() + ")");
  +        }
  +    }
  +
  +    /**
  +     * Returns the given content value transformed to replace invalid
  +     * characters with entities.
  +     */
  +    public static String contentToString(String s) {
  +        StringBuffer result = new StringBuffer();
  +
  +        for (int i = 0; i < s.length(); i++) {
  +            char c = s.charAt(i);
  +
  +            switch (c) {
  +            case '<':
  +                result.append("&lt;");
  +                break;
  +            case '>':
  +                result.append("&gt;");
  +                break;
  +            case '&':
  +                result.append("&amp;");
  +                break;
  +            case '"':
  +                result.append("&quot;");
  +                break;
  +            case '\'':
  +                result.append("&apos;");
  +                break;
  +            default:
  +                result.append(c);
  +            }
  +        }
  +        
  +        return result.toString();
  +    }
  +
  +    /**
        * Deep clones a document using the given DOM implementation.
        */
       public static Document deepCloneDocument(Document doc, DOMImplementation impl) {
  @@ -99,7 +215,7 @@
           case Node.COMMENT_NODE:
               return doc.createComment(n.getNodeValue());
           default:
  -            throw  new Error("Internal error (" + n.getNodeType() + ")");
  +            throw new Error("Internal error (" + n.getNodeType() + ")");
           }
       }
   
  
  
  
  1.2       +3 -2      xml-batik/sources/org/apache/batik/transcoder/svg2svg/PrettyPrinter.java
  
  Index: PrettyPrinter.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/transcoder/svg2svg/PrettyPrinter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PrettyPrinter.java	2001/01/23 09:30:32	1.1
  +++ PrettyPrinter.java	2001/02/06 14:17:04	1.2
  @@ -28,7 +28,7 @@
    * This class represents an SVG source files pretty-printer.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PrettyPrinter.java,v 1.1 2001/01/23 09:30:32 hillion Exp $
  + * @version $Id: PrettyPrinter.java,v 1.2 2001/02/06 14:17:04 hillion Exp $
    */
   public class PrettyPrinter {
   
  @@ -596,6 +596,7 @@
                   if (t != LexicalUnits.END_CHAR) {
                       throw fatalError("end", null);
                   }
  +                scanner.next();
                   output.printDoctypeEnd(endSpace);
               } else {
                   if (doctypeOption == DOCTYPE_CHANGE) {
  @@ -704,8 +705,8 @@
                       throw fatalError("end", null);
                   }
               }
  +            scanner.next();
           }
  -        scanner.next();
       }
   
       /**
  
  
  
  1.2       +23 -6     xml-batik/sources/org/apache/batik/transcoder/svg2svg/SVGTranscoder.java
  
  Index: SVGTranscoder.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/transcoder/svg2svg/SVGTranscoder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SVGTranscoder.java	2001/01/23 09:30:32	1.1
  +++ SVGTranscoder.java	2001/02/06 14:17:04	1.2
  @@ -9,9 +9,12 @@
   package org.apache.batik.transcoder.svg2svg;
   
   import java.io.IOException;
  +import java.io.StringReader;
  +import java.io.StringWriter;
   import java.io.Reader;
   import java.io.Writer;
   
  +import org.apache.batik.dom.util.DOMUtilities;
   import org.apache.batik.transcoder.AbstractTranscoder;
   import org.apache.batik.transcoder.ErrorHandler;
   import org.apache.batik.transcoder.TranscoderException;
  @@ -21,11 +24,13 @@
   
   import org.apache.batik.xml.scanner.LexicalException;
   
  +import org.w3c.dom.Document;
  +
   /**
    * This class is a trancoder from SVG to SVG.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGTranscoder.java,v 1.1 2001/01/23 09:30:32 hillion Exp $
  + * @version $Id: SVGTranscoder.java,v 1.2 2001/02/06 14:17:04 hillion Exp $
    */
   public class SVGTranscoder extends AbstractTranscoder {
   
  @@ -137,14 +142,26 @@
        */
       public void transcode(TranscoderInput input, TranscoderOutput output)
           throws TranscoderException {
  -        // !!! TODO: other cases.
  -        if (input.getReader() == null) {
  -            throw new Error("Reader expected");
  +        Reader r = input.getReader();
  +        Writer w = output.getWriter();
  +
  +        if (r == null) {
  +            Document d = input.getDocument();
  +            if (d == null) {
  +                throw new Error("Reader or Document expected");
  +            }
  +            StringWriter sw = new StringWriter();
  +            try {
  +                DOMUtilities.writeDocument(d, sw);
  +            } catch (IOException e) {
  +                throw new Error("IO");
  +            }
  +            r = new StringReader(sw.toString());
           }
  -        if (output.getWriter() == null) {
  +        if (w == null) {
               throw new Error("Writer expected");
           }
  -        prettyPrint(input.getReader(), output.getWriter());
  +        prettyPrint(r, w);
       }