From 1f93117e92ff20ca5eef27da1892296333c19a44 Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Sun, 19 Feb 2017 20:03:48 +0800 Subject: [PATCH] handle whitespace around   correctly fixes #777 --- src/htmlminifier.js | 16 +++++++++--- tests/minifier.js | 60 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/htmlminifier.js b/src/htmlminifier.js index cbfa953..b1d91bf 100644 --- a/src/htmlminifier.js +++ b/src/htmlminifier.js @@ -21,11 +21,19 @@ var trimWhitespace = String.prototype.trim ? function(str) { }; function compressWhitespace(spaces) { - return spaces === '\t' ? '\t' : ~spaces.indexOf('\xA0') ? '\xA0' : ' '; + return spaces === '\t' ? '\t' : spaces.replace(/(^|\xA0+)[^\xA0]+/g, '$1 '); } function collapseWhitespaceAll(str) { - return str ? str.replace(/\s+/g, compressWhitespace) : 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]+$/, '') || ' '; } function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) { @@ -42,11 +50,11 @@ function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) { } if (trimLeft) { - str = str.replace(/^\s+/, !lineBreakBefore && options.conservativeCollapse ? compressWhitespace : ''); + str = str.replace(/^\s+/, !lineBreakBefore && options.conservativeCollapse ? compressWhitespaceLeft : ''); } if (trimRight) { - str = str.replace(/\s+$/, !lineBreakAfter && options.conservativeCollapse ? compressWhitespace : ''); + str = str.replace(/\s+$/, !lineBreakAfter && options.conservativeCollapse ? compressWhitespaceRight : ''); } if (collapseAll) { diff --git a/tests/minifier.js b/tests/minifier.js index 85aa4b0..c4a0f75 100644 --- a/tests/minifier.js +++ b/tests/minifier.js @@ -324,7 +324,7 @@ QUnit.test('space normalization around text', function(assert) { output = ''; assert.equal(minify(input, { collapseWhitespace: true }), output); input = '

foo\u00A0bar\nbaz \u00A0\nmoo\t

'; - output = '

foo\u00A0bar baz\u00A0moo

'; + output = '

foo\u00A0bar baz \u00A0 moo

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

\u00A0

'; + output = '

\u00A0

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

\u00A0

'; + output = '

\u00A0

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

\u00A0

'; + output = '

\u00A0

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

\u00A0\u00A0 \u00A0

'; + output = '

\u00A0\u00A0 \u00A0

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

\u00A0foo\u00A0\t

'; + output = '

\u00A0foo\u00A0

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

\u00A0\nfoo\u00A0\t

'; + output = '

\u00A0 foo\u00A0

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

\u00A0foo \u00A0\t

'; + output = '

\u00A0foo \u00A0

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

\u00A0\nfoo \u00A0\t

'; + output = '

\u00A0 foo \u00A0

'; + assert.equal(minify(input, { + collapseWhitespace: true, + conservativeCollapse: true + }), output); }); QUnit.test('collapse preseving a line break', function(assert) { -- 2.34.1