minify srcset
authoralexlamsl <alexlamsl@gmail.com>
Sun, 17 Apr 2016 08:46:33 +0000 (16:46 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Sun, 17 Apr 2016 08:46:33 +0000 (16:46 +0800)
fixes #635

src/htmlminifier.js
tests/minifier.js

index 71726b4..15fbdd5 100644 (file)
@@ -257,6 +257,12 @@ function isCanonicalURL(tag, attrs) {
   }
 }
 
+var srcsetTags = createMapFromString('img,source');
+
+function isSrcset(attrName, tag) {
+  return attrName === 'srcset' && srcsetTags(tag);
+}
+
 var fnPrefix = '!function(){';
 var fnSuffix = '}();';
 
@@ -299,6 +305,26 @@ function cleanAttributeValue(tag, attrName, attrValue, options, attrs) {
     }
     return attrValue;
   }
+  else if (isSrcset(attrName, tag)) {
+    // https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-srcset
+    attrValue = trimWhitespace(attrValue).split(/\s+,\s*|\s*,\s+/).map(function(candidate) {
+      var url = candidate;
+      var descriptor = '';
+      var match = candidate.match(/\s+([1-9][0-9]*w|[0-9]+(?:\.[0-9]+)?x)$/);
+      if (match) {
+        url = url.slice(0, -match[0].length);
+        var num = +match[1].slice(0, -1);
+        var suffix = match[1].slice(-1);
+        if (num !== 1 || suffix !== 'x') {
+          descriptor = ' ' + num + suffix;
+        }
+      }
+      if (options.minifyURLs) {
+        url = minifyURLs(url, options.minifyURLs);
+      }
+      return url + descriptor;
+    }).join(', ');
+  }
   else if (isMetaViewport(tag, attrs) && attrName === 'content') {
     attrValue = attrValue.replace(/\s+/g, '').replace(/[0-9]+\.[0-9]+/g, function(numString) {
       // "0.90000" -> "0.9"
index c3df1b1..6fb0efe 100644 (file)
@@ -1836,6 +1836,19 @@ test('url attribute minification', function() {
     minifyCSS: true,
     minifyURLs: { site: 'http://website.com/foo bar/' }
   }), output);
+
+  input = '<img src="http://cdn.site.com/foo.png">';
+  output = '<img src="//cdn.site.com/foo.png">';
+  equal(minify(input, { minifyURLs: { site: 'http://site.com/' } }), output);
+});
+
+test('srcset attribute minification', function() {
+  input = '<source srcset="http://site.com/foo.gif ,http://site.com/bar.jpg 1x, baz moo 42w,' +
+          '\n\n\n\n\n\t    http://site.com/zo om.png 1.00x">';
+  output = '<source srcset="http://site.com/foo.gif, http://site.com/bar.jpg, baz moo 42w, http://site.com/zo om.png">';
+  equal(minify(input), output);
+  output = '<source srcset="foo.gif, bar.jpg, baz%20moo 42w, zo%20om.png">';
+  equal(minify(input, { minifyURLs: { site: 'http://site.com/' } }), output);
 });
 
 test('valueless attributes', function() {