From: alexlamsl Date: Fri, 12 Feb 2016 20:12:26 +0000 (+0800) Subject: fix corner cases for collapseWhitespace X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=3dd7695a5affe7cb7bf3bbfdd020ae6fd04c8b45;p=html-minifier.git fix corner cases for collapseWhitespace fixes #491 --- diff --git a/dist/htmlminifier.js b/dist/htmlminifier.js index 8eb25a1..ed7339a 100644 --- a/dist/htmlminifier.js +++ b/dist/htmlminifier.js @@ -155,7 +155,7 @@ } var HTMLParser = global.HTMLParser = function( html, handler ) { - var index, chars, match, stack = [], last = html, prevTag, nextTag; + var index, match, stack = [], last = html, prevTag, nextTag; stack.last = function() { var last = this[ this.length - 1 ]; return last && last.tag; @@ -165,8 +165,6 @@ var attr = attrForHandler(handler); while ( html ) { - chars = true; - // Make sure we're not in a script or style element if ( !stack.last() || !special[ stack.last() ] ) { @@ -180,7 +178,7 @@ } html = html.substring( index + 3 ); prevTag = ''; - chars = false; + continue; } } @@ -194,12 +192,12 @@ } html = html.substring( index + 2 ); prevTag = ''; - chars = false; + continue; } } // Ignored elements? - else if ( /^<\?/.test( html ) ) { + if ( /^<\?/.test( html ) ) { index = html.indexOf( '?>', 2 ); if ( index >= 0 ) { if ( handler.chars ) { @@ -207,10 +205,11 @@ } html = html.substring( index + 2 ); prevTag = ''; + continue; } } - else if ( /^<%/.test( html ) ) { + if ( /^<%/.test( html ) ) { index = html.indexOf( '%>', 2 ); if ( index >= 0 ) { if ( handler.chars ) { @@ -218,67 +217,66 @@ } html = html.substring( index + 2 ); prevTag = ''; + continue; } } // Doctype: - else if ( (match = doctype.exec( html )) ) { + if ( (match = doctype.exec( html )) ) { if ( handler.doctype ) { handler.doctype( match[0] ); } html = html.substring( match[0].length ); - chars = false; + prevTag = ''; + continue; } // End tag: - else if ( /^<\//.test( html ) ) { + if ( /^<\//.test( html ) ) { match = html.match( endTag ); - if ( match ) { html = html.substring( match[0].length ); match[0].replace( endTag, parseEndTag ); prevTag = '/' + match[1].toLowerCase(); - chars = false; + continue; } } // Start tag: - else if ( /^ 1 && buffer[buffer.length - 1] === '' && /\s+$/.test(buffer[buffer.length - 2])) { + charsIndex = buffer.length - 2; + } + else if (buffer.length > 0 && /\s+$/.test(buffer[buffer.length - 1])) { + charsIndex = buffer.length - 1; + } + if (charsIndex > 0) { + buffer[charsIndex] = buffer[charsIndex].replace(/\s+$/, function(text) { + return collapseWhitespaceSmart(text, 'comment', '/' + tag, options); + }); + } } if (stackNoCollapseWhitespace.length && tag === stackNoCollapseWhitespace[stackNoCollapseWhitespace.length - 1]) { @@ -1483,7 +1496,7 @@ // push out everything but the end tag results.push.apply(results, buffer); buffer = ['']; - charsPrevTag = undefined; + charsPrevTag = '/' + tag; currentChars = ''; } }, @@ -1541,7 +1554,7 @@ } optionalEndTag = ''; } - charsPrevTag = prevTag; + charsPrevTag = /^\s*$/.test(text) ? prevTag : 'comment'; currentChars += text; if (lint) { lint.testChars(text); @@ -1630,7 +1643,7 @@ str = results.join(''); } - return str; + return trimWhitespace(str); } // for CommonJS enviroments, export everything diff --git a/dist/htmlminifier.min.js b/dist/htmlminifier.min.js index cbe07ef..3643218 100644 --- a/dist/htmlminifier.min.js +++ b/dist/htmlminifier.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2016 Juriy "kangax" Zaytsev * Licensed under the MIT license */ -!function(a){"use strict";function b(a){var b,c=new RegExp("(?:\\s*[\\w:\\.-]+(?:\\s*(?:"+d(a)+")\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*");if(a.customAttrSurround){for(var e=[],f=a.customAttrSurround.length-1;f>=0;f--)e[f]="(?:\\s*"+a.customAttrSurround[f][0].source+"\\s*"+c.source+"\\s*"+a.customAttrSurround[f][1].source+")";e.unshift(c.source),b=new RegExp("((?:"+e.join("|")+")*)")}else b=new RegExp("("+c.source+")");return new RegExp(j.source+b.source+k.source)}function c(a){var b=new RegExp(f.source+"(?:\\s*("+d(a)+")\\s*(?:"+i.join("|")+"))?");if(a.customAttrSurround){for(var c=[],e=a.customAttrSurround.length-1;e>=0;e--)c[e]="(?:("+a.customAttrSurround[e][0].source+")\\s*"+b.source+"\\s*("+a.customAttrSurround[e][1].source+"))";return c.unshift("(?:"+b.source+")"),new RegExp(c.join("|"),"g")}return new RegExp(b.source,"g")}function d(a){return h.concat(a.customAttrAssign||[]).map(function(a){return"(?:"+a.source+")"}).join("|")}function e(a){for(var b={},c=a.split(","),d=0;d\s]+)/.source],j=/^<([\w:-]+)/,k=/\s*(\/?)>/,l=/^<\/([\w:-]+)[^>]*>/,m=/\/>$/,n=/^]+>/i,o=!1;"x".replace(/x(.)?/g,function(a,b){o=""===b});var p,q,r,s=e("area,base,basefont,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),t=e("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,noscript,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,svg,textarea,tt,u,var"),u=e("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),v=e("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),w=e("script,style"),x={},y=a.HTMLParser=function(a,d){function e(a,b,c,e){for(var g=!1;!d.html5&&y.last()&&t[y.last()];)f("",y.last());u[b]&&y.last()===b&&f("",b),e=s[b]||!!e;var h=[];c.replace(B,function(){var a,b,c,e,f,g,i,j=7;if(o&&-1===arguments[0].indexOf('""')&&(""===arguments[3]&&(arguments[3]=void 0),""===arguments[4]&&(arguments[4]=void 0),""===arguments[5]&&(arguments[5]=void 0)),a=arguments[1])g=arguments[2],c=arguments[3],b=c||arguments[4]||arguments[5],g&&(i=arguments[0].charAt(a.length+g.length),i="'"===i||'"'===i?i:"");else if(d.customAttrSurround)for(var k=d.customAttrSurround.length-1;k>=0;k--)if(a=arguments[k*j+7],g=arguments[k*j+8],a){c=arguments[k*j+9],b=c||arguments[k*j+10]||arguments[k*j+11],e=arguments[k*j+6],f=arguments[k*j+12];break}void 0===b&&(b=v[a]?a:c),h.push({name:a,value:b,customAssign:g||"=",customOpen:e||"",customClose:f||"",quote:i||""})}),e?g=a.match(m):y.push({tag:b,attrs:h}),d.start&&d.start(b,h,e,g)}function f(a,b){var c;if(b){var e=b.toLowerCase();for(c=y.length-1;c>=0&&y[c].tag.toLowerCase()!==e;c--);}else c=0;if(c>=0){for(var f=y.length-1;f>=c;f--)d.end&&d.end(y[f].tag,y[f].attrs);y.length=c}}var g,h,i,j,k,y=[],z=a;y.last=function(){var a=this[this.length-1];return a&&a.tag};for(var A=b(d),B=c(d);a;){if(h=!0,y.last()&&w[y.last()])p=y.last().toLowerCase(),q=x[p]||(x[p]=new RegExp("([\\s\\S]*?)]*>","i")),a=a.replace(q,function(a,b){return"script"!==p&&"style"!==p&&"noscript"!==p&&(b=b.replace(//g,"$1").replace(//g,"$1")),d.chars&&d.chars(b),""}),f("",p);else if(/^"),g>=0&&(d.comment&&d.comment(a.substring(4,g)),a=a.substring(g+3),j="",h=!1)),/^"),g>=0&&(d.comment&&d.comment(a.substring(2,g+1),!0),a=a.substring(g+2),j="",h=!1)):/^<\?/.test(a)?(g=a.indexOf("?>",2),g>=0&&(d.chars&&d.chars(a.substring(0,g+2)),a=a.substring(g+2),j="")):/^<%/.test(a)?(g=a.indexOf("%>",2),g>=0&&(d.chars&&d.chars(a.substring(0,g+2)),a=a.substring(g+2),j="")):(i=n.exec(a))?(d.doctype&&d.doctype(i[0]),a=a.substring(i[0].length),h=!1):/^<\//.test(a)?(i=a.match(l),i&&(a=a.substring(i[0].length),i[0].replace(l,f),j="/"+i[1].toLowerCase(),h=!1)):/^g?a:a.substring(0,g);a=0>g?"":a.substring(g),r=a.match(A),r?k=r[1]:(r=a.match(l),k=r?"/"+r[1]:""),d.chars&&d.chars(C,j,k)}if(a===z)throw"Parse Error: "+a;z=a}f()};a.HTMLtoXML=function(a){var b="";return new y(a,{start:function(a,c,d){b+="<"+a;for(var e=0;e"},end:function(a){b+=""},chars:function(a){b+=a},comment:function(a){b+=""},ignore:function(a){b+=a}}),b},a.HTMLtoDOM=function(a,b){var c=e("html,head,body,title"),d={link:"head",base:"head"};b?b=b.ownerDocument||b.getOwnerDocument&&b.getOwnerDocument()||b:"undefined"!=typeof DOMDocument?b=new DOMDocument:"undefined"!=typeof document&&document.implementation&&document.implementation.createDocument?b=document.implementation.createDocument("","",null):"undefined"!=typeof ActiveX&&(b=new ActiveXObject("Msxml.DOMDocument"));var f=[],g=b.documentElement||b.getDocumentElement&&b.getDocumentElement();if(!g&&b.createElement&&!function(){var a=b.createElement("html"),c=b.createElement("head");c.appendChild(b.createElement("title")),a.appendChild(c),a.appendChild(b.createElement("body")),b.appendChild(a)}(),b.getElementsByTagName)for(var h in c)c[h]=b.getElementsByTagName(h)[0];var i=c.body;return new y(a,{start:function(a,e,g){if(c[a])return void(i=c[a]);var h=b.createElement(a);for(var j in e)h.setAttribute(e[j].name,e[j].value);d[a]&&"boolean"!=typeof c[d[a]]?c[d[a]].appendChild(h):i&&i.appendChild&&i.appendChild(h),g||(f.push(h),i=h)},end:function(){f.length-=1,i=f[f.length-1]},chars:function(a){i.appendChild(b.createTextNode(a))},comment:function(){},ignore:function(){}}),b}}("undefined"==typeof exports?this:exports),function(a){"use strict";function b(a){return a?a.replace(/[\t\n\r ]+/g," "):a}function c(a){var b={};return a.forEach(function(a){b[a]=1}),b}function d(a,c,d,e){var f="",g="";return e.preserveLineBreaks&&(a=a.replace(/^[\t ]*[\n\r]+[\t\n\r ]*/,function(){return f="\n",""}).replace(/[\t\n\r ]*[\n\r]+[\t ]*$/,function(){return g="\n",""})),c&&"img"!==c&&"input"!==c&&"comment"!==c&&("/"!==c.charAt(0)||e.collapseInlineTagWhitespace||1!==P[c.substr(1)])&&(a=a.replace(/^\s+/,!e.preserveLineBreaks&&e.conservativeCollapse?" ":"")),d&&"img"!==d&&"input"!==d&&"comment"!==d&&("/"===d.charAt(0)||e.collapseInlineTagWhitespace||1!==P[d])&&(a=a.replace(/\s+$/,!e.preserveLineBreaks&&e.conservativeCollapse?" ":"")),c&&d&&(a=b(a)),f+a+g}function e(a){return/\[if[^\]]+\]/.test(a)||/\s*((?:c;c++)if(b.ignoreCustomComments[c].test(a))return!0;return!1}function g(a,b){var c=b.customEventAttributes;if(c){for(var d=c.length;d--;)if(c[d].test(a))return!0;return!1}return/^on[a-z]{3,}$/.test(a)}function h(a){return/^[^\x20\t\n\f\r"'`=<>]+$/.test(a)}function i(a,b){for(var c=a.length;c--;)if(a[c].name.toLowerCase()===b)return!0;return!1}function j(a,b,c,d){return c=c?O(c.toLowerCase()):"","script"===a&&"language"===b&&"javascript"===c||"form"===a&&"method"===b&&"get"===c||"input"===a&&"type"===b&&"text"===c||"script"===a&&"charset"===b&&!i(d,"src")||"a"===a&&"name"===b&&i(d,"id")||"area"===a&&"shape"===b&&"rect"===c}function k(a,b,c){return"script"===a&&"type"===b&&"text/javascript"===O(c.toLowerCase())}function l(a,b){if("script"!==a)return!1;for(var c=0,d=b.length;d>c;c++){var e=b[c].name.toLowerCase();if("type"===e){var f=O(b[c].value).split(/;/,2)[0].toLowerCase();return""===f||1===Q[f]}}return!0}function m(a,b,c){return("style"===a||"link"===a)&&"type"===b&&"text/css"===O(c.toLowerCase())}function n(a,b){var c=/^(?:allowfullscreen|async|autofocus|autoplay|checked|compact|controls|declare|default|defaultchecked|defaultmuted|defaultselected|defer|disabled|enabled|formnovalidate|hidden|indeterminate|inert|ismap|itemscope|loop|multiple|muted|nohref|noresize|noshade|novalidate|nowrap|open|pauseonexit|readonly|required|reversed|scoped|seamless|selected|sortable|truespeed|typemustmatch|visible)$/i.test(a);if(c)return!0;var d=R[a.toLowerCase()];return d?-1===d.indexOf(b.toLowerCase()):!1}function o(a,b){return/^(?:a|area|link|base)$/.test(b)&&"href"===a||"img"===b&&/^(?:src|longdesc|usemap)$/.test(a)||"object"===b&&/^(?:classid|codebase|data|usemap)$/.test(a)||"q"===b&&"cite"===a||"blockquote"===b&&"cite"===a||("ins"===b||"del"===b)&&"cite"===a||"form"===b&&"action"===a||"input"===b&&("src"===a||"usemap"===a)||"head"===b&&"profile"===a||"script"===b&&("src"===a||"for"===a)}function p(a,b){return/^(?:a|area|object|button)$/.test(b)&&"tabindex"===a||"input"===b&&("maxlength"===a||"tabindex"===a)||"select"===b&&("size"===a||"tabindex"===a)||"textarea"===b&&/^(?:rows|cols|tabindex)$/.test(a)||"colgroup"===b&&"span"===a||"col"===b&&"span"===a||("th"===b||"td"===b)&&("rowspan"===a||"colspan"===a)}function q(a,b){if("link"!==a)return!1;for(var c=0,d=b.length;d>c;c++)if("rel"===b[c].name&&"canonical"===b[c].value)return!0}function r(a,c,d,e,f){if(d&&g(c,e)){if(d=O(d).replace(/^javascript:\s*/i,"").replace(/\s*;$/,""),e.minifyJS){var h=H(S+d+T,e.minifyJS);return h.slice(S.length,-T.length)}return d}return"class"===c?b(O(d)):o(c,a)?(d=O(d),e.minifyURLs&&!q(a,f)?G(d,e.minifyURLs):d):p(c,a)?O(d):"style"===c?(d=O(d),d&&(d=d.replace(/\s*;\s*$/,"")),e.minifyCSS?I(d,e.minifyCSS,!0):d):(s(a,f)&&"content"===c?d=d.replace(/\s+/g,"").replace(/[0-9]+\.[0-9]+/g,function(a){return(+a).toString()}):d&&e.customAttrCollapse&&e.customAttrCollapse.test(c)&&(d=d.replace(/\n+|\r+|\s{2,}/g,"")),d)}function s(a,b){if("meta"!==a)return!1;for(var c=0,d=b.length;d>c;c++)if("name"===b[c].name&&"viewport"===b[c].value)return!0}function t(a){return"*{"+a+"}"}function u(a){var b=a.match(/^\*\{([\s\S]*)\}$/m);return b&&b[1]?b[1]:a}function v(a){return a.replace(/^(\[[^\]]+\]>)\s*/,"$1").replace(/\s*(\s*\*\/|\/\/\s*\]\]>)\s*$/,"")}function x(a,b,c){for(var d=0,e=c.length;e>d;d++)if("type"===c[d].name.toLowerCase()&&b.processScripts.indexOf(c[d].value)>-1)return K(a,b);return a}function y(a,b){return a.replace(U[b],"").replace(V[b],"")}function z(a,b){switch(a){case"html":case"head":case"body":case"colgroup":return!0;case"li":case"optgroup":case"tr":return b===a;case"dt":case"dd":return"dt"===b||"dd"===b;case"p":return 1===Z[b];case"rb":case"rt":case"rp":return"rb"===b||"rt"===b||"rtc"===b||"rp"===b;case"rtc":return"rb"===b||"rtc"===b||"rp"===b;case"option":return"option"===b||"optgroup"===b;case"thead":case"tbody":return"tbody"===b||"tfoot"===b;case"tfoot":return"tbody"===b;case"td":case"th":return"td"===b||"th"===b}return!1}function A(a,b,c){var d=!c||/^\s*$/.test(c);return d?"input"===a&&"value"===b||$.test(b):!1}function B(a,b){if("textarea"===a)return!1;if("script"===a)for(var c=b.length-1;c>=0;c--)if("src"===b[c].name)return!1;return!0}function C(a){return!/^(?:script|style|pre|textarea)$/.test(a)}function D(a){return!/^(?:pre|textarea)$/.test(a)}function E(a,b,c,d,e,f,g){var i,l,o=f.caseSensitive?a.name:a.name.toLowerCase(),p=a.value,q=a.quote;if(f.removeRedundantAttributes&&j(c,o,p,b)||f.removeScriptTypeAttributes&&k(c,o,p)||f.removeStyleLinkTypeAttributes&&m(c,o,p))return"";if(p=r(c,o,p,f,b),f.removeEmptyAttributes&&A(c,o,p))return"";if(void 0!==p&&!f.removeAttributeQuotes||!h(p)){if(!f.preventAttributesEscaping){if(void 0!==f.quoteCharacter)q="'"===f.quoteCharacter?"'":'"';else{var s=(p.match(/'/g)||[]).length,t=(p.match(/"/g)||[]).length;q=t>s?"'":'"'}p='"'===q?p.replace(/"/g,"""):p.replace(/'/g,"'")}l=q+p+q,g||f.removeTagWhitespace||(l+=" ")}else l=!g||d||/\/$/.test(p)?p+" ":p;return void 0===p||f.collapseBooleanAttributes&&n(o,p)?(i=o,g||(i+=" ")):i=o+a.customAssign+l,a.customOpen+i+a.customClose}function F(a){for(var b=["canCollapseWhitespace","canTrimWhitespace"],c=0,d=b.length;d>c;c++)a[b[c]]||(a[b[c]]=function(){return!1})}function G(b,c){"object"!=typeof c&&(c={});try{var d=a.RelateUrl;return"undefined"==typeof d&&"function"==typeof require&&(d=require("relateurl")),d&&d.relate?d.relate(b,c):b}catch(e){M(e)}return b}function H(b,c){"object"!=typeof c&&(c={}),c.fromString=!0;var d=c.output||{};d.inline_script=!0,c.output=d;try{var e=a.UglifyJS;if("undefined"==typeof e&&"function"==typeof require&&(e=require("uglify-js")),!e)return b;if(e.minify)return e.minify(b,c).code;if(e.parse){var f=e.parse(b);f.figure_out_scope();var g=e.Compressor(),h=f.transform(g);h.figure_out_scope(),h.compute_char_frequency(),c.mangle!==!1&&h.mangle_names();var i=e.OutputStream(c.output);return h.print(i),i.toString()}return b}catch(j){M(j)}return b}function I(a,b,c){"object"!=typeof b&&(b={}),"undefined"==typeof b.advanced&&(b.advanced=!1);try{var d;if("undefined"!=typeof CleanCSS)d=new CleanCSS(b);else if("function"==typeof require){var e=require("clean-css");d=new e(b)}return c?u(d.minify(t(a)).styles):d.minify(a).styles}catch(f){M(f)}return a}function J(a){var b;do b=Math.random().toString(36).slice(2);while(~a.indexOf(b));return b}function K(a,c){function g(a,b){return C(a)||c.canCollapseWhitespace(a,b)}function h(a,b){return D(a)||c.canTrimWhitespace(a,b)}function i(){for(var a=q.length-1;a>0&&!/^<[^\/!]/.test(q[a]);)a--;q.length=Math.max(0,a)}function j(){for(var a=q.length-1;a>0&&!/^<\//.test(q[a]);)a--;q.length=a}c=c||{};var k=[];a=O(a),F(c);var m,n,o,p=[],q=[],r="",s="",t=[],u=[],A=[],G="",K="",P=c.lint,Q=Date.now(),R=[],S=[];if(~a.indexOf("")&&(n="",a=a.replace(/([\s\S]*?)/g,function(a,b){return R.push(b),n})),c.ignoreCustomFragments){o=J(a);var T=c.ignoreCustomFragments.map(function(a){return a.source}),U=new RegExp("\\s*(?:"+T.join("|")+")\\s*","g");a=a.replace(U,function(a){return S.push(a)," "+o+" "})}new N(a,{html5:"undefined"!=typeof c.html5?c.html5:!0,start:function(a,b,d,e){var f=a.toLowerCase();if("svg"===f){k.push(c);var l={};for(var n in c)l[n]=c[n];l.keepClosingSlash=!0,l.caseSensitive=!0,c=l}a=c.caseSensitive?a:f,s=a,m=void 0,r="",t=b,c.removeOptionalTags&&(!G||"body"===G&&1===Y[a]||i(),G="",z(K,a)&&j(),K=""),c.collapseWhitespace&&(h(a,b)||u.push(a),g(a,b)||A.push(a));var o="<"+a,p=e&&c.keepClosingSlash;q.push(o),P&&P.testElement(a);for(var v,w=[],x=!0,y=b.length;--y>=0;)P&&P.testAttribute(a,b[y].name.toLowerCase(),b[y].value),v=E(b[y],b,a,p,y,c,x),v&&(x=!1,w.unshift(v));w.length>0?(q.push(" "),q.push.apply(q,w)):c.removeOptionalTags&&1===W[a]&&(G=a),q.push(q.pop()+(p?"/":"")+">")},end:function(a,b){var d=a.toLowerCase();"svg"===d&&(c=k.pop()),a=c.caseSensitive?a:d,c.removeOptionalTags&&(!K||"dt"===K||"thead"===K||"p"===K&&"a"===a||j(),K=1===X[a]?a:""),c.collapseWhitespace&&(u.length&&a===u[u.length-1]&&u.pop(),A.length&&a===A[A.length-1]&&A.pop());var e=!1;a===s&&(s="",e=""===r),c.removeEmptyElements&&e&&B(a,b)?(i(),G="",K=""):(p.push.apply(p,q),q=[""],m=void 0,r="")},chars:function(a,e,f){if(e=""===e?"comment":e,f=""===f?"comment":f,c.collapseWhitespace){if(!u.length){if("comment"===e){var g=""===q[q.length-1];if(g&&(e=m),q.length>1&&(g||" "===r.charAt(r.length-1))){var h=q.length-2;q[h]=q[h].replace(/\s+$/,function(b){return a=b+a,""})}}a=e||f?d(a,e,f,c):O(a)}A.length||(a=e&&f||"html"===f?a:b(a))}("script"===s||"style"===s)&&(c.removeCommentsFromCDATA&&(a=y(a,s)),c.removeCDATASectionsFromCDATA&&(a=w(a)),c.processScripts&&(a=x(a,c,t))),c.minifyJS&&l(s,t)&&(a=H(a,c.minifyJS),";"===a.charAt(a.length-1)&&(a=a.slice(0,-1))),"style"===s&&c.minifyCSS&&(a=I(a,c.minifyCSS)),c.removeOptionalTags&&a&&(("html"===G||"body"===G&&!/^\s/.test(a))&&i(),G="","html"!==K&&"body"!==K&&("head"!==K&&"colgroup"!==K||/^\s/.test(a))||j(),K=""),m=e,r+=a,P&&P.testChars(a),q.push(a)},comment:function(a,b){var d=b?"":"-->";a=c.removeComments?e(a)?d+v(a)+g:f(a,c)?"":"":d+a+g,c.removeOptionalTags&&a&&(G="",K=""),q.push(a)},doctype:function(a){q.push(c.useShortDoctype?"":b(a))},customAttrAssign:c.customAttrAssign,customAttrSurround:c.customAttrSurround}),c.removeOptionalTags&&(G&&i(),K&&"dt"!==K&&"thead"!==K&&j()),p.push.apply(p,q);var V=L(p,c);return o&&(V=V.replace(new RegExp("\\s*"+o+"\\s*","g"),function(){return S.shift()})),n&&(V=V.replace(new RegExp(n,"g"),function(){return R.shift()})),M("minified in: "+(Date.now()-Q)+"ms"),V}function L(a,b){var c,d=b.maxLineLength;if(d){for(var e,f=[],g="",h=0,i=a.length;i>h;h++)e=a[h],g.length+e.length\s*$/,style:/\s*-->\s*$/},W=c(["html","head","body"]),X=c(["html","head","body","li","dt","dd","p","rb","rt","rtc","rp","optgroup","option","colgroup","thead","tbody","tfoot","tr","td","th"]),Y=c(["meta","link","script","style","template"]),Z=c(["address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","ol","p","pre","section","table","ul"]),$=new RegExp("^(?:class|id|style|title|lang|dir|on(?:focus|blur|change|click|dblclick|mouse(?:down|up|over|move|out)|key(?:press|down|up)))$");"undefined"!=typeof exports?exports.minify=K:a.minify=K}("undefined"==typeof exports?this:exports),function(a){"use strict";function b(a){return/^(?:big|small|hr|blink|marquee)$/.test(a)}function c(a){return/^(?:applet|basefont|center|dir|font|isindex|strike)$/.test(a)}function d(a){return/^on[a-z]+/.test(a)}function e(a){return"style"===a.toLowerCase()}function f(a,b){return"align"===b&&/^(?:caption|applet|iframe|img|imput|object|legend|table|hr|div|h[1-6]|p)$/.test(a)||"alink"===b&&"body"===a||"alt"===b&&"applet"===a||"archive"===b&&"applet"===a||"background"===b&&"body"===a||"bgcolor"===b&&/^(?:table|t[rdh]|body)$/.test(a)||"border"===b&&/^(?:img|object)$/.test(a)||"clear"===b&&"br"===a||"code"===b&&"applet"===a||"codebase"===b&&"applet"===a||"color"===b&&/^(?:base(?:font)?)$/.test(a)||"compact"===b&&/^(?:dir|[dou]l|menu)$/.test(a)||"face"===b&&/^base(?:font)?$/.test(a)||"height"===b&&/^(?:t[dh]|applet)$/.test(a)||"hspace"===b&&/^(?:applet|img|object)$/.test(a)||"language"===b&&"script"===a||"link"===b&&"body"===a||"name"===b&&"applet"===a||"noshade"===b&&"hr"===a||"nowrap"===b&&/^t[dh]$/.test(a)||"object"===b&&"applet"===a||"prompt"===b&&"isindex"===a||"size"===b&&/^(?:hr|font|basefont)$/.test(a)||"start"===b&&"ol"===a||"text"===b&&"body"===a||"type"===b&&/^(?:li|ol|ul)$/.test(a)||"value"===b&&"li"===a||"version"===b&&"html"===a||"vlink"===b&&"body"===a||"vspace"===b&&/^(?:applet|img|object)$/.test(a)||"width"===b&&/^(?:hr|td|th|applet|pre)$/.test(a)}function g(a,b){return"href"===a&&/^\s*javascript\s*:\s*void\s*(\s+0|\(\s*0\s*\))\s*$/i.test(b)}function h(){this.log=[],this._lastElement=null,this._isElementRepeated=!1}h.prototype.testElement=function(a){c(a)?this.log.push('Found deprecated <'+a+"> element"):b(a)?this.log.push('Found presentational <'+a+"> element"):this.checkRepeatingElement(a)},h.prototype.checkRepeatingElement=function(a){"br"===a&&"br"===this._lastElement?this._isElementRepeated=!0:this._isElementRepeated&&(this._reportRepeatingElement(),this._isElementRepeated=!1),this._lastElement=a},h.prototype._reportRepeatingElement=function(){this.log.push("Found <br> sequence. Try replacing it with styling.")},h.prototype.testAttribute=function(a,b,c){d(b)?this.log.push('Found event attribute ('+b+") on <"+a+"> element."):f(a,b)?this.log.push('Found deprecated '+b+" attribute on <"+a+"> element."):e(b)?this.log.push('Found style attribute on <'+a+"> element."):g(b,c)&&this.log.push('Found inaccessible attribute (on <'+a+"> element).")},h.prototype.testChars=function(a){this._lastElement="",/( \s*){2,}/.test(a)&&this.log.push("Found repeating &nbsp; sequence. Try replacing it with styling.")},h.prototype.test=function(a,b,c){this.testElement(a),this.testAttribute(a,b,c)},h.prototype.populate=function(a){if(this._isElementRepeated&&this._reportRepeatingElement(),this.log.length)if(a)a.innerHTML="
  1. "+this.log.join("
  2. ")+"
";else{var b=" - "+this.log.join("\n - ").replace(/(<([^>]+)>)/gi,"").replace(/</g,"<").replace(/>/g,">");console.log(b)}},a.HTMLLint=h}("undefined"==typeof exports?this:exports); \ No newline at end of file +!function(a){"use strict";function b(a){var b,c=new RegExp("(?:\\s*[\\w:\\.-]+(?:\\s*(?:"+d(a)+")\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*");if(a.customAttrSurround){for(var e=[],f=a.customAttrSurround.length-1;f>=0;f--)e[f]="(?:\\s*"+a.customAttrSurround[f][0].source+"\\s*"+c.source+"\\s*"+a.customAttrSurround[f][1].source+")";e.unshift(c.source),b=new RegExp("((?:"+e.join("|")+")*)")}else b=new RegExp("("+c.source+")");return new RegExp(j.source+b.source+k.source)}function c(a){var b=new RegExp(f.source+"(?:\\s*("+d(a)+")\\s*(?:"+i.join("|")+"))?");if(a.customAttrSurround){for(var c=[],e=a.customAttrSurround.length-1;e>=0;e--)c[e]="(?:("+a.customAttrSurround[e][0].source+")\\s*"+b.source+"\\s*("+a.customAttrSurround[e][1].source+"))";return c.unshift("(?:"+b.source+")"),new RegExp(c.join("|"),"g")}return new RegExp(b.source,"g")}function d(a){return h.concat(a.customAttrAssign||[]).map(function(a){return"(?:"+a.source+")"}).join("|")}function e(a){for(var b={},c=a.split(","),d=0;d\s]+)/.source],j=/^<([\w:-]+)/,k=/\s*(\/?)>/,l=/^<\/([\w:-]+)[^>]*>/,m=/\/>$/,n=/^]+>/i,o=!1;"x".replace(/x(.)?/g,function(a,b){o=""===b});var p,q,r,s=e("area,base,basefont,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),t=e("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,noscript,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,svg,textarea,tt,u,var"),u=e("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),v=e("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),w=e("script,style"),x={},y=a.HTMLParser=function(a,d){function e(a,b,c,e){for(var g=!1;!d.html5&&k.last()&&t[k.last()];)f("",k.last());u[b]&&k.last()===b&&f("",b),e=s[b]||!!e;var h=[];c.replace(A,function(){var a,b,c,e,f,g,i,j=7;if(o&&-1===arguments[0].indexOf('""')&&(""===arguments[3]&&(arguments[3]=void 0),""===arguments[4]&&(arguments[4]=void 0),""===arguments[5]&&(arguments[5]=void 0)),a=arguments[1])g=arguments[2],c=arguments[3],b=c||arguments[4]||arguments[5],g&&(i=arguments[0].charAt(a.length+g.length),i="'"===i||'"'===i?i:"");else if(d.customAttrSurround)for(var k=d.customAttrSurround.length-1;k>=0;k--)if(a=arguments[k*j+7],g=arguments[k*j+8],a){c=arguments[k*j+9],b=c||arguments[k*j+10]||arguments[k*j+11],e=arguments[k*j+6],f=arguments[k*j+12];break}void 0===b&&(b=v[a]?a:c),h.push({name:a,value:b,customAssign:g||"=",customOpen:e||"",customClose:f||"",quote:i||""})}),e?g=a.match(m):k.push({tag:b,attrs:h}),d.start&&d.start(b,h,e,g)}function f(a,b){var c;if(b){var e=b.toLowerCase();for(c=k.length-1;c>=0&&k[c].tag.toLowerCase()!==e;c--);}else c=0;if(c>=0){for(var f=k.length-1;f>=c;f--)d.end&&d.end(k[f].tag,k[f].attrs);k.length=c}}var g,h,i,j,k=[],y=a;k.last=function(){var a=this[this.length-1];return a&&a.tag};for(var z=b(d),A=c(d);a;){if(k.last()&&w[k.last()])p=k.last().toLowerCase(),q=x[p]||(x[p]=new RegExp("([\\s\\S]*?)]*>","i")),a=a.replace(q,function(a,b){return"script"!==p&&"style"!==p&&"noscript"!==p&&(b=b.replace(//g,"$1").replace(//g,"$1")),d.chars&&d.chars(b),""}),f("",p);else{if(/^"),g>=0)){d.comment&&d.comment(a.substring(4,g)),a=a.substring(g+3),i="";continue}if(/^"),g>=0)){d.comment&&d.comment(a.substring(2,g+1),!0),a=a.substring(g+2),i="";continue}if(/^<\?/.test(a)&&(g=a.indexOf("?>",2),g>=0)){d.chars&&d.chars(a.substring(0,g+2)),a=a.substring(g+2),i="";continue}if(/^<%/.test(a)&&(g=a.indexOf("%>",2),g>=0)){d.chars&&d.chars(a.substring(0,g+2)),a=a.substring(g+2),i="";continue}if(h=n.exec(a)){d.doctype&&d.doctype(h[0]),a=a.substring(h[0].length),i="";continue}if(/^<\//.test(a)&&(h=a.match(l))){a=a.substring(h[0].length),h[0].replace(l,f),i="/"+h[1].toLowerCase();continue}if(/^g?a:a.substring(0,g);a=0>g?"":a.substring(g),r=a.match(z),r?j=r[1]:(r=a.match(l),j=r?"/"+r[1]:""),d.chars&&d.chars(B,i,j),i=""}if(a===y)throw"Parse Error: "+a;y=a}f()};a.HTMLtoXML=function(a){var b="";return new y(a,{start:function(a,c,d){b+="<"+a;for(var e=0;e"},end:function(a){b+=""},chars:function(a){b+=a},comment:function(a){b+=""},ignore:function(a){b+=a}}),b},a.HTMLtoDOM=function(a,b){var c=e("html,head,body,title"),d={link:"head",base:"head"};b?b=b.ownerDocument||b.getOwnerDocument&&b.getOwnerDocument()||b:"undefined"!=typeof DOMDocument?b=new DOMDocument:"undefined"!=typeof document&&document.implementation&&document.implementation.createDocument?b=document.implementation.createDocument("","",null):"undefined"!=typeof ActiveX&&(b=new ActiveXObject("Msxml.DOMDocument"));var f=[],g=b.documentElement||b.getDocumentElement&&b.getDocumentElement();if(!g&&b.createElement&&!function(){var a=b.createElement("html"),c=b.createElement("head");c.appendChild(b.createElement("title")),a.appendChild(c),a.appendChild(b.createElement("body")),b.appendChild(a)}(),b.getElementsByTagName)for(var h in c)c[h]=b.getElementsByTagName(h)[0];var i=c.body;return new y(a,{start:function(a,e,g){if(c[a])return void(i=c[a]);var h=b.createElement(a);for(var j in e)h.setAttribute(e[j].name,e[j].value);d[a]&&"boolean"!=typeof c[d[a]]?c[d[a]].appendChild(h):i&&i.appendChild&&i.appendChild(h),g||(f.push(h),i=h)},end:function(){f.length-=1,i=f[f.length-1]},chars:function(a){i.appendChild(b.createTextNode(a))},comment:function(){},ignore:function(){}}),b}}("undefined"==typeof exports?this:exports),function(a){"use strict";function b(a){return a?a.replace(/[\t\n\r ]+/g," "):a}function c(a){var b={};return a.forEach(function(a){b[a]=1}),b}function d(a,c,d,e){var f="",g="";return e.preserveLineBreaks&&(a=a.replace(/^[\t ]*[\n\r]+[\t\n\r ]*/,function(){return f="\n",""}).replace(/[\t\n\r ]*[\n\r]+[\t ]*$/,function(){return g="\n",""})),c&&"img"!==c&&"input"!==c&&"comment"!==c&&("/"!==c.charAt(0)||e.collapseInlineTagWhitespace||1!==P[c.substr(1)])&&(a=a.replace(/^\s+/,!e.preserveLineBreaks&&e.conservativeCollapse?" ":"")),d&&"img"!==d&&"input"!==d&&"comment"!==d&&("/"===d.charAt(0)||e.collapseInlineTagWhitespace||1!==P[d])&&(a=a.replace(/\s+$/,!e.preserveLineBreaks&&e.conservativeCollapse?" ":"")),c&&d&&(a=b(a)),f+a+g}function e(a){return/\[if[^\]]+\]/.test(a)||/\s*((?:c;c++)if(b.ignoreCustomComments[c].test(a))return!0;return!1}function g(a,b){var c=b.customEventAttributes;if(c){for(var d=c.length;d--;)if(c[d].test(a))return!0;return!1}return/^on[a-z]{3,}$/.test(a)}function h(a){return/^[^\x20\t\n\f\r"'`=<>]+$/.test(a)}function i(a,b){for(var c=a.length;c--;)if(a[c].name.toLowerCase()===b)return!0;return!1}function j(a,b,c,d){return c=c?O(c.toLowerCase()):"","script"===a&&"language"===b&&"javascript"===c||"form"===a&&"method"===b&&"get"===c||"input"===a&&"type"===b&&"text"===c||"script"===a&&"charset"===b&&!i(d,"src")||"a"===a&&"name"===b&&i(d,"id")||"area"===a&&"shape"===b&&"rect"===c}function k(a,b,c){return"script"===a&&"type"===b&&"text/javascript"===O(c.toLowerCase())}function l(a,b){if("script"!==a)return!1;for(var c=0,d=b.length;d>c;c++){var e=b[c].name.toLowerCase();if("type"===e){var f=O(b[c].value).split(/;/,2)[0].toLowerCase();return""===f||1===Q[f]}}return!0}function m(a,b,c){return("style"===a||"link"===a)&&"type"===b&&"text/css"===O(c.toLowerCase())}function n(a,b){var c=/^(?:allowfullscreen|async|autofocus|autoplay|checked|compact|controls|declare|default|defaultchecked|defaultmuted|defaultselected|defer|disabled|enabled|formnovalidate|hidden|indeterminate|inert|ismap|itemscope|loop|multiple|muted|nohref|noresize|noshade|novalidate|nowrap|open|pauseonexit|readonly|required|reversed|scoped|seamless|selected|sortable|truespeed|typemustmatch|visible)$/i.test(a);if(c)return!0;var d=R[a.toLowerCase()];return d?-1===d.indexOf(b.toLowerCase()):!1}function o(a,b){return/^(?:a|area|link|base)$/.test(b)&&"href"===a||"img"===b&&/^(?:src|longdesc|usemap)$/.test(a)||"object"===b&&/^(?:classid|codebase|data|usemap)$/.test(a)||"q"===b&&"cite"===a||"blockquote"===b&&"cite"===a||("ins"===b||"del"===b)&&"cite"===a||"form"===b&&"action"===a||"input"===b&&("src"===a||"usemap"===a)||"head"===b&&"profile"===a||"script"===b&&("src"===a||"for"===a)}function p(a,b){return/^(?:a|area|object|button)$/.test(b)&&"tabindex"===a||"input"===b&&("maxlength"===a||"tabindex"===a)||"select"===b&&("size"===a||"tabindex"===a)||"textarea"===b&&/^(?:rows|cols|tabindex)$/.test(a)||"colgroup"===b&&"span"===a||"col"===b&&"span"===a||("th"===b||"td"===b)&&("rowspan"===a||"colspan"===a)}function q(a,b){if("link"!==a)return!1;for(var c=0,d=b.length;d>c;c++)if("rel"===b[c].name&&"canonical"===b[c].value)return!0}function r(a,c,d,e,f){if(d&&g(c,e)){if(d=O(d).replace(/^javascript:\s*/i,"").replace(/\s*;$/,""),e.minifyJS){var h=H(S+d+T,e.minifyJS);return h.slice(S.length,-T.length)}return d}return"class"===c?b(O(d)):o(c,a)?(d=O(d),e.minifyURLs&&!q(a,f)?G(d,e.minifyURLs):d):p(c,a)?O(d):"style"===c?(d=O(d),d&&(d=d.replace(/\s*;\s*$/,"")),e.minifyCSS?I(d,e.minifyCSS,!0):d):(s(a,f)&&"content"===c?d=d.replace(/\s+/g,"").replace(/[0-9]+\.[0-9]+/g,function(a){return(+a).toString()}):d&&e.customAttrCollapse&&e.customAttrCollapse.test(c)&&(d=d.replace(/\n+|\r+|\s{2,}/g,"")),d)}function s(a,b){if("meta"!==a)return!1;for(var c=0,d=b.length;d>c;c++)if("name"===b[c].name&&"viewport"===b[c].value)return!0}function t(a){return"*{"+a+"}"}function u(a){var b=a.match(/^\*\{([\s\S]*)\}$/m);return b&&b[1]?b[1]:a}function v(a){return a.replace(/^(\[[^\]]+\]>)\s*/,"$1").replace(/\s*(\s*\*\/|\/\/\s*\]\]>)\s*$/,"")}function x(a,b,c){for(var d=0,e=c.length;e>d;d++)if("type"===c[d].name.toLowerCase()&&b.processScripts.indexOf(c[d].value)>-1)return K(a,b);return a}function y(a,b){return a.replace(U[b],"").replace(V[b],"")}function z(a,b){switch(a){case"html":case"head":case"body":case"colgroup":return!0;case"li":case"optgroup":case"tr":return b===a;case"dt":case"dd":return"dt"===b||"dd"===b;case"p":return 1===Z[b];case"rb":case"rt":case"rp":return"rb"===b||"rt"===b||"rtc"===b||"rp"===b;case"rtc":return"rb"===b||"rtc"===b||"rp"===b;case"option":return"option"===b||"optgroup"===b;case"thead":case"tbody":return"tbody"===b||"tfoot"===b;case"tfoot":return"tbody"===b;case"td":case"th":return"td"===b||"th"===b}return!1}function A(a,b,c){var d=!c||/^\s*$/.test(c);return d?"input"===a&&"value"===b||$.test(b):!1}function B(a,b){if("textarea"===a)return!1;if("script"===a)for(var c=b.length-1;c>=0;c--)if("src"===b[c].name)return!1;return!0}function C(a){return!/^(?:script|style|pre|textarea)$/.test(a)}function D(a){return!/^(?:pre|textarea)$/.test(a)}function E(a,b,c,d,e,f,g){var i,l,o=f.caseSensitive?a.name:a.name.toLowerCase(),p=a.value,q=a.quote;if(f.removeRedundantAttributes&&j(c,o,p,b)||f.removeScriptTypeAttributes&&k(c,o,p)||f.removeStyleLinkTypeAttributes&&m(c,o,p))return"";if(p=r(c,o,p,f,b),f.removeEmptyAttributes&&A(c,o,p))return"";if(void 0!==p&&!f.removeAttributeQuotes||!h(p)){if(!f.preventAttributesEscaping){if(void 0!==f.quoteCharacter)q="'"===f.quoteCharacter?"'":'"';else{var s=(p.match(/'/g)||[]).length,t=(p.match(/"/g)||[]).length;q=t>s?"'":'"'}p='"'===q?p.replace(/"/g,"""):p.replace(/'/g,"'")}l=q+p+q,g||f.removeTagWhitespace||(l+=" ")}else l=!g||d||/\/$/.test(p)?p+" ":p;return void 0===p||f.collapseBooleanAttributes&&n(o,p)?(i=o,g||(i+=" ")):i=o+a.customAssign+l,a.customOpen+i+a.customClose}function F(a){for(var b=["canCollapseWhitespace","canTrimWhitespace"],c=0,d=b.length;d>c;c++)a[b[c]]||(a[b[c]]=function(){return!1})}function G(b,c){"object"!=typeof c&&(c={});try{var d=a.RelateUrl;return"undefined"==typeof d&&"function"==typeof require&&(d=require("relateurl")),d&&d.relate?d.relate(b,c):b}catch(e){M(e)}return b}function H(b,c){"object"!=typeof c&&(c={}),c.fromString=!0;var d=c.output||{};d.inline_script=!0,c.output=d;try{var e=a.UglifyJS;if("undefined"==typeof e&&"function"==typeof require&&(e=require("uglify-js")),!e)return b;if(e.minify)return e.minify(b,c).code;if(e.parse){var f=e.parse(b);f.figure_out_scope();var g=e.Compressor(),h=f.transform(g);h.figure_out_scope(),h.compute_char_frequency(),c.mangle!==!1&&h.mangle_names();var i=e.OutputStream(c.output);return h.print(i),i.toString()}return b}catch(j){M(j)}return b}function I(a,b,c){"object"!=typeof b&&(b={}),"undefined"==typeof b.advanced&&(b.advanced=!1);try{var d;if("undefined"!=typeof CleanCSS)d=new CleanCSS(b);else if("function"==typeof require){var e=require("clean-css");d=new e(b)}return c?u(d.minify(t(a)).styles):d.minify(a).styles}catch(f){M(f)}return a}function J(a){var b;do b=Math.random().toString(36).slice(2);while(~a.indexOf(b));return b}function K(a,c){function g(a,b){return C(a)||c.canCollapseWhitespace(a,b)}function h(a,b){return D(a)||c.canTrimWhitespace(a,b)}function i(){for(var a=q.length-1;a>0&&!/^<[^\/!]/.test(q[a]);)a--;q.length=Math.max(0,a)}function j(){for(var a=q.length-1;a>0&&!/^<\//.test(q[a]);)a--;q.length=a}c=c||{};var k=[];a=O(a),F(c);var m,n,o,p=[],q=[],r="",s="",t=[],u=[],A=[],G="",K="",P=c.lint,Q=Date.now(),R=[],S=[];if(~a.indexOf("")&&(n="",a=a.replace(/([\s\S]*?)/g,function(a,b){return R.push(b),n})),c.ignoreCustomFragments){o=J(a);var T=c.ignoreCustomFragments.map(function(a){return a.source}),U=new RegExp("\\s*(?:"+T.join("|")+")\\s*","g");a=a.replace(U,function(a){return S.push(a)," "+o+" "})}new N(a,{html5:"undefined"!=typeof c.html5?c.html5:!0,start:function(a,b,d,e){var f=a.toLowerCase();if("svg"===f){k.push(c);var l={};for(var n in c)l[n]=c[n];l.keepClosingSlash=!0,l.caseSensitive=!0,c=l}a=c.caseSensitive?a:f,s=a,m=a,r="",t=b,c.removeOptionalTags&&(!G||"body"===G&&1===Y[a]||i(),G="",z(K,a)&&j(),K=""),c.collapseWhitespace&&(h(a,b)||u.push(a),g(a,b)||A.push(a));var o="<"+a,p=e&&c.keepClosingSlash;q.push(o),P&&P.testElement(a);for(var v,w=[],x=!0,y=b.length;--y>=0;)P&&P.testAttribute(a,b[y].name.toLowerCase(),b[y].value),v=E(b[y],b,a,p,y,c,x),v&&(x=!1,w.unshift(v));w.length>0?(q.push(" "),q.push.apply(q,w)):c.removeOptionalTags&&1===W[a]&&(G=a),q.push(q.pop()+(p?"/":"")+">")},end:function(a,b){var e=a.toLowerCase();if("svg"===e&&(c=k.pop()),a=c.caseSensitive?a:e,c.removeOptionalTags&&(!K||"dt"===K||"thead"===K||"p"===K&&"a"===a||j(),K=1===X[a]?a:""),c.collapseWhitespace){if(u.length)a===u[u.length-1]&&u.pop();else{var f;q.length>1&&""===q[q.length-1]&&/\s+$/.test(q[q.length-2])?f=q.length-2:q.length>0&&/\s+$/.test(q[q.length-1])&&(f=q.length-1),f>0&&(q[f]=q[f].replace(/\s+$/,function(b){return d(b,"comment","/"+a,c)}))}A.length&&a===A[A.length-1]&&A.pop()}var g=!1;a===s&&(s="",g=""===r),c.removeEmptyElements&&g&&B(a,b)?(i(),G="",K=""):(p.push.apply(p,q),q=[""],m="/"+a,r="")},chars:function(a,e,f){if(e=""===e?"comment":e,f=""===f?"comment":f,c.collapseWhitespace){if(!u.length){if("comment"===e){var g=""===q[q.length-1];if(g&&(e=m),q.length>1&&(g||" "===r.charAt(r.length-1))){var h=q.length-2;q[h]=q[h].replace(/\s+$/,function(b){return a=b+a,""})}}a=e||f?d(a,e,f,c):O(a)}A.length||(a=e&&f||"html"===f?a:b(a))}("script"===s||"style"===s)&&(c.removeCommentsFromCDATA&&(a=y(a,s)),c.removeCDATASectionsFromCDATA&&(a=w(a)),c.processScripts&&(a=x(a,c,t))),c.minifyJS&&l(s,t)&&(a=H(a,c.minifyJS),";"===a.charAt(a.length-1)&&(a=a.slice(0,-1))),"style"===s&&c.minifyCSS&&(a=I(a,c.minifyCSS)),c.removeOptionalTags&&a&&(("html"===G||"body"===G&&!/^\s/.test(a))&&i(),G="","html"!==K&&"body"!==K&&("head"!==K&&"colgroup"!==K||/^\s/.test(a))||j(),K=""),m=/^\s*$/.test(a)?e:"comment",r+=a,P&&P.testChars(a),q.push(a)},comment:function(a,b){var d=b?"":"-->";a=c.removeComments?e(a)?d+v(a)+g:f(a,c)?"":"":d+a+g,c.removeOptionalTags&&a&&(G="",K=""),q.push(a)},doctype:function(a){q.push(c.useShortDoctype?"":b(a))},customAttrAssign:c.customAttrAssign,customAttrSurround:c.customAttrSurround}),c.removeOptionalTags&&(G&&i(),K&&"dt"!==K&&"thead"!==K&&j()),p.push.apply(p,q);var V=L(p,c);return o&&(V=V.replace(new RegExp("\\s*"+o+"\\s*","g"),function(){return S.shift()})),n&&(V=V.replace(new RegExp(n,"g"),function(){return R.shift()})),M("minified in: "+(Date.now()-Q)+"ms"),V}function L(a,b){var c,d=b.maxLineLength;if(d){for(var e,f=[],g="",h=0,i=a.length;i>h;h++)e=a[h],g.length+e.length\s*$/,style:/\s*-->\s*$/},W=c(["html","head","body"]),X=c(["html","head","body","li","dt","dd","p","rb","rt","rtc","rp","optgroup","option","colgroup","thead","tbody","tfoot","tr","td","th"]),Y=c(["meta","link","script","style","template"]),Z=c(["address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","ol","p","pre","section","table","ul"]),$=new RegExp("^(?:class|id|style|title|lang|dir|on(?:focus|blur|change|click|dblclick|mouse(?:down|up|over|move|out)|key(?:press|down|up)))$");"undefined"!=typeof exports?exports.minify=K:a.minify=K}("undefined"==typeof exports?this:exports),function(a){"use strict";function b(a){return/^(?:big|small|hr|blink|marquee)$/.test(a)}function c(a){return/^(?:applet|basefont|center|dir|font|isindex|strike)$/.test(a)}function d(a){return/^on[a-z]+/.test(a)}function e(a){return"style"===a.toLowerCase()}function f(a,b){return"align"===b&&/^(?:caption|applet|iframe|img|imput|object|legend|table|hr|div|h[1-6]|p)$/.test(a)||"alink"===b&&"body"===a||"alt"===b&&"applet"===a||"archive"===b&&"applet"===a||"background"===b&&"body"===a||"bgcolor"===b&&/^(?:table|t[rdh]|body)$/.test(a)||"border"===b&&/^(?:img|object)$/.test(a)||"clear"===b&&"br"===a||"code"===b&&"applet"===a||"codebase"===b&&"applet"===a||"color"===b&&/^(?:base(?:font)?)$/.test(a)||"compact"===b&&/^(?:dir|[dou]l|menu)$/.test(a)||"face"===b&&/^base(?:font)?$/.test(a)||"height"===b&&/^(?:t[dh]|applet)$/.test(a)||"hspace"===b&&/^(?:applet|img|object)$/.test(a)||"language"===b&&"script"===a||"link"===b&&"body"===a||"name"===b&&"applet"===a||"noshade"===b&&"hr"===a||"nowrap"===b&&/^t[dh]$/.test(a)||"object"===b&&"applet"===a||"prompt"===b&&"isindex"===a||"size"===b&&/^(?:hr|font|basefont)$/.test(a)||"start"===b&&"ol"===a||"text"===b&&"body"===a||"type"===b&&/^(?:li|ol|ul)$/.test(a)||"value"===b&&"li"===a||"version"===b&&"html"===a||"vlink"===b&&"body"===a||"vspace"===b&&/^(?:applet|img|object)$/.test(a)||"width"===b&&/^(?:hr|td|th|applet|pre)$/.test(a)}function g(a,b){return"href"===a&&/^\s*javascript\s*:\s*void\s*(\s+0|\(\s*0\s*\))\s*$/i.test(b)}function h(){this.log=[],this._lastElement=null,this._isElementRepeated=!1}h.prototype.testElement=function(a){c(a)?this.log.push('Found deprecated <'+a+"> element"):b(a)?this.log.push('Found presentational <'+a+"> element"):this.checkRepeatingElement(a)},h.prototype.checkRepeatingElement=function(a){"br"===a&&"br"===this._lastElement?this._isElementRepeated=!0:this._isElementRepeated&&(this._reportRepeatingElement(),this._isElementRepeated=!1),this._lastElement=a},h.prototype._reportRepeatingElement=function(){this.log.push("Found <br> sequence. Try replacing it with styling.")},h.prototype.testAttribute=function(a,b,c){d(b)?this.log.push('Found event attribute ('+b+") on <"+a+"> element."):f(a,b)?this.log.push('Found deprecated '+b+" attribute on <"+a+"> element."):e(b)?this.log.push('Found style attribute on <'+a+"> element."):g(b,c)&&this.log.push('Found inaccessible attribute (on <'+a+"> element).")},h.prototype.testChars=function(a){this._lastElement="",/( \s*){2,}/.test(a)&&this.log.push("Found repeating &nbsp; sequence. Try replacing it with styling.")},h.prototype.test=function(a,b,c){this.testElement(a),this.testAttribute(a,b,c)},h.prototype.populate=function(a){if(this._isElementRepeated&&this._reportRepeatingElement(),this.log.length)if(a)a.innerHTML="
  1. "+this.log.join("
  2. ")+"
";else{var b=" - "+this.log.join("\n - ").replace(/(<([^>]+)>)/gi,"").replace(/</g,"<").replace(/>/g,">");console.log(b)}},a.HTMLLint=h}("undefined"==typeof exports?this:exports); \ No newline at end of file diff --git a/src/htmlminifier.js b/src/htmlminifier.js index 85ca159..e2c6f96 100644 --- a/src/htmlminifier.js +++ b/src/htmlminifier.js @@ -816,7 +816,7 @@ tag = options.caseSensitive ? tag : lowerTag; currentTag = tag; - charsPrevTag = undefined; + charsPrevTag = tag; currentChars = ''; currentAttrs = attrs; @@ -889,9 +889,24 @@ // check if current tag is in a whitespace stack if (options.collapseWhitespace) { - if (stackNoTrimWhitespace.length && - tag === stackNoTrimWhitespace[stackNoTrimWhitespace.length - 1]) { - stackNoTrimWhitespace.pop(); + if (stackNoTrimWhitespace.length) { + if (tag === stackNoTrimWhitespace[stackNoTrimWhitespace.length - 1]) { + stackNoTrimWhitespace.pop(); + } + } + else { + var charsIndex; + if (buffer.length > 1 && buffer[buffer.length - 1] === '' && /\s+$/.test(buffer[buffer.length - 2])) { + charsIndex = buffer.length - 2; + } + else if (buffer.length > 0 && /\s+$/.test(buffer[buffer.length - 1])) { + charsIndex = buffer.length - 1; + } + if (charsIndex > 0) { + buffer[charsIndex] = buffer[charsIndex].replace(/\s+$/, function(text) { + return collapseWhitespaceSmart(text, 'comment', '/' + tag, options); + }); + } } if (stackNoCollapseWhitespace.length && tag === stackNoCollapseWhitespace[stackNoCollapseWhitespace.length - 1]) { @@ -914,7 +929,7 @@ // push out everything but the end tag results.push.apply(results, buffer); buffer = ['']; - charsPrevTag = undefined; + charsPrevTag = '/' + tag; currentChars = ''; } }, @@ -972,7 +987,7 @@ } optionalEndTag = ''; } - charsPrevTag = prevTag; + charsPrevTag = /^\s*$/.test(text) ? prevTag : 'comment'; currentChars += text; if (lint) { lint.testChars(text); @@ -1061,7 +1076,7 @@ str = results.join(''); } - return str; + return trimWhitespace(str); } // for CommonJS enviroments, export everything diff --git a/tests/minifier.js b/tests/minifier.js index ebbcffe..02c99b6 100644 --- a/tests/minifier.js +++ b/tests/minifier.js @@ -115,6 +115,21 @@ equal(minify('

foo bar

', { collapseWhitespace: true }), '

foo bar

'); equal(minify('
Empty not
', { collapseWhitespace: true }), '
Empty not
'); equal(minify('
a c
', { removeComments: true, collapseWhitespace: true }), '
a c
'); + [ + ' a c ', + ' a c ', + ' a c ', + ' a c ', + ' a c ', + ' a c ', + ' a c ', + ' a c ', + ' a c ' + ].forEach(function(input, index) { + input = input.replace(/b/, 'b' + index); + equal(minify(input, { removeComments: true, collapseWhitespace: true }), 'a c'); + equal(minify('

' + input + '

', { removeComments: true, collapseWhitespace: true }), '

a c

'); + }); }); test('doctype normalization', function() { @@ -713,13 +728,13 @@ input = '
before
'; output = '
before
'; equal(minify(input, { removeEmptyElements: true }), output); - output = '
before
'; + output = '
before
'; equal(minify(input, { collapseWhitespace:true, removeEmptyElements: true }), output); input = '
both
'; output = '
both
'; equal(minify(input, { removeEmptyElements: true }), output); - output = '
both
'; + output = '
both
'; equal(minify(input, { collapseWhitespace:true, removeEmptyElements: true }), output); input = '
Empty
';