Skip to content

Commit

Permalink
Merge pull request #676 from kangax/issue-664
Browse files Browse the repository at this point in the history
fix whitespace interactions between minifyCSS and collapseWhitespace
  • Loading branch information
alexlamsl committed Jun 26, 2016
2 parents c3c0e55 + 62e378f commit 6863f5c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
16 changes: 13 additions & 3 deletions src/htmlminifier.js
Expand Up @@ -822,7 +822,8 @@ function minify(value, options, partialMarkup) {
ignoredMarkupChunks = [],
ignoredCustomMarkupChunks = [],
uidIgnore,
uidAttr;
uidAttr,
uidPattern;

// temporarily replace ignored chunks with comments,
// so that we don't have to worry what's there.
Expand All @@ -846,6 +847,15 @@ function minify(value, options, partialMarkup) {
value = value.replace(reCustomIgnore, function(match) {
if (!uidAttr) {
uidAttr = uniqueId(value);
uidPattern = new RegExp('(\\s*)' + uidAttr + '([0-9]+)(\\s*)', 'g');
var minifyCSS = options.minifyCSS;
if (minifyCSS) {
options.minifyCSS = function(text, inline) {
return minifyCSS(text, inline).replace(uidPattern, function(match, prefix, index, suffix) {
return (prefix && '\t') + uidAttr + index + (suffix && '\t');
});
};
}
}
var token = uidAttr + ignoredCustomMarkupChunks.length;
ignoredCustomMarkupChunks.push(match);
Expand Down Expand Up @@ -1203,8 +1213,8 @@ function minify(value, options, partialMarkup) {

var str = joinResultSegments(buffer, options);

if (uidAttr) {
str = str.replace(new RegExp('(\\s*)' + uidAttr + '([0-9]+)(\\s*)', 'g'), function(match, prefix, index, suffix) {
if (uidPattern) {
str = str.replace(uidPattern, function(match, prefix, index, suffix) {
var chunk = ignoredCustomMarkupChunks[+index];
if (options.collapseWhitespace) {
if (prefix !== '\t') {
Expand Down
37 changes: 35 additions & 2 deletions tests/minifier.js
Expand Up @@ -1951,19 +1951,52 @@ QUnit.test('style minification', function(assert) {
var input, output;

input = '<style></style>div#foo { background-color: red; color: white }';

assert.equal(minify(input, { minifyCSS: true }), input);

input = '<style>div#foo { background-color: red; color: white }</style>';
output = '<style>div#foo{background-color:red;color:#fff}</style>';

assert.equal(minify(input), input);
assert.equal(minify(input, { minifyCSS: true }), output);

input = '<style>div > p.foo + span { border: 10px solid black }</style>';
output = '<style>div>p.foo+span{border:10px solid #000}</style>';
assert.equal(minify(input, { minifyCSS: true }), output);

input = '<div style="background: url(images/<% image %>)"></div>';
assert.equal(minify(input), input);
output = '<div style="background:url(images/<% image %>)"></div>';
assert.equal(minify(input, { minifyCSS: true }), output);
assert.equal(minify(input, {
collapseWhitespace: true,
minifyCSS: true
}), output);

input = '<div style="background: url(\'images/<% image %>\')"></div>';
assert.equal(minify(input), input);
output = '<div style="background:url(\'images/<% image %>\')"></div>';
assert.equal(minify(input, { minifyCSS: true }), output);
assert.equal(minify(input, {
collapseWhitespace: true,
minifyCSS: true
}), output);

input = '<style>\np {\n background: url(images/<% image %>);\n}\n</style>';
assert.equal(minify(input), input);
output = '<style>p{background:url(images/<% image %>)}</style>';
assert.equal(minify(input, { minifyCSS: true }), output);
assert.equal(minify(input, {
collapseWhitespace: true,
minifyCSS: true
}), output);

input = '<style>p { background: url("images/<% image %>") }</style>';
assert.equal(minify(input), input);
output = '<style>p{background:url("images/<% image %>")}</style>';
assert.equal(minify(input, { minifyCSS: true }), output);
assert.equal(minify(input, {
collapseWhitespace: true,
minifyCSS: true
}), output);
});

QUnit.test('style attribute minification', function(assert) {
Expand Down

0 comments on commit 6863f5c

Please sign in to comment.