Skip to content

Commit f2ad7a6

Browse files
authored
Merge pull request #784 from kangax/issue-777
handle whitespace around   correctly
2 parents c9f35d8 + 1f93117 commit f2ad7a6

File tree

2 files changed

+71
-5
lines changed

2 files changed

+71
-5
lines changed

‎src/htmlminifier.js‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@ var trimWhitespace = String.prototype.trim ? function(str) {
2121
};
2222

2323
function compressWhitespace(spaces) {
24-
return spaces === '\t' ? '\t' : ~spaces.indexOf('\xA0') ? '\xA0' : ' ';
24+
return spaces === '\t' ? '\t' : spaces.replace(/(^|\xA0+)[^\xA0]+/g, '$1 ');
2525
}
2626

2727
function collapseWhitespaceAll(str) {
28-
return str ? str.replace(/\s+/g, compressWhitespace) : str;
28+
return str && str.replace(/\s+/g, compressWhitespace);
29+
}
30+
31+
function compressWhitespaceLeft(spaces) {
32+
return spaces === '\t' ? '\t' : spaces.replace(/^[^\xA0]+/, '').replace(/(\xA0+)[^\xA0]+/g, '$1 ') || ' ';
33+
}
34+
35+
function compressWhitespaceRight(spaces) {
36+
return spaces === '\t' ? '\t' : spaces.replace(/[^\xA0]+(\xA0+)/g, ' $1').replace(/[^\xA0]+$/, '') || ' ';
2937
}
3038

3139
function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) {
@@ -42,11 +50,11 @@ function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) {
4250
}
4351

4452
if (trimLeft) {
45-
str = str.replace(/^\s+/, !lineBreakBefore && options.conservativeCollapse ? compressWhitespace : '');
53+
str = str.replace(/^\s+/, !lineBreakBefore && options.conservativeCollapse ? compressWhitespaceLeft : '');
4654
}
4755

4856
if (trimRight) {
49-
str = str.replace(/\s+$/, !lineBreakAfter && options.conservativeCollapse ? compressWhitespace : '');
57+
str = str.replace(/\s+$/, !lineBreakAfter && options.conservativeCollapse ? compressWhitespaceRight : '');
5058
}
5159

5260
if (collapseAll) {

‎tests/minifier.js‎

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ QUnit.test('space normalization around text', function(assert) {
324324
output = '<head><!-- a --><!-- b --><!-- c --><link></head>';
325325
assert.equal(minify(input, { collapseWhitespace: true }), output);
326326
input = '<p> foo\u00A0bar\nbaz \u00A0\nmoo\t</p>';
327-
output = '<p>foo\u00A0bar baz\u00A0moo</p>';
327+
output = '<p>foo\u00A0bar baz \u00A0 moo</p>';
328328
assert.equal(minify(input, { collapseWhitespace: true }), output);
329329
});
330330

@@ -2324,6 +2324,64 @@ QUnit.test('conservative collapse', function(assert) {
23242324
collapseWhitespace: true,
23252325
conservativeCollapse: true
23262326
}), input);
2327+
2328+
input = '<p> \u00A0</p>';
2329+
output = '<p>\u00A0</p>';
2330+
assert.equal(minify(input, {
2331+
collapseWhitespace: true,
2332+
conservativeCollapse: true
2333+
}), output);
2334+
2335+
input = '<p>\u00A0 </p>';
2336+
output = '<p>\u00A0</p>';
2337+
assert.equal(minify(input, {
2338+
collapseWhitespace: true,
2339+
conservativeCollapse: true
2340+
}), output);
2341+
2342+
input = '<p> \u00A0 </p>';
2343+
output = '<p>\u00A0</p>';
2344+
assert.equal(minify(input, {
2345+
collapseWhitespace: true,
2346+
conservativeCollapse: true
2347+
}), output);
2348+
2349+
input = '<p> \u00A0\u00A0 \u00A0 </p>';
2350+
output = '<p>\u00A0\u00A0 \u00A0</p>';
2351+
assert.equal(minify(input, {
2352+
collapseWhitespace: true,
2353+
conservativeCollapse: true
2354+
}), output);
2355+
2356+
input = '<p> \u00A0foo\u00A0\t</p>';
2357+
output = '<p>\u00A0foo\u00A0</p>';
2358+
assert.equal(minify(input, {
2359+
collapseWhitespace: true,
2360+
conservativeCollapse: true
2361+
}), output);
2362+
2363+
2364+
input = '<p> \u00A0\nfoo\u00A0\t</p>';
2365+
output = '<p>\u00A0 foo\u00A0</p>';
2366+
assert.equal(minify(input, {
2367+
collapseWhitespace: true,
2368+
conservativeCollapse: true
2369+
}), output);
2370+
2371+
2372+
input = '<p> \u00A0foo \u00A0\t</p>';
2373+
output = '<p>\u00A0foo \u00A0</p>';
2374+
assert.equal(minify(input, {
2375+
collapseWhitespace: true,
2376+
conservativeCollapse: true
2377+
}), output);
2378+
2379+
input = '<p> \u00A0\nfoo \u00A0\t</p>';
2380+
output = '<p>\u00A0 foo \u00A0</p>';
2381+
assert.equal(minify(input, {
2382+
collapseWhitespace: true,
2383+
conservativeCollapse: true
2384+
}), output);
23272385
});
23282386

23292387
QUnit.test('collapse preseving a line break', function(assert) {

0 commit comments

Comments
 (0)