From a53d64943cb30984b5d432c7a4067cc7c4a26e8a Mon Sep 17 00:00:00 2001 From: Pierre-Etienne Poirot Date: Thu, 17 Dec 2015 00:10:44 +1300 Subject: [PATCH 1/3] Convert to a Gradle build --- .gitignore | 3 +++ build.gradle | 17 +++++++++++++++++ settings.gradle | 1 + .../java/andyr}/csscompressor/Compressor.java | 0 .../andyr}/csscompressor/CssCompressor.java | 0 5 files changed, 21 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 settings.gradle rename {andyr => src/main/java/andyr}/csscompressor/Compressor.java (100%) rename {andyr => src/main/java/andyr}/csscompressor/CssCompressor.java (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0d53d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.gradle +.idea +build diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..187e6d1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' + +repositories { + mavenCentral() + maven { + url 'https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/' + } +} + +dependencies { + compile 'net.sf:jargs:1.0' +} + +compileJava { + sourceCompatibility = 1.7 + targetCompatibility = 1.7 +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..9e32a7c --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "csscompressor" diff --git a/andyr/csscompressor/Compressor.java b/src/main/java/andyr/csscompressor/Compressor.java similarity index 100% rename from andyr/csscompressor/Compressor.java rename to src/main/java/andyr/csscompressor/Compressor.java diff --git a/andyr/csscompressor/CssCompressor.java b/src/main/java/andyr/csscompressor/CssCompressor.java similarity index 100% rename from andyr/csscompressor/CssCompressor.java rename to src/main/java/andyr/csscompressor/CssCompressor.java From d626242d22a9570ede4288e2ba947d6bc72442a9 Mon Sep 17 00:00:00 2001 From: Pierre-Etienne Poirot Date: Thu, 17 Dec 2015 00:11:04 +1300 Subject: [PATCH 2/3] Add unit tests --- build.gradle | 1 + .../csscompressor/CssCompressorTest.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/test/java/andyr/csscompressor/CssCompressorTest.java diff --git a/build.gradle b/build.gradle index 187e6d1..3462462 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,7 @@ repositories { dependencies { compile 'net.sf:jargs:1.0' + testCompile 'junit:junit:4.11' } compileJava { diff --git a/src/test/java/andyr/csscompressor/CssCompressorTest.java b/src/test/java/andyr/csscompressor/CssCompressorTest.java new file mode 100644 index 0000000..31a7b4f --- /dev/null +++ b/src/test/java/andyr/csscompressor/CssCompressorTest.java @@ -0,0 +1,65 @@ +package andyr.csscompressor; + +import org.junit.Test; + +import java.io.*; + +import static org.junit.Assert.*; + +public class CssCompressorTest { + + @Test + public void testCompressionMergesDuplicates() throws Exception { + checkCompression(".myclassA { font-style: bold; }\n.myclassB { font-style: bold; }", ".myclassA,\n.myclassB{font-style:bold}"); + } + + @Test + public void testCompressionCompressesDimensions() throws Exception { + checkCompression(".myclass { border: 4px 4px 4px 4px; } ", ".myclass{border:4px}"); + } + + @Test + public void testCompressionRemovesLastSemiColon() throws Exception { + checkCompression(".myclass { font-style: bold; color: red; }", ".myclass{font-style:bold;color:red}"); + } + + @Test + public void testCompressionRemovesWhitespaces() throws Exception { + checkCompression(".myclass { font-style: bold; }", ".myclass{font-style:bold}"); + } + + @Test + public void testCompressionStripsUnitValuesOnZeros() throws Exception { + checkCompression(".myclass { margin-left: 0px; }", ".myclass{margin-left:0}"); + } + + @Test + public void testCompressionCompressesColors() throws Exception { + checkCompression(".myclass { color: rgb(51,102,153); }", ".myclass{color:#369}"); + checkCompression(".myclass { color: #AABBCC; }", ".myclass{color:#ABC}"); + } + + @Test + public void testCompressionRemovesComments() throws Exception { + checkCompression(".myclass { font-style: bold; /* comment */ }", ".myclass{font-style:bold}"); + } + + @Test + public void testCompressionRemovesEmptyRules() throws Exception { + checkCompression(".myclass { }", ""); + } + + @Test + public void testCompressionAcceptsBlankInputs() throws Exception { + checkCompression("", ""); + checkCompression("\n\n", ""); + } + + private void checkCompression(String cssIn, String cssOut) throws IOException { + Reader in = new StringReader(cssIn); + Writer out = new StringWriter(); + new CssCompressor(in).compress(out, 4); + assertEquals(cssOut, out.toString()); + } + +} From 6383b290e812fe8114649fdf4bc39c03307d10e5 Mon Sep 17 00:00:00 2001 From: Pierre-Etienne Poirot Date: Thu, 17 Dec 2015 00:11:08 +1300 Subject: [PATCH 3/3] Remove compiler warnings --- build.gradle | 1 + .../andyr/csscompressor/CssCompressor.java | 34 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/build.gradle b/build.gradle index 3462462..a5296c2 100644 --- a/build.gradle +++ b/build.gradle @@ -15,4 +15,5 @@ dependencies { compileJava { sourceCompatibility = 1.7 targetCompatibility = 1.7 + options.compilerArgs = ['-Xlint:all'] } diff --git a/src/main/java/andyr/csscompressor/CssCompressor.java b/src/main/java/andyr/csscompressor/CssCompressor.java index e564d11..5d98775 100644 --- a/src/main/java/andyr/csscompressor/CssCompressor.java +++ b/src/main/java/andyr/csscompressor/CssCompressor.java @@ -71,8 +71,8 @@ public CssCompressor(Reader in) throws IOException { protected String mergeRules(String inputCss) { - Map ruleMap = new HashMap(); - StringBuffer mergedCss = new StringBuffer(); + Map ruleMap = new HashMap(); + StringBuilder mergedCss = new StringBuilder(); Pattern p = Pattern.compile("([^\\{]*)\\{(.*?)\\}"); Matcher m = p.matcher(inputCss); @@ -84,17 +84,15 @@ protected String mergeRules(String inputCss) { rules = compressDimensions(rules); if (ruleMap.containsKey(rules)) { - ruleMap.put(rules, ruleMap.get(rules) + "," + selectors); + ruleMap.put(rules, ruleMap.get(rules) + ',' + selectors); } else { ruleMap.put(rules, selectors); } } - String rule; - for (Iterator i = ruleMap.keySet().iterator(); i.hasNext();) { - rule = (String)i.next(); - mergedCss.append(ruleMap.get(rule)+"{"+rule+"}"); + for (String rule : ruleMap.keySet()) { + mergedCss.append(ruleMap.get(rule)).append('{').append(rule).append('}'); } return mergedCss.toString(); @@ -102,12 +100,12 @@ protected String mergeRules(String inputCss) { protected String removeDuplicateProperties(String inputCssRule) { - StringBuffer cssRule = new StringBuffer(); + StringBuilder cssRule = new StringBuilder(); - Set ruleSet = new HashSet(Arrays.asList(inputCssRule.split(";"))); + Set ruleSet = new HashSet(Arrays.asList(inputCssRule.split(";"))); - for (Iterator i = ruleSet.iterator(); i.hasNext();) { - cssRule.append((String)i.next() + ";"); + for (String aRuleSet : ruleSet) { + cssRule.append(aRuleSet).append(";"); } return cssRule.toString(); @@ -117,7 +115,7 @@ protected String compressDimensions(String inputCssRule) { Pattern p = Pattern.compile("(border|margin):(\\d+(?:\\p{Alpha}*))(\\2){3}"); Matcher m; - StringBuffer cssRule = new StringBuffer(); + StringBuilder cssRule = new StringBuilder(); for (String rule: inputCssRule.split(";")) { @@ -125,10 +123,10 @@ protected String compressDimensions(String inputCssRule) { m = p.matcher(condensedRule); if (m.find()) { cssRule.append(condensedRule.substring(0, m.start())); - cssRule.append(m.group(1) + ':' + m.group(2) + ';'); + cssRule.append(m.group(1)).append(':').append(m.group(2)).append(';'); } else { - cssRule.append(rule + ';'); + cssRule.append(rule).append(';'); } } @@ -223,9 +221,9 @@ public void compress(Writer out, int linebreakpos) sb = new StringBuffer(); while (m.find()) { String[] rgbcolors = m.group(1).split(","); - StringBuffer hexcolor = new StringBuffer("#"); - for (int i = 0; i < rgbcolors.length; i++) { - int val = Integer.parseInt(rgbcolors[i]); + StringBuilder hexcolor = new StringBuilder("#"); + for (String rgbcolor : rgbcolors) { + int val = Integer.parseInt(rgbcolor); if (val < 16) { hexcolor.append("0"); } @@ -246,7 +244,7 @@ public void compress(Writer out, int linebreakpos) m = p.matcher(css); sb = new StringBuffer(); - Map colorMap = new HashMap(); + Map colorMap = new HashMap(); colorMap.put("C0C0C0", "silver"); colorMap.put("800000", "maroon"); colorMap.put("800080", "purple");