summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/kitfox/salamander/parser/SVGParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/kitfox/salamander/parser/SVGParser.java')
-rwxr-xr-xsrc/main/java/com/kitfox/salamander/parser/SVGParser.java42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/main/java/com/kitfox/salamander/parser/SVGParser.java b/src/main/java/com/kitfox/salamander/parser/SVGParser.java
index efdf6b9..d588b08 100755
--- a/src/main/java/com/kitfox/salamander/parser/SVGParser.java
+++ b/src/main/java/com/kitfox/salamander/parser/SVGParser.java
@@ -9,9 +9,15 @@
package com.kitfox.salamander.parser;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
@@ -33,7 +39,12 @@ public class SVGParser
{
}
- public static void parse(File source, SVGParserListener listener, boolean skipUpToDateFiles)
+ /**
+ * Parse an SVG document. The document may be either uncompressed XML (.svg)
+ * or a zipped document (.svgz). This routine will automatically detect
+ * zipped documents and unzip them.
+ */
+ public static void parse(File source, SVGParserListener listener)
{
try
{
@@ -42,7 +53,34 @@ public class SVGParser
SVGParserHandler handler = new SVGParserHandler(listener);
parser.setContentHandler(handler);
- InputSource is = new InputSource(new FileInputStream(source));
+ FileInputStream fis = new FileInputStream(source);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ bis.mark(4);
+ //Check for gzip magic number
+ DataInputStream din = new DataInputStream(bis);
+ long magicNumber = din.readLong();
+ bis.reset();
+
+ InputStream svgStream;
+ if ((int)magicNumber == 0x4b50)
+ {
+ //PK Zip file
+ ZipInputStream zin = new ZipInputStream(bis);
+ ZipEntry entry = zin.getNextEntry();
+ byte[] buf = new byte[(int)entry.getSize()];
+ for (int offset = 0; offset < buf.length; offset += zin.read(buf, offset, buf.length - offset));
+ zin.closeEntry();
+ zin.close();
+
+ svgStream = new ByteArrayInputStream(buf);
+ }
+ else
+ {
+ //Treat input as uncompressed XML
+ svgStream = bis;
+ }
+
+ InputSource is = new InputSource(svgStream);
parser.parse(is);
}