handle corner case when parsing DOCTYPE (#939)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 26 Jun 2018 20:50:09 +0000 (04:50 +0800)
committerGitHub <noreply@github.com>
Tue, 26 Jun 2018 20:50:09 +0000 (04:50 +0800)
fixes #938

src/htmlparser.js
tests/minifier.js

index 78e8928..12e35fb 100644 (file)
@@ -60,7 +60,7 @@ var singleAttrIdentifier = /([^\s"'<>/=]+)/,
     startTagOpen = new RegExp('^<' + qnameCapture),
     startTagClose = /^\s*(\/?)>/,
     endTag = new RegExp('^<\\/' + qnameCapture + '[^>]*>'),
-    doctype = /^<!DOCTYPE [^>]+>/i;
+    doctype = /^<!DOCTYPE\s[^>]+>/i;
 
 var IS_REGEX_CAPTURING_BROKEN = false;
 'x'.replace(/x(.)?/g, function(m, g) {
index fe425f5..a3cf039 100644 (file)
@@ -405,14 +405,21 @@ QUnit.test('types of whitespace that should always be preserved', function(asser
 QUnit.test('doctype normalization', function(assert) {
   var input;
 
-  input = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n    "http://www.w3.org/TR/html4/strict.dtd">';
-  assert.equal(minify(input, { useShortDoctype: true }), '<!DOCTYPE html>');
-
   input = '<!DOCTYPE html>';
+  assert.equal(minify(input, { useShortDoctype: false }), input);
   assert.equal(minify(input, { useShortDoctype: true }), input);
 
-  input = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">';
+  input = '<!DOCTYPE\nhtml>';
+  assert.equal(minify(input, { useShortDoctype: false }), '<!DOCTYPE html>');
+  assert.equal(minify(input, { useShortDoctype: true }), '<!DOCTYPE html>');
+
+  input = '<!DOCTYPE\thtml>';
   assert.equal(minify(input, { useShortDoctype: false }), input);
+  assert.equal(minify(input, { useShortDoctype: true }), '<!DOCTYPE html>');
+
+  input = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n    "http://www.w3.org/TR/html4/strict.dtd">';
+  assert.equal(minify(input, { useShortDoctype: false }), '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">');
+  assert.equal(minify(input, { useShortDoctype: true }), '<!DOCTYPE html>');
 });
 
 QUnit.test('removing comments', function(assert) {