parse whitespace attribute values properly
authoralexlamsl <alexlamsl@gmail.com>
Sun, 19 Mar 2017 06:13:04 +0000 (14:13 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Sun, 19 Mar 2017 06:13:04 +0000 (14:13 +0800)
src/htmlparser.js
tests/minifier.js

index cc7daf0..2195347 100644 (file)
@@ -38,15 +38,14 @@ function makeMap(values) {
 
 // Regular Expressions for parsing tags and attributes
 var singleAttrIdentifier = /([^\s"'<>/=]+)/,
-    singleAttrAssign = /=/,
-    singleAttrAssigns = [singleAttrAssign],
+    singleAttrAssigns = [/=/],
     singleAttrValues = [
       // attr value double quotes
       /"([^"]*)"+/.source,
       // attr value, single quotes
       /'([^']*)'+/.source,
       // attr value, no quotes
-      /([^\s"'=<>`]+)/.source
+      /([^ \t\n\f\r"'`=<>]+)/.source
     ],
     // https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
     qnameCapture = (function() {
@@ -88,7 +87,7 @@ var reCache = {};
 function attrForHandler(handler) {
   var pattern = singleAttrIdentifier.source +
                 '(?:\\s*(' + joinSingleAttrAssigns(handler) + ')' +
-                '\\s*(?:' + singleAttrValues.join('|') + '))?';
+                '[ \\t\\n\\f\\r]*(?:' + singleAttrValues.join('|') + '))?';
   if (handler.customAttrSurround) {
     var attrClauses = [];
     for (var i = handler.customAttrSurround.length - 1; i >= 0; i--) {
index 7739701..0fe3182 100644 (file)
@@ -117,6 +117,25 @@ QUnit.test('parsing non-trivial markup', function(assert) {
       ' data-options="vm.datepickerOptions">'
     );
   }, 'HTML comment inside tag');
+
+  input = '<br a=\u00A0 b="&nbsp;" c="\u00A0">';
+  output = '<br a="\u00A0" b="&nbsp;" c="\u00A0">';
+  assert.equal(minify(input), output);
+  output = '<br a="\u00A0"b="\u00A0"c="\u00A0">';
+  assert.equal(minify(input, {
+    decodeEntities: true,
+    removeTagWhitespace: true,
+  }), output);
+  output = '<br a=\u00A0 b=\u00A0 c=\u00A0>';
+  assert.equal(minify(input, {
+    decodeEntities: true,
+    removeAttributeQuotes: true
+  }), output);
+  assert.equal(minify(input, {
+    decodeEntities: true,
+    removeAttributeQuotes: true,
+    removeTagWhitespace: true,
+  }), output);
 });
 
 QUnit.test('options', function(assert) {