Fix a bug with space-less attributes. Move scripts to the bottom.
authorJuriy Zaytsev <kangax@gmail.com>
Mon, 8 Mar 2010 06:06:23 +0000 (01:06 -0500)
committerJuriy Zaytsev <kangax@gmail.com>
Mon, 8 Mar 2010 06:06:23 +0000 (01:06 -0500)
index.html
src/htmlminifier.js
src/htmlparser.js
tests/index.html

index d1ef19a..76f8fe8 100644 (file)
@@ -4,11 +4,6 @@
   <head>
     <meta http-equiv="Content-type" content="text/html; charset=utf-8">
     <title>HTML minifier</title>
-    
-    <script src="src/htmlparser.js" type="text/javascript"></script>
-    <script src="src/htmlminifier.js" type="text/javascript"></script>
-    <script src="src/htmllint.js" type="text/javascript"></script>
-    
     <link rel="stylesheet" href="master.css" type="text/css">
   </head>
   <body>
         Source and bugtracker are <a href="http://github.com/kangax/html-minifier">hosted on Github</a>.
       </p>
     </div>
+    <script src="src/htmlparser.js" type="text/javascript"></script>
+    <script src="src/htmlminifier.js" type="text/javascript"></script>
+    <script src="src/htmllint.js" type="text/javascript"></script>
     <script src="master.js" type="text/javascript"></script>
   </body>
 </html>
\ No newline at end of file
index 0ac01c5..35cfe61 100644 (file)
     return text.replace(/^\s*<!--/, '').replace(/-->\s*$/, '');
   }
   
+  function isOptionalTag(tag) {
+    return (/^(?:html|t?body|t?head|tfoot|tr)$/).test(tag);
+  }
+  
   var reEmptyAttribute = new RegExp(
     '^(?:class|id|style|title|lang|dir|on(?:focus|blur|change|click|dblclick|mouse(' +
       '?:down|up|over|move|out)|key(?:press|down|up)))$');
     return tag !== 'textarea';
   }
   
-  function isOptionalTag(tag) {
-    return (/^(?:html|t?body|t?head|tfoot|tr)$/).test(tag);
-  }
-  
   function canCollapseWhitespace(tag) {
     return !(/^(?:script|style|pre|textarea)$/.test(tag));
   }
     
     HTMLParser(value, {
       start: function( tag, attrs, unary ) {
-        
         tag = tag.toLowerCase();
         currentTag = tag;
         currentChars = '';
         buffer.push('>');
       },
       end: function( tag ) {
+        
         var isElementEmpty = currentChars === '' && tag === currentTag;
         if ((options.removeEmptyElements && isElementEmpty && canRemoveElement(tag))) {
           // remove last "element" from buffer, return
index 31dcfd0..e6fbcf4 100644 (file)
@@ -27,7 +27,7 @@
 (function(){
 
   // Regular Expressions for parsing tags and attributes
-  var startTag = /^<(\w+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
+  var startTag = /^<(\w+)((?:\s*[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
       endTag = /^<\/(\w+)[^>]*>/,
       attr = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,
       doctype = /^<!DOCTYPE [^>]+>/i;
             arguments[3] ? arguments[3] :
             arguments[4] ? arguments[4] :
             fillAttrs[name] ? name : "";
-          
           attrs.push({
             name: name,
             value: value,
index c7f12c4..73ab051 100644 (file)
           equals(minify('<script>alert(\'<!--\')<\/script>'), '<script>alert(\'<!--\')<\/script>');
           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('<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');
         });
         
         test('`minifiy` exists', function() {