Trim whitespace in attribute values. For now, only in those with %URI; type: href...
authorJuriy Zaytsev <kangax@gmail.com>
Fri, 12 Mar 2010 17:42:06 +0000 (12:42 -0500)
committerJuriy Zaytsev <kangax@gmail.com>
Fri, 12 Mar 2010 17:42:06 +0000 (12:42 -0500)
index.html
src/htmlminifier.js
tests/index.html

index f6c7c86..5dc96bc 100644 (file)
           <li>Remove as many empty/blank attributes as possible (not just core ones)</li>
           <li>Parser trips over xml declarations (need to ignore or strip them)</li>
           <li>Generate a report of all applied transformations</li>
+          <li>Experiment with web workers (to avoid freezing browser)</li>
         </ul>
         <ul>
           <li>HTMLLint: warn about repeating attributes (e.g. multiple styles, classes, etc.)</li>
index dcf730d..1a3f0e4 100644 (file)
     return (/^(?:checked|disabled|selected|readonly)$/).test(attrName);
   }
   
+  function isUriTypeAttribute(attrName) {
+    return (/^(?:href|src|usemap|action|cite|longdesc|profile|codebase)$/).test(attrName);
+  }
+  
   function cleanAttributeValue(tag, attrName, attrValue) {
     if (isEventAttribute(attrName)) {
       return trimWhitespace(attrValue.replace(/^\s*javascript:\s*/i, ''));
     }
-    if (attrName === 'class') {
+    else if (attrName === 'class') {
       return collapseWhitespace(trimWhitespace(attrValue));
     }
+    else if (isUriTypeAttribute(attrName)) {
+      return trimWhitespace(attrValue);
+    }
     return attrValue;
   }
   
index 1a195f7..3905733 100644 (file)
@@ -39,7 +39,7 @@
           equals(minify('<script>alert(\'<!-- foo -->\')<\/script>'), '<script>alert(\'<!-- foo -->\')<\/script>');
           equals(minify('<script>alert(\'-->\')<\/script>'), '<script>alert(\'-->\')<\/script>');
           
-          equals(minify('<a title="x"href=" ">foo</a>'), '<a title="x" href=" ">foo</a>');
+          equals(minify('<a title="x"href=" ">foo</a>'), '<a title="x" href="">foo</a>');
           equals(minify('<p id=""class=""title="">x'), '<p id="" class="" title="">x</p>');
           equals(minify('<p x="x\'"">x</p>'), '<p x="x\'">x</p>', 'trailing quote should be ignored');
         });
           equals(minify(input, { removeEmptyAttributes: true }), '<img src="" alt="">');
         });
         
-        test('cleaning attributes', function(){
+        test('cleaning class attributes', function(){
           input = '<p class=" foo bar  ">foo bar baz</p>', output;
           equals(minify(input, { cleanAttributes: true }), '<p class="foo bar">foo bar baz</p>');
           
           
           input = '<p class="\n  \n foo   \n\n\t  \t\n  class1 class-23 ">foo bar baz</p>';
           equals(minify(input, { cleanAttributes: true }), '<p class="foo class1 class-23">foo bar baz</p>');
+        });
+        
+        test('cleaning URI-based attributes', function(){
+          input = '<a href="   http://example.com  ">x</a>';
+          output = '<a href="http://example.com">x</a>';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<a href="  \t\t  \n \t  ">x</a>';
+          output = '<a href="">x</a>';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<img src="   http://example.com  " title="bleh   " longdesc="  http://example.com/longdesc \n\n   \t ">';
+          output = '<img src="http://example.com" title="bleh   " longdesc="http://example.com/longdesc">';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<img src="" usemap="   http://example.com  ">';
+          output = '<img src="" usemap="http://example.com">';
+          equals(minify(input, { cleanAttributes: true }), output);
           
+          input = '<form action="  somePath/someSubPath/someAction?foo=bar&baz=qux     "></form>';
+          output = '<form action="somePath/someSubPath/someAction?foo=bar&baz=qux"></form>';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<BLOCKQUOTE cite=" \n\n\n http://www.mycom.com/tolkien/twotowers.html     "><P>foobar</P></BLOCKQUOTE>';
+          output = '<blockquote cite="http://www.mycom.com/tolkien/twotowers.html"><p>foobar</p></blockquote>';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<head profile="       http://gmpg.org/xfn/11    "></head>';
+          output = '<head profile="http://gmpg.org/xfn/11"></head>';
+          equals(minify(input, { cleanAttributes: true }), output);
+          
+          input = '<object codebase="   http://example.com  "></object>';
+          output = '<object codebase="http://example.com"></object>';
+          equals(minify(input, { cleanAttributes: true }), output);
+        });
+        
+        test('cleaning other attributes', function() {
           input = '<a href="#" onclick="  window.prompt(\'boo\'); " onmouseover=" \n\n alert(123);  \t \n\t  ">blah</a>';
           output = '<a href="#" onclick="window.prompt(\'boo\');" onmouseover="alert(123);">blah</a>';
           equals(minify(input, { cleanAttributes: true }), output);