From 0418998eea35d6a1bc31969ed5f416500095ff7e Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Wed, 21 Sep 2016 18:19:22 +0800 Subject: [PATCH] handle line-breaks around custom fragments gracefully --- src/htmlminifier.js | 24 +++++++++++++----------- tests/minifier.js | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/htmlminifier.js b/src/htmlminifier.js index a4b5442..8f4f497 100644 --- a/src/htmlminifier.js +++ b/src/htmlminifier.js @@ -858,36 +858,38 @@ function minify(value, options, partialMarkup) { return token; }); + function escapeFragments(text) { + return text.replace(uidPattern, function(match, prefix, index) { + var chunks = ignoredCustomMarkupChunks[+index]; + return chunks[1] + uidAttr + index + chunks[2]; + }); + } + var customFragments = options.ignoreCustomFragments.map(function(re) { return re.source; }); if (customFragments.length) { - var reCustomIgnore = new RegExp('\\s*(?:' + customFragments.join('|') + ')+\\s*', 'g'); + var reCustomIgnore = new RegExp('(\\s*)(?:' + customFragments.join('|') + ')+(\\s*)', 'g'); // temporarily replace custom ignored fragments with unique attributes - value = value.replace(reCustomIgnore, function(match) { + value = value.replace(reCustomIgnore, function(match, prefix, suffix) { if (!uidAttr) { uidAttr = uniqueId(value); uidPattern = new RegExp('(\\s*)' + uidAttr + '([0-9]+)(\\s*)', 'g'); var minifyCSS = options.minifyCSS; if (minifyCSS) { options.minifyCSS = function(text) { - return minifyCSS(text).replace(uidPattern, function(match, prefix, index, suffix) { - return (prefix && '\t') + uidAttr + index + (suffix && '\t'); - }); + return minifyCSS(escapeFragments(text)); }; } var minifyJS = options.minifyJS; if (minifyJS) { - var pattern = new RegExp('(\\\\t|)' + uidAttr + '([0-9]+)(\\\\t|)', 'g'); options.minifyJS = function(text, inline) { - return minifyJS(text, inline).replace(pattern, function(match, prefix, index, suffix) { - return (prefix && '\t') + uidAttr + index + (suffix && '\t'); - }); + return minifyJS(escapeFragments(text), inline); }; } } var token = uidAttr + ignoredCustomMarkupChunks.length; - ignoredCustomMarkupChunks.push(match); + ignoredCustomMarkupChunks.push([match, prefix, suffix]); return '\t' + token + '\t'; }); } @@ -1248,7 +1250,7 @@ function minify(value, options, partialMarkup) { if (uidPattern) { str = str.replace(uidPattern, function(match, prefix, index, suffix) { - var chunk = ignoredCustomMarkupChunks[+index]; + var chunk = ignoredCustomMarkupChunks[+index][0]; if (options.collapseWhitespace) { if (prefix !== '\t') { chunk = prefix + chunk; diff --git a/tests/minifier.js b/tests/minifier.js index 61c8ec2..538501c 100644 --- a/tests/minifier.js +++ b/tests/minifier.js @@ -1887,16 +1887,45 @@ QUnit.test('minification of scripts with different mimetypes', function(assert) input = ''; assert.equal(minify(input, { minifyJS: true }), input); +}); + +QUnit.test('minification of scripts with custom fragments', function(assert) { + var input, output; - input = ''; + input = ''; assert.equal(minify(input, { minifyJS: true }), input); - input = ''; - output = ''; + input = ''; + assert.equal(minify(input, { minifyJS: true }), input); + + input = ''; + assert.equal(minify(input, { minifyJS: true }), input); + + input = ''; + assert.equal(minify(input, { minifyJS: true }), input); + + input = ''; + output = ''; assert.equal(minify(input, { minifyJS: true }), output); - input = ''; - output = ''; + input = ''; + output = ''; + assert.equal(minify(input, { minifyJS: true }), output); + + input = ''; + output = ''; + assert.equal(minify(input, { minifyJS: true }), output); + + input = ''; + output = ''; + assert.equal(minify(input, { minifyJS: true }), output); + + input = ''; + output = ''; + assert.equal(minify(input, { minifyJS: true }), output); + + input = ''; + output = ''; assert.equal(minify(input, { minifyJS: true }), output); }); @@ -1989,7 +2018,7 @@ QUnit.test('style minification', function(assert) { input = '
'; assert.equal(minify(input), input); - output = '
'; + output = '
'; assert.equal(minify(input, { minifyCSS: true }), output); assert.equal(minify(input, { collapseWhitespace: true, @@ -2007,7 +2036,7 @@ QUnit.test('style minification', function(assert) { input = ''; assert.equal(minify(input), input); - output = ''; + output = ''; assert.equal(minify(input, { minifyCSS: true }), output); assert.equal(minify(input, { collapseWhitespace: true, -- 2.34.1