From 1a72cdae348d8919e6b03ac7123254f562d68705 Mon Sep 17 00:00:00 2001 From: phred Date: Fri, 8 Apr 2011 09:52:52 -0500 Subject: [PATCH 01/12] added support for max URI length new command-line flag: -u, --maxuri length --- src/net/nczonline/web/cssembed/CSSEmbed.java | 15 +++++++++++++-- .../nczonline/web/cssembed/CSSURLEmbedder.java | 11 +++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index 92d67f3..b374d0e 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -60,6 +60,7 @@ public static void main(String[] args) { CmdLineParser.Option outputFilenameOpt = parser.addStringOption('o', "output"); CmdLineParser.Option mhtmlOpt = parser.addBooleanOption("mhtml"); CmdLineParser.Option mhtmlRootOpt = parser.addStringOption("mhtmlroot"); + CmdLineParser.Option uriLengthOpt = parser.addIntegerOption('u', "maxuri"); try { @@ -111,9 +112,17 @@ public static void main(String[] args) { if (mhtml && mhtmlRoot == null){ throw new Exception("Must use --mhtmlroot when using --mhtml."); } + int maxurilength = 0; + Integer uriOption = ((Integer) parser.getOptionValue(uriLengthOpt)); + if (uriOption != null){ + maxurilength = uriOption.intValue(); + if (maxurilength < 0){ + maxurilength = 0; + } + } - CSSURLEmbedder embedder = new CSSURLEmbedder(in, options, verbose); + CSSURLEmbedder embedder = new CSSURLEmbedder(in, options, verbose, maxurilength); embedder.setMHTMLRoot(mhtmlRoot); //close in case writing to the same file @@ -198,6 +207,8 @@ private static void usage() { + " --mhtmlroot Use as the MHTML root for the file.\n" + " -v, --verbose Display informational messages and warnings.\n" + " --root Prepends to all relative URLs.\n" - + " -o Place the output into . Defaults to stdout."); + + " -o Place the output into . Defaults to stdout.\n" + + " -u, --maxuri length Maximum length of data URI to use.\n" + ); } } diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index 6cc6dd6..26773d8 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -60,6 +60,7 @@ public class CSSURLEmbedder { private int options = 1; private String mhtmlRoot = ""; private String outputFilename = ""; + private int maxurilength; //-------------------------------------------------------------------------- // Constructors @@ -78,9 +79,14 @@ public CSSURLEmbedder(Reader in, boolean verbose) throws IOException { } public CSSURLEmbedder(Reader in, int options, boolean verbose) throws IOException { + this(in,1,verbose,0); + } + + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength) throws IOException { this.code = readCode(in); this.verbose = verbose; this.options = options; + this.maxurilength = maxurilength; } //-------------------------------------------------------------------------- @@ -222,6 +228,11 @@ public void embedImages(Writer out, String root) throws IOException { if (uriString.length() > 32768){ System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than 32KB. IE8 can't display data URI images this large. Skipping."); builder.append(url); + } else if (maxurilength > 0 && uriString.length() > maxurilength){ + if (verbose) { + System.err.println("[INFO] File " + newUrl + " creates a data URI longer than " + maxurilength + " characters. Skipping."); + } + builder.append(url); } else { /* From 1670022cc3893fdf41108d1d714f1a5205892604 Mon Sep 17 00:00:00 2001 From: phred Date: Fri, 8 Apr 2011 10:02:51 -0500 Subject: [PATCH 02/12] removed unneed parentheses --- src/net/nczonline/web/cssembed/CSSEmbed.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index b374d0e..cea1d99 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -113,7 +113,7 @@ public static void main(String[] args) { throw new Exception("Must use --mhtmlroot when using --mhtml."); } int maxurilength = 0; - Integer uriOption = ((Integer) parser.getOptionValue(uriLengthOpt)); + Integer uriOption = (Integer) parser.getOptionValue(uriLengthOpt); if (uriOption != null){ maxurilength = uriOption.intValue(); if (maxurilength < 0){ From cf25dd8d058e75c7a77c896bdb0ff6ddf0eea135 Mon Sep 17 00:00:00 2001 From: phred Date: Fri, 8 Apr 2011 10:22:32 -0500 Subject: [PATCH 03/12] don't prepend empty mhtml headers --- src/net/nczonline/web/cssembed/CSSURLEmbedder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index 26773d8..32a0d63 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -153,6 +153,7 @@ public void embedImages(Writer out, String root) throws IOException { StringBuilder builder = new StringBuilder(); StringBuilder mhtmlHeader = new StringBuilder(); HashMap foundMedia = new HashMap(); + int conversions = 0; String line; int lineNum = 1; @@ -257,6 +258,7 @@ public void embedImages(Writer out, String root) throws IOException { builder.append(getMHTMLPath()); builder.append("!"); builder.append(entryName); + conversions++; } else if (hasOption(DATAURI_OPTION)){ builder.append(uriString); } @@ -282,7 +284,7 @@ public void embedImages(Writer out, String root) throws IOException { } reader.close(); - if (hasOption(MHTML_OPTION)){ + if (hasOption(MHTML_OPTION) && conversions > 0){ //Add one more boundary to fix IE/Vista issue mhtmlHeader.append("\n--"); From 23686bf55c76975eb09dbd69c3f8056a5dc89ac0 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Mon, 18 Apr 2011 22:07:44 -0700 Subject: [PATCH 04/12] Pass options along instead of blowing them away. --- src/net/nczonline/web/cssembed/CSSURLEmbedder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index eee9450..cda067f 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -81,7 +81,7 @@ public CSSURLEmbedder(Reader in, boolean verbose) throws IOException { } public CSSURLEmbedder(Reader in, int options, boolean verbose) throws IOException { - this(in,1,verbose,0); + this(in,options,verbose,0); } public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength) throws IOException { From 34d41a1cfd7de4fb4f2cde580e394bc8ac8c4823 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Mon, 18 Apr 2011 22:17:51 -0700 Subject: [PATCH 05/12] Issue #20 Fix testRegularUrlWithMhtml Add testAbsoluteLocalFileUnderMaxSize Add testAbsoluteLocalFileOverMaxSize --- .../web/cssembed/CSSURLEmbedderTest.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java index 8ffa14a..1ba73ac 100644 --- a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java +++ b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java @@ -140,6 +140,32 @@ public void testAbsoluteLocalFileWithMissingFilesEnabled() throws IOException { assertEquals(code, result); } + @Test + public void testAbsoluteLocalFileUnderMaxSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals("background: url(" + folderDataURI + ");", result); + } + + @Test + public void testAbsoluteLocalFileOverMaxSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals(code, result); + } + @Test public void testReadFromAndWriteToSameFile() throws IOException { String filename = CSSURLEmbedderTest.class.getResource("samefiletest.css").getPath().replace("%20", " "); @@ -176,9 +202,6 @@ public void testRegularUrlWithMhtml() throws IOException { String result = writer.toString(); - assertEquals("/*\nContent-Type: multipart/related; boundary=\"" + CSSURLEmbedder.MHTML_SEPARATOR + - "\"\n\n" + - "\n--" + CSSURLEmbedder.MHTML_SEPARATOR + "--\n" + - "*/\nbackground: url(folder.txt);", result); + assertEquals("background: url(folder.txt);", result); } } \ No newline at end of file From a4f622dd7ed65a241935601f8fae73ad3f401ee5 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Tue, 19 Apr 2011 14:58:23 -0700 Subject: [PATCH 06/12] Add -i/--image-size parameter, which lets you only convert files under a certain number of bytes. This tackles the first of two options Nicholas mentioned in Issue #6 --- src/net/nczonline/web/cssembed/CSSEmbed.java | 19 +++++++++-- .../web/cssembed/CSSURLEmbedder.java | 20 ++++++++--- .../web/cssembed/CSSURLEmbedderTest.java | 34 ++++++++++++++++--- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index 7ed20b8..d93b4c9 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -64,6 +64,7 @@ public static void main(String[] args) { CmdLineParser.Option mhtmlRootOpt = parser.addStringOption("mhtmlroot"); CmdLineParser.Option skipMissingOpt = parser.addBooleanOption("skip-missing"); CmdLineParser.Option uriLengthOpt = parser.addIntegerOption('u', "maxuri"); + CmdLineParser.Option imageSizeOpt = parser.addIntegerOption('i', "image-size"); try { @@ -114,6 +115,8 @@ public static void main(String[] args) { if (mhtml && mhtmlRoot == null){ throw new Exception("Must use --mhtmlroot when using --mhtml."); } + + //maximum length allowed for generated dataURI int maxurilength = 0; Integer uriOption = (Integer) parser.getOptionValue(uriLengthOpt); if (uriOption != null){ @@ -123,13 +126,23 @@ public static void main(String[] args) { } } + //maximum size allowed for image files + int maximagesize = 0; + Integer imageSizeOption = (Integer) parser.getOptionValue(imageSizeOpt); + if (imageSizeOption != null){ + maximagesize = imageSizeOption.intValue(); + if (maximagesize < 0){ + maximagesize = 0; + } + } + //are missing files ok? boolean skipMissingFiles = parser.getOptionValue(skipMissingOpt) != null; if(skipMissingFiles) { options = options | CSSURLEmbedder.SKIP_MISSING_OPTION; } - CSSURLEmbedder embedder = new CSSURLEmbedder(in, options, verbose, maxurilength); + CSSURLEmbedder embedder = new CSSURLEmbedder(in, options, verbose, maxurilength, maximagesize); embedder.setMHTMLRoot(mhtmlRoot); //close in case writing to the same file @@ -173,8 +186,6 @@ public static void main(String[] args) { out = new OutputStreamWriter(bytes, charset); } - - //set verbose option embedder.embedImages(out, root); @@ -191,6 +202,7 @@ public static void main(String[] args) { if (out != null) { try { out.close(); + bytes.writeTo(new FileOutputStream(outputFilename)); } catch (IOException e) { System.err.println("[ERROR] " + e.getMessage()); @@ -219,6 +231,7 @@ private static void usage() { + " --root Prepends to all relative URLs.\n" + " --skip-missing Don't throw an error for missing image files.\n" + " -u, --maxuri length Maximum length of data URI to use.\n" + + " -i, --image-size Maximum image size (in bytes) to convert.\n" + " -o Place the output into . Defaults to stdout." ); } diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index cda067f..9c14061 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -63,6 +63,7 @@ public class CSSURLEmbedder { private String mhtmlRoot = ""; private String outputFilename = ""; private int maxurilength; + private int maximagesize; //-------------------------------------------------------------------------- // Constructors @@ -81,14 +82,15 @@ public CSSURLEmbedder(Reader in, boolean verbose) throws IOException { } public CSSURLEmbedder(Reader in, int options, boolean verbose) throws IOException { - this(in,options,verbose,0); + this(in,options,verbose,0,0); } - public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength) throws IOException { + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength, int maximagesize) throws IOException { this.code = readCode(in); this.verbose = verbose; this.options = options; this.maxurilength = maxurilength; + this.maximagesize = maximagesize; } //-------------------------------------------------------------------------- @@ -338,9 +340,19 @@ private String getImageURIString(String url, String originalUrl) throws IOExcept if (verbose && !file.isFile()){ System.err.println("[INFO] Could not find file '" + file.getCanonicalPath() + "'."); - } + } - DataURIGenerator.generate(new File(url), writer); + //check file size if we've been asked to + if(this.maximagesize > 0 && file.length() > this.maximagesize) { + if(verbose) { + System.err.println("[INFO] File " + originalUrl + " is larger than " + this.maximagesize + " bytes. Skipping."); + } + + writer.write(originalUrl); + + } else { + DataURIGenerator.generate(new File(url), writer); + } } if (verbose){ diff --git a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java index 1ba73ac..9154799 100644 --- a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java +++ b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java @@ -141,12 +141,12 @@ public void testAbsoluteLocalFileWithMissingFilesEnabled() throws IOException { } @Test - public void testAbsoluteLocalFileUnderMaxSize() throws IOException { + public void testAbsoluteLocalFileUnderMaxLength() throws IOException { String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); String code = "background: url(folder.png);"; StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000, 0); embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); String result = writer.toString(); @@ -154,12 +154,38 @@ public void testAbsoluteLocalFileUnderMaxSize() throws IOException { } @Test - public void testAbsoluteLocalFileOverMaxSize() throws IOException { + public void testAbsoluteLocalFileOverMaxLength() throws IOException { String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); String code = "background: url(folder.png);"; StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200, 0); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals(code, result); + } + + @Test + public void testAbsoluteLocalFileUnderMaxImageSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 0, 300); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals("background: url(" + folderDataURI + ");", result); + } + + @Test + public void testAbsoluteLocalFileOverMaxImageSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 0, 200); embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); String result = writer.toString(); From 2b4fae39896ab05a21d246eb75e4543e373b16e7 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Tue, 19 Apr 2011 14:52:21 -0700 Subject: [PATCH 07/12] My changes to use a ByteArrayOutputStream would cause a NullPointerException if you didn't specify an output file. This fixes that, yikes. --- src/net/nczonline/web/cssembed/CSSEmbed.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index d93b4c9..9a211c4 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -203,7 +203,9 @@ public static void main(String[] args) { try { out.close(); - bytes.writeTo(new FileOutputStream(outputFilename)); + if(bytes.size() > 0) { + bytes.writeTo(new FileOutputStream(outputFilename)); + } } catch (IOException e) { System.err.println("[ERROR] " + e.getMessage()); if (verbose){ From 473d5852730318f59984b4dcca1242c2a30dd75a Mon Sep 17 00:00:00 2001 From: "Nicholas C. Zakas" Date: Sat, 23 Apr 2011 17:45:22 -0700 Subject: [PATCH 08/12] Incremented version number --- ant.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ant.properties b/ant.properties index 245a847..cd60a09 100644 --- a/ant.properties +++ b/ant.properties @@ -14,7 +14,7 @@ class.version = 1.5 #CSSEmbed properties cssembed.name = cssembed -cssembed.version = 0.3.5 +cssembed.version = 0.3.6 cssembed.jar = ${cssembed.name}-${cssembed.version}.jar cssembed.main = net.nczonline.web.cssembed.CSSEmbed From 5670dd12c8cf9869309411950a672f54d8aa3da2 Mon Sep 17 00:00:00 2001 From: "Nicholas C. Zakas" Date: Sat, 23 Apr 2011 18:16:33 -0700 Subject: [PATCH 09/12] Merge branch 'master' of git://github.com/nzakas/cssembed into max-image-size Conflicts: src/net/nczonline/web/cssembed/CSSEmbed.java src/net/nczonline/web/cssembed/CSSURLEmbedder.java --- src/net/nczonline/web/cssembed/CSSEmbed.java | 35 ++++++++++++------- .../web/cssembed/CSSURLEmbedder.java | 25 ++++++++++--- .../web/cssembed/CSSURLEmbedderTest.java | 26 ++++++++++++++ 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index 9a211c4..89d2b2c 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -105,7 +105,17 @@ public static void main(String[] args) { inputFilename = fileArgs[0]; in = new InputStreamReader(new FileInputStream(inputFilename), charset); } - + + //determine if there's a maximum URI length + int uriLength = CSSURLEmbedder.DEFAULT_MAX_URI_LENGTH; + Integer maxUriLength = (Integer) parser.getOptionValue(uriLengthOpt); + if (maxUriLength != null){ + uriLength = maxUriLength.intValue(); + if (uriLength < 0){ + uriLength = 0; + } + } + //determine if MHTML mode is on boolean mhtml = parser.getOptionValue(mhtmlOpt) != null; if(mhtml){ @@ -224,17 +234,16 @@ private static void usage() { System.out.println( "\nUsage: java -jar cssembed-x.y.z.jar [options] [input file]\n\n" - + "Global Options\n" - + " -h, --help Displays this information.\n" - + " --charset Character set of the input file.\n" - + " --mhtml Enable MHTML mode.\n" - + " --mhtmlroot Use as the MHTML root for the file.\n" - + " -v, --verbose Display informational messages and warnings.\n" - + " --root Prepends to all relative URLs.\n" - + " --skip-missing Don't throw an error for missing image files.\n" - + " -u, --maxuri length Maximum length of data URI to use.\n" - + " -i, --image-size Maximum image size (in bytes) to convert.\n" - + " -o Place the output into . Defaults to stdout." - ); + + "Global Options\n" + + " -h, --help Displays this information.\n" + + " --charset Character set of the input file.\n" + + " --mhtml Enable MHTML mode.\n" + + " --mhtmlroot Use as the MHTML root for the file.\n" + + " -v, --verbose Display informational messages and warnings.\n" + + " --root Prepends to all relative URLs.\n" + + " --skip-missing Don't throw an error for missing image files.\n" + + " --max-uri-length len Maximum length for a data URI. Defaults to 32768.\n" + + " -i, --image-size Maximum image size (in bytes) to convert.\n" + + " -o Place the output into . Defaults to stdout."); } } diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index 9c14061..ec0f321 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -45,6 +45,8 @@ public class CSSURLEmbedder { public static final int DATAURI_OPTION = 1; public static final int MHTML_OPTION = 2; public static final int SKIP_MISSING_OPTION = 4; + + public static final int DEFAULT_MAX_URI_LENGTH = 32768; protected static String MHTML_SEPARATOR = "CSSEmbed_Image"; @@ -62,7 +64,7 @@ public class CSSURLEmbedder { private int options = 1; private String mhtmlRoot = ""; private String outputFilename = ""; - private int maxurilength; + private int maxUriLength = DEFAULT_MAX_URI_LENGTH; //IE8 only allows dataURIs up to 32KB private int maximagesize; //-------------------------------------------------------------------------- @@ -92,7 +94,14 @@ public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength, this.maxurilength = maxurilength; this.maximagesize = maximagesize; } - + + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLength) throws IOException { + this.code = readCode(in); + this.verbose = verbose; + this.options = options; + this.maxUriLength = maxUriLength; + } + //-------------------------------------------------------------------------- // Get/Set verbose flag //-------------------------------------------------------------------------- @@ -161,6 +170,7 @@ public void embedImages(Writer out, String root) throws IOException { String line; int lineNum = 1; + int conversions = 0; //create initial MHTML code if (hasOption(MHTML_OPTION)){ @@ -229,9 +239,11 @@ public void embedImages(Writer out, String root) throws IOException { //if it doesn't begin with data:, it's not a data URI if (uriString.startsWith("data:")){ - //IE8 only allows dataURIs up to 32KB - if (uriString.length() > 32768){ - System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than 32KB. IE8 can't display data URI images this large. Skipping."); + + if (maxUriLength > 0 && uriString.length() > maxUriLength) { + if (verbose){ + System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than " + maxUriLength + " bytes. Skipping."); + } builder.append(url); } else if (maxurilength > 0 && uriString.length() > maxurilength){ if (verbose) { @@ -299,6 +311,9 @@ public void embedImages(Writer out, String root) throws IOException { mhtmlHeader.append("*/\n"); out.write(mhtmlHeader.toString()); } + + System.err.println("[INFO] Converted " + conversions + " images to data URIs."); + out.write(builder.toString()); } diff --git a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java index 9154799..082dc8f 100644 --- a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java +++ b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java @@ -139,6 +139,32 @@ public void testAbsoluteLocalFileWithMissingFilesEnabled() throws IOException { String result = writer.toString(); assertEquals(code, result); } + + @Test + public void testAbsoluteLocalFileUnderMaxSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals("background: url(" + folderDataURI + ");", result); + } + + @Test + public void testAbsoluteLocalFileOverMaxSize() throws IOException { + String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); + String code = "background: url(folder.png);"; + + StringWriter writer = new StringWriter(); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200); + embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); + + String result = writer.toString(); + assertEquals(code, result); + } @Test public void testAbsoluteLocalFileUnderMaxLength() throws IOException { From 5139afb6a600150b21ee745aead083e05561f7cc Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 23 Apr 2011 22:35:51 -0700 Subject: [PATCH 10/12] Standardize some variable naming Clean up tests a bit --- .../web/cssembed/CSSURLEmbedder.java | 37 ++++++++----------- .../web/cssembed/CSSURLEmbedderTest.java | 30 +-------------- 2 files changed, 18 insertions(+), 49 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index ec0f321..680f67a 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -64,8 +64,8 @@ public class CSSURLEmbedder { private int options = 1; private String mhtmlRoot = ""; private String outputFilename = ""; - private int maxUriLength = DEFAULT_MAX_URI_LENGTH; //IE8 only allows dataURIs up to 32KB - private int maximagesize; + private int maxUriLengthh = DEFAULT_MAX_URI_LENGTH; //IE8 only allows dataURIs up to 32KB + private int maxImageSize; //-------------------------------------------------------------------------- // Constructors @@ -80,26 +80,23 @@ public CSSURLEmbedder(Reader in, int options) throws IOException { } public CSSURLEmbedder(Reader in, boolean verbose) throws IOException { - this(in,1,verbose); + this(in, 1, verbose); } public CSSURLEmbedder(Reader in, int options, boolean verbose) throws IOException { - this(in,options,verbose,0,0); + this(in, options, verbose, 0); } - public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxurilength, int maximagesize) throws IOException { - this.code = readCode(in); - this.verbose = verbose; - this.options = options; - this.maxurilength = maxurilength; - this.maximagesize = maximagesize; + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLengthh) throws IOException { + this(in, options, verbose, maxUriLengthh, 0); } - - public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLength) throws IOException { + + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLengthh, int maxImageSize) throws IOException { this.code = readCode(in); this.verbose = verbose; this.options = options; - this.maxUriLength = maxUriLength; + this.maxUriLengthh = maxUriLengthh; + this.maxImageSize = maxImageSize; } //-------------------------------------------------------------------------- @@ -166,8 +163,6 @@ public void embedImages(Writer out, String root) throws IOException { StringBuilder builder = new StringBuilder(); StringBuilder mhtmlHeader = new StringBuilder(); HashMap foundMedia = new HashMap(); - int conversions = 0; - String line; int lineNum = 1; int conversions = 0; @@ -240,14 +235,14 @@ public void embedImages(Writer out, String root) throws IOException { if (uriString.startsWith("data:")){ - if (maxUriLength > 0 && uriString.length() > maxUriLength) { + if (maxUriLengthh > 0 && uriString.length() > maxUriLengthh) { if (verbose){ - System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than " + maxUriLength + " bytes. Skipping."); + System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than " + maxUriLengthh + " bytes. Skipping."); } builder.append(url); - } else if (maxurilength > 0 && uriString.length() > maxurilength){ + } else if (maxUriLengthh > 0 && uriString.length() > maxUriLengthh){ if (verbose) { - System.err.println("[INFO] File " + newUrl + " creates a data URI longer than " + maxurilength + " characters. Skipping."); + System.err.println("[INFO] File " + newUrl + " creates a data URI longer than " + maxUriLengthh + " characters. Skipping."); } builder.append(url); } else { @@ -358,9 +353,9 @@ private String getImageURIString(String url, String originalUrl) throws IOExcept } //check file size if we've been asked to - if(this.maximagesize > 0 && file.length() > this.maximagesize) { + if(this.maxImageSize > 0 && file.length() > this.maxImageSize) { if(verbose) { - System.err.println("[INFO] File " + originalUrl + " is larger than " + this.maximagesize + " bytes. Skipping."); + System.err.println("[INFO] File " + originalUrl + " is larger than " + this.maxImageSize + " bytes. Skipping."); } writer.write(originalUrl); diff --git a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java index 082dc8f..8cbf764 100644 --- a/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java +++ b/tests/net/nczonline/web/cssembed/CSSURLEmbedderTest.java @@ -140,39 +140,13 @@ public void testAbsoluteLocalFileWithMissingFilesEnabled() throws IOException { assertEquals(code, result); } - @Test - public void testAbsoluteLocalFileUnderMaxSize() throws IOException { - String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); - String code = "background: url(folder.png);"; - - StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000); - embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); - - String result = writer.toString(); - assertEquals("background: url(" + folderDataURI + ");", result); - } - - @Test - public void testAbsoluteLocalFileOverMaxSize() throws IOException { - String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); - String code = "background: url(folder.png);"; - - StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200); - embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); - - String result = writer.toString(); - assertEquals(code, result); - } - @Test public void testAbsoluteLocalFileUnderMaxLength() throws IOException { String filename = CSSURLEmbedderTest.class.getResource("folder.png").getPath().replace("%20", " "); String code = "background: url(folder.png);"; StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000, 0); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 1000); embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); String result = writer.toString(); @@ -185,7 +159,7 @@ public void testAbsoluteLocalFileOverMaxLength() throws IOException { String code = "background: url(folder.png);"; StringWriter writer = new StringWriter(); - embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200, 0); + embedder = new CSSURLEmbedder(new StringReader(code), CSSURLEmbedder.DATAURI_OPTION, true, 200); embedder.embedImages(writer, filename.substring(0, filename.lastIndexOf("/")+1)); String result = writer.toString(); From 6c7d9a7f8fcfde931dfeba3a55f700d3fb886526 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 23 Apr 2011 22:40:51 -0700 Subject: [PATCH 11/12] maxUriLengthh -> maxUriLength (fat-fingered that one whoops) --- .../nczonline/web/cssembed/CSSURLEmbedder.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java index 680f67a..1cce781 100644 --- a/src/net/nczonline/web/cssembed/CSSURLEmbedder.java +++ b/src/net/nczonline/web/cssembed/CSSURLEmbedder.java @@ -64,7 +64,7 @@ public class CSSURLEmbedder { private int options = 1; private String mhtmlRoot = ""; private String outputFilename = ""; - private int maxUriLengthh = DEFAULT_MAX_URI_LENGTH; //IE8 only allows dataURIs up to 32KB + private int maxUriLength = DEFAULT_MAX_URI_LENGTH; //IE8 only allows dataURIs up to 32KB private int maxImageSize; //-------------------------------------------------------------------------- @@ -87,15 +87,15 @@ public CSSURLEmbedder(Reader in, int options, boolean verbose) throws IOExceptio this(in, options, verbose, 0); } - public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLengthh) throws IOException { - this(in, options, verbose, maxUriLengthh, 0); + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLength) throws IOException { + this(in, options, verbose, maxUriLength, 0); } - public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLengthh, int maxImageSize) throws IOException { + public CSSURLEmbedder(Reader in, int options, boolean verbose, int maxUriLength, int maxImageSize) throws IOException { this.code = readCode(in); this.verbose = verbose; this.options = options; - this.maxUriLengthh = maxUriLengthh; + this.maxUriLength = maxUriLength; this.maxImageSize = maxImageSize; } @@ -235,14 +235,14 @@ public void embedImages(Writer out, String root) throws IOException { if (uriString.startsWith("data:")){ - if (maxUriLengthh > 0 && uriString.length() > maxUriLengthh) { + if (maxUriLength > 0 && uriString.length() > maxUriLength) { if (verbose){ - System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than " + maxUriLengthh + " bytes. Skipping."); + System.err.println("[WARNING] File " + newUrl + " creates a data URI larger than " + maxUriLength + " bytes. Skipping."); } builder.append(url); - } else if (maxUriLengthh > 0 && uriString.length() > maxUriLengthh){ + } else if (maxUriLength > 0 && uriString.length() > maxUriLength){ if (verbose) { - System.err.println("[INFO] File " + newUrl + " creates a data URI longer than " + maxUriLengthh + " characters. Skipping."); + System.err.println("[INFO] File " + newUrl + " creates a data URI longer than " + maxUriLength + " characters. Skipping."); } builder.append(url); } else { From 62288c75947a5f8a811f64b1a7ec523e99ea9d2f Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Mon, 25 Apr 2011 12:06:39 -0700 Subject: [PATCH 12/12] Variable rename, code block shuffle --- src/net/nczonline/web/cssembed/CSSEmbed.java | 30 +++++++------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/net/nczonline/web/cssembed/CSSEmbed.java b/src/net/nczonline/web/cssembed/CSSEmbed.java index 19dec60..1d41cdf 100644 --- a/src/net/nczonline/web/cssembed/CSSEmbed.java +++ b/src/net/nczonline/web/cssembed/CSSEmbed.java @@ -115,6 +115,16 @@ public static void main(String[] args) { uriLength = 0; } } + + //maximum size allowed for image files + int imageSize = 0; + Integer imageSizeOption = (Integer) parser.getOptionValue(imageSizeOpt); + if (imageSizeOption != null){ + imageSize = imageSizeOption.intValue(); + if (imageSize < 0){ + imageSize = 0; + } + } //determine if MHTML mode is on boolean mhtml = parser.getOptionValue(mhtmlOpt) != null; @@ -126,26 +136,6 @@ public static void main(String[] args) { throw new Exception("Must use --mhtmlroot when using --mhtml."); } - //maximum length allowed for generated dataURI - int maxurilength = 0; - Integer uriOption = (Integer) parser.getOptionValue(uriLengthOpt); - if (uriOption != null){ - maxurilength = uriOption.intValue(); - if (maxurilength < 0){ - maxurilength = 0; - } - } - - //maximum size allowed for image files - int maximagesize = 0; - Integer imageSizeOption = (Integer) parser.getOptionValue(imageSizeOpt); - if (imageSizeOption != null){ - maximagesize = imageSizeOption.intValue(); - if (maximagesize < 0){ - maximagesize = 0; - } - } - //are missing files ok? boolean skipMissingFiles = parser.getOptionValue(skipMissingOpt) != null; if(skipMissingFiles) {