From 8153d1ca4b890a72835f170afdec87601ddf2b49 Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Sun, 19 Feb 2017 20:52:26 +0800 Subject: [PATCH] handle   better in collapseWhitespace --- src/htmlminifier.js | 32 +++++++++++++++++--------------- tests/minifier.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/htmlminifier.js b/src/htmlminifier.js index b1d91bf..18118aa 100644 --- a/src/htmlminifier.js +++ b/src/htmlminifier.js @@ -20,20 +20,10 @@ var trimWhitespace = String.prototype.trim ? function(str) { return str.replace(/^\s+/, '').replace(/\s+$/, ''); }; -function compressWhitespace(spaces) { - return spaces === '\t' ? '\t' : spaces.replace(/(^|\xA0+)[^\xA0]+/g, '$1 '); -} - function collapseWhitespaceAll(str) { - return str && str.replace(/\s+/g, compressWhitespace); -} - -function compressWhitespaceLeft(spaces) { - return spaces === '\t' ? '\t' : spaces.replace(/^[^\xA0]+/, '').replace(/(\xA0+)[^\xA0]+/g, '$1 ') || ' '; -} - -function compressWhitespaceRight(spaces) { - return spaces === '\t' ? '\t' : spaces.replace(/[^\xA0]+(\xA0+)/g, ' $1').replace(/[^\xA0]+$/, '') || ' '; + return str && str.replace(/\s+/g, function(spaces) { + return spaces === '\t' ? '\t' : spaces.replace(/(^|\xA0+)[^\xA0]+/g, '$1 '); + }); } function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) { @@ -50,11 +40,23 @@ function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) { } if (trimLeft) { - str = str.replace(/^\s+/, !lineBreakBefore && options.conservativeCollapse ? compressWhitespaceLeft : ''); + str = str.replace(/^\s+/, function(spaces) { + var conservative = !lineBreakBefore && options.conservativeCollapse; + if (conservative && spaces === '\t') { + return '\t'; + } + return spaces.replace(/^[^\xA0]+/, '').replace(/(\xA0+)[^\xA0]+/g, '$1 ') || (conservative ? ' ' : ''); + }); } if (trimRight) { - str = str.replace(/\s+$/, !lineBreakAfter && options.conservativeCollapse ? compressWhitespaceRight : ''); + str = str.replace(/\s+$/, function(spaces) { + var conservative = !lineBreakAfter && options.conservativeCollapse; + if (conservative && spaces === '\t') { + return '\t'; + } + return spaces.replace(/[^\xA0]+(\xA0+)/g, ' $1').replace(/[^\xA0]+$/, '') || (conservative ? ' ' : ''); + }); } if (collapseAll) { diff --git a/tests/minifier.js b/tests/minifier.js index c4a0f75..eec984a 100644 --- a/tests/minifier.js +++ b/tests/minifier.js @@ -2320,6 +2320,7 @@ QUnit.test('conservative collapse', function(assert) { }), output); input = '

\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), input); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2327,6 +2328,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0

'; output = '

\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2334,6 +2336,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0

'; output = '

\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2341,6 +2344,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0

'; output = '

\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2348,6 +2352,31 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0\u00A0 \u00A0

'; output = '

\u00A0\u00A0 \u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); + assert.equal(minify(input, { + collapseWhitespace: true, + conservativeCollapse: true + }), output); + + input = '

foo \u00A0\u00A0 \u00A0

'; + output = '

foo \u00A0\u00A0 \u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); + assert.equal(minify(input, { + collapseWhitespace: true, + conservativeCollapse: true + }), output); + + input = '

\u00A0\u00A0 \u00A0 bar

'; + output = '

\u00A0\u00A0 \u00A0 bar

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); + assert.equal(minify(input, { + collapseWhitespace: true, + conservativeCollapse: true + }), output); + + input = '

foo \u00A0\u00A0 \u00A0 bar

'; + output = '

foo \u00A0\u00A0 \u00A0 bar

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2355,6 +2384,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0foo\u00A0\t

'; output = '

\u00A0foo\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2363,6 +2393,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0\nfoo\u00A0\t

'; output = '

\u00A0 foo\u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2371,6 +2402,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0foo \u00A0\t

'; output = '

\u00A0foo \u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true @@ -2378,6 +2410,7 @@ QUnit.test('conservative collapse', function(assert) { input = '

\u00A0\nfoo \u00A0\t

'; output = '

\u00A0 foo \u00A0

'; + assert.equal(minify(input, { collapseWhitespace: true }), output); assert.equal(minify(input, { collapseWhitespace: true, conservativeCollapse: true -- 2.34.1