From f853820b308e4f30a3df43d213bb4d47ade8bb7a Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Sun, 26 Jun 2016 19:39:02 +0800 Subject: [PATCH] support minifyCSS on media queries fixes #669 --- src/htmlminifier.js | 23 ++++++++++++++++++++--- tests/minifier.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/htmlminifier.js b/src/htmlminifier.js index 6793187..4bf2908 100644 --- a/src/htmlminifier.js +++ b/src/htmlminifier.js @@ -228,17 +228,21 @@ function isNumberTypeAttribute(attrName, tag) { ); } -function isCanonicalURL(tag, attrs) { +function isLinkType(tag, attrs, value) { if (tag !== 'link') { return false; } for (var i = 0, len = attrs.length; i < len; i++) { - if (attrs[i].name === 'rel' && attrs[i].value === 'canonical') { + if (attrs[i].name === 'rel' && attrs[i].value === value) { return true; } } } +function isMediaQuery(tag, attrs, attrName) { + return attrName === 'media' && (isLinkType(tag, attrs, 'stylesheet') || isStyleSheet(tag, attrs)); +} + var srcsetTags = createMapFromString('img,source'); function isSrcset(attrName, tag) { @@ -262,7 +266,7 @@ function cleanAttributeValue(tag, attrName, attrValue, options, attrs) { } else if (isUriTypeAttribute(attrName, tag)) { attrValue = trimWhitespace(attrValue); - return isCanonicalURL(tag, attrs) ? attrValue : options.minifyURLs(attrValue); + return isLinkType(tag, attrs, 'canonical') ? attrValue : options.minifyURLs(attrValue); } else if (isNumberTypeAttribute(attrName, tag)) { return trimWhitespace(attrValue); @@ -308,6 +312,10 @@ function cleanAttributeValue(tag, attrName, attrValue, options, attrs) { else if (tag === 'script' && attrName === 'type') { attrValue = trimWhitespace(attrValue.replace(/\s*;\s*/g, ';')); } + else if (isMediaQuery(tag, attrs, attrName)) { + attrValue = trimWhitespace(attrValue); + return unwrapMediaQuery(options.minifyCSS(wrapMediaQuery(attrValue))); + } return attrValue; } @@ -333,6 +341,15 @@ function unwrapInlineCSS(text) { return matches ? matches[1] : text; } +function wrapMediaQuery(text) { + return '@media ' + text + '{a{top:0}}'; +} + +function unwrapMediaQuery(text) { + var matches = text.match(/^@media ([\s\S]*?)\s*{[\s\S]*}$/); + return matches ? matches[1] : text; +} + function cleanConditionalComment(comment, options) { return options.processConditionalComments ? comment.replace(/^(\[if\s[^\]]+\]>)([\s\S]*?)(

'; assert.equal(minify(input, { minifyCSS: css }), output); + input = ''; + assert.equal(minify(input), input); + assert.equal(minify(input, { minifyCSS: null }), input); + assert.equal(minify(input, { minifyCSS: false }), input); + output = ''; + assert.equal(minify(input, { minifyCSS: css }), output); + + input = ''; + assert.equal(minify(input), input); + assert.equal(minify(input, { minifyCSS: null }), input); + assert.equal(minify(input, { minifyCSS: false }), input); + output = ''; + assert.equal(minify(input, { minifyCSS: css }), output); + function js(text, inline) { return inline ? 'Inline JS' : 'Normal JS'; } @@ -1997,6 +2011,26 @@ QUnit.test('style minification', function(assert) { collapseWhitespace: true, minifyCSS: true }), output); + + input = ''; + assert.equal(minify(input), input); + output = ''; + assert.equal(minify(input, { minifyCSS: true }), output); + output = ''; + assert.equal(minify(input, { + minifyCSS: true, + removeAttributeQuotes: true + }), output); + + input = ''; + assert.equal(minify(input), input); + output = ''; + assert.equal(minify(input, { minifyCSS: true }), output); + output = ''; + assert.equal(minify(input, { + minifyCSS: true, + removeAttributeQuotes: true + }), output); }); QUnit.test('style attribute minification', function(assert) { -- 2.34.1