mirror of
https://github.com/mrclay/minify.git
synced 2025-08-30 17:19:54 +02:00
Reorganization of "web" to "min_extras"
This commit is contained in:
10
min_extras/ab_tests/README.txt
Normal file
10
min_extras/ab_tests/README.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
This is a little AB testing setup for Windows. Before committing any non-trivial
|
||||
change, these tests should be run so "results_summary.txt" will be an up-to-date
|
||||
document of each revision's performance.
|
||||
|
||||
Before testing make sure all cache locations are correct.
|
||||
|
||||
Double-click "test_all.bat" to run the tests. At the end, "results_summary.txt"
|
||||
will be opened in notepad. For more details see "results.txt".
|
||||
|
||||
Delete "results.txt" before committing. We don't need this much info in svn.
|
3
min_extras/ab_tests/_delimiter
Normal file
3
min_extras/ab_tests/_delimiter
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
25
min_extras/ab_tests/ideal_php/before.php
Normal file
25
min_extras/ab_tests/ideal_php/before.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* The goal with this file is to benchmark serving the file doing the absolute
|
||||
* least operations possible. E.g. we know we'll have to check for the file,
|
||||
* check its size and the mtimes of it and the src file.
|
||||
*/
|
||||
|
||||
$src = realpath(dirname(__FILE__) . '/../minify/before.js');
|
||||
$cached = realpath(dirname(__FILE__) . '/../type-map') . '/before.js.zd';
|
||||
|
||||
// clearstatcache() takes over 2ms on Athlon 64 X2 5600+! Avoid at all costs!
|
||||
//clearstatcache();
|
||||
|
||||
filemtime($src);
|
||||
file_exists($cached);
|
||||
filemtime($cached);
|
||||
|
||||
header('Cache-Control: public, max-age=31536000');
|
||||
header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + (86400 * 365)));
|
||||
header('Content-Type: application/x-javascript; charset=utf-8');
|
||||
header('Content-Encoding: deflate');
|
||||
header('Content-Length: ' . filesize($cached));
|
||||
header('Vary: Accept-Encoding');
|
||||
|
||||
readfile($cached);
|
3408
min_extras/ab_tests/minify/before.js
Normal file
3408
min_extras/ab_tests/minify/before.js
Normal file
File diff suppressed because it is too large
Load Diff
15
min_extras/ab_tests/minify/test_Files.php
Normal file
15
min_extras/ab_tests/minify/test_Files.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
|
||||
require 'Minify.php';
|
||||
|
||||
// give an explicit path to avoid having to load Solar/Dir.php
|
||||
Minify::setCache($minifyCachePath);
|
||||
|
||||
Minify::serve('Files', array(
|
||||
'files' => array(
|
||||
dirname(__FILE__) . '/before.js'
|
||||
)
|
||||
,'setExpires' => $_SERVER['REQUEST_TIME'] + 31536000 // 1 yr
|
||||
));
|
15
min_extras/ab_tests/minify/test_Groups.php
Normal file
15
min_extras/ab_tests/minify/test_Groups.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
|
||||
require 'Minify.php';
|
||||
|
||||
// give an explicit path to avoid having to load Solar/Dir.php
|
||||
Minify::setCache($minifyCachePath);
|
||||
|
||||
Minify::serve('Groups', array(
|
||||
'groups' => array(
|
||||
'test' => array(dirname(__FILE__) . '/before.js')
|
||||
)
|
||||
,'setExpires' => $_SERVER['REQUEST_TIME'] + 31536000 // 1 yr
|
||||
));
|
12
min_extras/ab_tests/minify/test_Version1.php
Normal file
12
min_extras/ab_tests/minify/test_Version1.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
|
||||
define('MINIFY_BASE_DIR', realpath(
|
||||
dirname(__FILE__) . '/../minify'
|
||||
));
|
||||
define('MINIFY_CACHE_DIR', $minifyCachePath);
|
||||
|
||||
require 'Minify.php';
|
||||
|
||||
Minify::serve('Version1');
|
30
min_extras/ab_tests/mod_deflate/.htaccess-dev
Normal file
30
min_extras/ab_tests/mod_deflate/.htaccess-dev
Normal file
@@ -0,0 +1,30 @@
|
||||
# turn off MultiViews if enabled
|
||||
Options -MultiViews
|
||||
|
||||
# Necessary to add charset while using type-map
|
||||
AddType application/x-javascript;charset=utf-8 js
|
||||
AddType text/css;charset=utf-8 css
|
||||
|
||||
# Below we remove the ETag header and set a far-off Expires
|
||||
# header. Since clients will aggressively cache, make sure
|
||||
# to modify the URL (querystring or via mod_rewrite) when
|
||||
# the resource changes
|
||||
|
||||
# remove ETag
|
||||
FileETag None
|
||||
|
||||
# requires mod_expires
|
||||
ExpiresActive On
|
||||
# sets Expires and Cache-Control: max-age, but not "public"
|
||||
ExpiresDefault "access plus 1 year"
|
||||
|
||||
# requires mod_headers
|
||||
# adds the "public" to Cache-Control.
|
||||
Header set Cache-Control "public, max-age=31536000"
|
||||
|
||||
# requires mod_deflate
|
||||
AddOutputFilterByType DEFLATE application/x-javascript text/css
|
||||
# IE 5 and 6 are the only ones we really care about
|
||||
BrowserMatch \bMSIE\s[56] no-gzip
|
||||
# but not if it's got the SV1 patch or is really Opera
|
||||
BrowserMatch \b(SV1|Opera)\b !no-gzip
|
374
min_extras/ab_tests/mod_deflate/before.js
Normal file
374
min_extras/ab_tests/mod_deflate/before.js
Normal file
@@ -0,0 +1,374 @@
|
||||
(function(){
|
||||
/*
|
||||
* jQuery 1.2.3 - New Wave Javascript
|
||||
*
|
||||
* Copyright (c) 2008 John Resig (jquery.com)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
|
||||
* $Rev: 4663 $
|
||||
*/
|
||||
if(window.jQuery)
|
||||
var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)
|
||||
var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])
|
||||
selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem)
|
||||
if(elem.id!=match[3])
|
||||
return jQuery().find(selector);else{this[0]=elem;this.length=1;return this;}
|
||||
else
|
||||
selector=[];}}else
|
||||
return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))
|
||||
return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.3",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;this.each(function(i){if(this==elem)
|
||||
ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)
|
||||
if(value==undefined)
|
||||
return this.length&&jQuery[type||"attr"](this[0],name)||undefined;else{options={};options[name]=value;}
|
||||
return this.each(function(i){for(name in options)
|
||||
jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)
|
||||
value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)
|
||||
return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)
|
||||
ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])
|
||||
jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)
|
||||
elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)
|
||||
this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)
|
||||
this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
|
||||
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)
|
||||
this[expando]=null;});if(events===true)
|
||||
this.find("*").andSelf().each(function(i){if(this.nodeType==3)
|
||||
return;var events=jQuery.data(this,"events");for(var type in events)
|
||||
for(var handler in events[type])
|
||||
jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)
|
||||
if(isSimple.test(selector))
|
||||
return this.pushStack(jQuery.multiFilter(selector,this,true));else
|
||||
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)
|
||||
return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)
|
||||
return value;values.push(value);}}
|
||||
return values;}else
|
||||
return(this[0].value||"").replace(/\r/g,"");}
|
||||
return undefined;}
|
||||
return this.each(function(){if(this.nodeType!=1)
|
||||
return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))
|
||||
this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=value.constructor==Array?value:[value];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)
|
||||
this.selectedIndex=-1;}else
|
||||
this.value=value;});},html:function(value){return value==undefined?(this.length?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value==null){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data==undefined&&this.length)
|
||||
data=jQuery.data(this[0],key);return data==null&&parts[1]?this.data(parts[0]):data;}else
|
||||
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)
|
||||
elems.reverse();}
|
||||
var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))
|
||||
obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script")){scripts=scripts.add(elem);}else{if(elem.nodeType==1)
|
||||
scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.prototype.init.prototype=jQuery.prototype;function evalScript(i,elem){if(elem.src)
|
||||
jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
|
||||
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)
|
||||
elem.parentNode.removeChild(elem);}
|
||||
jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}
|
||||
if(typeof target!="object"&&typeof target!="function")
|
||||
target={};if(length==1){target=this;i=0;}
|
||||
for(;i<length;i++)
|
||||
if((options=arguments[i])!=null)
|
||||
for(var name in options){if(target===options[name])
|
||||
continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)
|
||||
target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)
|
||||
target[name]=options[name];}
|
||||
return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)
|
||||
window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)
|
||||
script.text=data;else
|
||||
script.appendChild(document.createTextNode(data));head.appendChild(script);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)
|
||||
id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])
|
||||
jQuery.cache[id]={};if(data!=undefined)
|
||||
jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])
|
||||
break;if(!name)
|
||||
jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)
|
||||
elem.removeAttribute(expando);}
|
||||
delete jQuery.cache[id];}},each:function(object,callback,args){if(args){if(object.length==undefined){for(var name in object)
|
||||
if(callback.apply(object[name],args)===false)
|
||||
break;}else
|
||||
for(var i=0,length=object.length;i<length;i++)
|
||||
if(callback.apply(object[i],args)===false)
|
||||
break;}else{if(object.length==undefined){for(var name in object)
|
||||
if(callback.call(object[name],name,object[name])===false)
|
||||
break;}else
|
||||
for(var i=0,length=object.length,value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}
|
||||
return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))
|
||||
value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))
|
||||
elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)
|
||||
elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}
|
||||
callback.call(elem);for(var name in options)
|
||||
elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}
|
||||
if(jQuery(elem).is(":visible"))
|
||||
getWH();else
|
||||
jQuery.swap(elem,props,getWH);return Math.max(0,val);}
|
||||
return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret;function color(elem){if(!jQuery.browser.safari)
|
||||
return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}
|
||||
if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}
|
||||
if(jQuery.browser.opera&&name=="display"){var save=elem.style.outline;elem.style.outline="0 solid black";elem.style.outline=save;}
|
||||
if(name.match(/float/i))
|
||||
name=styleFloat;if(!force&&elem.style&&elem.style[name])
|
||||
ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))
|
||||
name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))
|
||||
ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)
|
||||
stack.unshift(a);for(var i=0;i<stack.length;i++)
|
||||
if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}
|
||||
ret=name=="display"&&swap[stack.length-1]!=null?"none":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var i=0;i<swap.length;i++)
|
||||
if(swap[i]!=null)
|
||||
stack[i].style.display=swap[i];}
|
||||
if(name=="opacity"&&ret=="")
|
||||
ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}
|
||||
return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')
|
||||
context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)
|
||||
return;if(elem.constructor==Number)
|
||||
elem=elem.toString();if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)
|
||||
div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)
|
||||
if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)
|
||||
tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))
|
||||
div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}
|
||||
elem=jQuery.makeArray(div.childNodes);}
|
||||
if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))
|
||||
return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)
|
||||
ret.push(elem);else
|
||||
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)
|
||||
return undefined;var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)
|
||||
elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)
|
||||
elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")
|
||||
return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))
|
||||
return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)
|
||||
throw"type property can't be changed";elem.setAttribute(name,""+value);}
|
||||
if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))
|
||||
return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+
|
||||
(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}
|
||||
return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}
|
||||
name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)
|
||||
elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")
|
||||
for(var i=0,length=array.length;i<length;i++)
|
||||
ret.push(array[i]);else
|
||||
ret=array.slice(0);return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)
|
||||
if(array[i]==elem)
|
||||
return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)
|
||||
if(second[i].nodeType!=8)
|
||||
first.push(second[i]);}else
|
||||
for(var i=0;second[i];i++)
|
||||
first.push(second[i]);return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}
|
||||
return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)
|
||||
if(!inv&&callback(elems[i],i)||inv&&!callback(elems[i],i))
|
||||
ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!==null&&value!=undefined){if(value.constructor!=Array)
|
||||
value=[value];ret=ret.concat(value);}}
|
||||
return ret;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")
|
||||
ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)
|
||||
jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)
|
||||
this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)
|
||||
this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)
|
||||
this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}
|
||||
return cur;},find:function(t,context){if(typeof t!="string")
|
||||
return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)
|
||||
return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)
|
||||
for(var c=ret[i].firstChild;c;c=c.nextSibling)
|
||||
if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))
|
||||
r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)
|
||||
if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}
|
||||
if(m=="+")break;}}
|
||||
ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}
|
||||
if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}
|
||||
m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])
|
||||
oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")
|
||||
tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}
|
||||
if(m[1]==".")
|
||||
r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)
|
||||
if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}
|
||||
r=tmp;}
|
||||
ret=r;}
|
||||
t=t.replace(re2,"");}}
|
||||
if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}
|
||||
if(t)
|
||||
ret=[];if(ret&&context==ret[0])
|
||||
ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)
|
||||
tmp.push(r[i]);}
|
||||
return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}
|
||||
if(!m)
|
||||
break;if(m[1]==":"&&m[2]=="not")
|
||||
r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")
|
||||
r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))
|
||||
z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)
|
||||
tmp.push(a);}
|
||||
r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)
|
||||
if(n.nodeType==1)
|
||||
n.nodeIndex=c++;merge[id]=true;}
|
||||
var add=false;if(first==0){if(node.nodeIndex==last)
|
||||
add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)
|
||||
add=true;if(add^not)
|
||||
tmp.push(node);}
|
||||
r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")
|
||||
fn=fn[m[2]];if(typeof fn=="string")
|
||||
fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}
|
||||
return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)
|
||||
matched.push(cur);cur=cur[dir];}
|
||||
return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])
|
||||
if(cur.nodeType==1&&++num==result)
|
||||
break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))
|
||||
r.push(n);}
|
||||
return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)
|
||||
return;if(jQuery.browser.msie&&elem.setInterval!=undefined)
|
||||
elem=window;if(!handler.guid)
|
||||
handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}
|
||||
var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)
|
||||
return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)
|
||||
elem.addEventListener(type,handle,false);else if(elem.attachEvent)
|
||||
elem.attachEvent("on"+type,handle);}}
|
||||
handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)
|
||||
return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))
|
||||
for(var type in events)
|
||||
this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}
|
||||
jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)
|
||||
delete events[type][handler.guid];else
|
||||
for(handler in events[type])
|
||||
if(!parts[1]||events[type][handler].type==parts[1])
|
||||
delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)
|
||||
elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)
|
||||
elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}
|
||||
ret=null;delete events[type];}}});}
|
||||
for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data||[]);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}
|
||||
if(!elem){if(this.global[type])
|
||||
jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)
|
||||
return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event)
|
||||
data.unshift(this.fix({type:type,target:elem}));data[0].type=type;if(exclusive)
|
||||
data[0].exclusive=true;if(jQuery.isFunction(jQuery.data(elem,"handle")))
|
||||
val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)
|
||||
val=false;if(event)
|
||||
data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)
|
||||
val=ret;}
|
||||
if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}
|
||||
this.triggered=false;}
|
||||
return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]&&!event.exclusive||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)
|
||||
val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}
|
||||
if(jQuery.browser.msie)
|
||||
event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)
|
||||
originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)
|
||||
originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)
|
||||
event.target=event.srcElement||document;if(event.target.nodeType==3)
|
||||
event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)
|
||||
event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}
|
||||
if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))
|
||||
event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)
|
||||
event.metaKey=event.ctrlKey;if(!event.which&&event.button)
|
||||
event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])
|
||||
return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;event.preventDefault();return args[this.lastToggle].apply(this,arguments)||false;});},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)
|
||||
fn.call(document,jQuery);else
|
||||
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}
|
||||
jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)
|
||||
document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();})();if(jQuery.browser.opera)
|
||||
document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)
|
||||
if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}
|
||||
if(numStyles===undefined)
|
||||
numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();})();}
|
||||
jQuery.event.add(window,"load",jQuery.ready);}
|
||||
jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}
|
||||
return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))
|
||||
return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}
|
||||
callback=callback||function(){};var type="GET";if(params)
|
||||
if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}
|
||||
var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")
|
||||
self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}
|
||||
return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}
|
||||
return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")
|
||||
s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))
|
||||
s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))
|
||||
s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}
|
||||
if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)
|
||||
s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}
|
||||
if(head)
|
||||
head.removeChild(script);};}
|
||||
if(s.dataType=="script"&&s.cache==null)
|
||||
s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}
|
||||
if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}
|
||||
if(s.global&&!jQuery.active++)
|
||||
jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&s.dataType=="script"&&s.type.toLowerCase()=="get"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)
|
||||
script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}
|
||||
head.appendChild(script);return undefined;}
|
||||
var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)
|
||||
xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)
|
||||
xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}
|
||||
if(s.beforeSend)
|
||||
s.beforeSend(xml);if(s.global)
|
||||
jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}
|
||||
status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}
|
||||
if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}
|
||||
if(s.ifModified&&modRes)
|
||||
jQuery.lastModified[s.url]=modRes;if(!jsonp)
|
||||
success();}else
|
||||
jQuery.handleError(s,xml,status);complete();if(s.async)
|
||||
xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)
|
||||
setTimeout(function(){if(xml){xml.abort();if(!requestDone)
|
||||
onreadystatechange("timeout");}},s.timeout);}
|
||||
try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}
|
||||
if(!s.async)
|
||||
onreadystatechange();function success(){if(s.success)
|
||||
s.success(data,status);if(s.global)
|
||||
jQuery.event.trigger("ajaxSuccess",[xml,s]);}
|
||||
function complete(){if(s.complete)
|
||||
s.complete(xml,status);if(s.global)
|
||||
jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)
|
||||
jQuery.event.trigger("ajaxStop");}
|
||||
return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)
|
||||
jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}
|
||||
return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}
|
||||
return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")
|
||||
throw"parsererror";if(type=="script")
|
||||
jQuery.globalEval(data);if(type=="json")
|
||||
data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)
|
||||
jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
|
||||
for(var j in a)
|
||||
if(a[j]&&a[j].constructor==Array)
|
||||
jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
|
||||
s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")
|
||||
this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)
|
||||
return false;var opt=jQuery.extend({},optall);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)
|
||||
return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}
|
||||
if(opt.overflow!=null)
|
||||
this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))
|
||||
e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}
|
||||
if(parts[1])
|
||||
end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
|
||||
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}
|
||||
if(!type||(typeof type=="string"&&!fn))
|
||||
return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)
|
||||
queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)
|
||||
fn.apply(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)
|
||||
this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)
|
||||
if(timers[i].elem==this){if(gotoEnd)
|
||||
timers[i](true);timers.splice(i,1);}});if(!gotoEnd)
|
||||
this.dequeue();return this;}});var queue=function(elem,type,array){if(!elem)
|
||||
return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)
|
||||
q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)
|
||||
q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)
|
||||
jQuery(this).dequeue();if(jQuery.isFunction(opt.old))
|
||||
opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)
|
||||
options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)
|
||||
this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")
|
||||
this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)
|
||||
return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}
|
||||
t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)
|
||||
if(!timers[i]())
|
||||
timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")
|
||||
this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=(new Date()).getTime();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)
|
||||
if(this.options.curAnim[i]!==true)
|
||||
done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")
|
||||
this.elem.style.display="block";}
|
||||
if(this.options.hide)
|
||||
this.elem.style.display="none";if(this.options.hide||this.options.show)
|
||||
for(var p in this.options.curAnim)
|
||||
jQuery.attr(this.elem.style,p,this.options.orig[p]);}
|
||||
if(done&&jQuery.isFunction(this.options.complete))
|
||||
this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}
|
||||
return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),fixed=jQuery.css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)
|
||||
border(offsetParent);if(!fixed&&jQuery.css(offsetParent,"position")=="fixed")
|
||||
fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}
|
||||
while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(jQuery.css(parent,"display")))
|
||||
add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")
|
||||
border(parent);parent=parent.parentNode;}
|
||||
if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.css(offsetChild,"position")!="absolute"))
|
||||
add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)
|
||||
add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}
|
||||
results={top:top,left:left};}
|
||||
function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}
|
||||
function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}
|
||||
return results;};})();
|
28
min_extras/ab_tests/results_summary.txt
Normal file
28
min_extras/ab_tests/results_summary.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/ideal_php/before.php
|
||||
Document Length: 15993 bytes
|
||||
Requests per second: 429.53 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/v1.0/minify.php?files=before.js
|
||||
Document Length: 54159 bytes
|
||||
Requests per second: 299.07 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/minify/test_Files.php
|
||||
Document Length: 15993 bytes
|
||||
Requests per second: 243.81 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/minify/test_Groups.php/test
|
||||
Document Length: 15993 bytes
|
||||
Requests per second: 225.35 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/minify/test_Version1.php?files=before.js
|
||||
Document Length: 15993 bytes
|
||||
Requests per second: 234.43 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/mod_deflate/before.js
|
||||
Document Length: 16053 bytes
|
||||
Requests per second: 189.07 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
||||
Document Path: /_3rd_party/minify/web/ab_tests/type-map/before.js.var
|
||||
Document Length: 15993 bytes
|
||||
Requests per second: 503.94 [#/sec] (mean)
|
||||
--------------------------------------------------------------------------------
|
43
min_extras/ab_tests/test_all.bat
Normal file
43
min_extras/ab_tests/test_all.bat
Normal file
@@ -0,0 +1,43 @@
|
||||
@SET PATH=%PATH%;C:\xampp\apache\bin
|
||||
|
||||
::SET ABCALL=ab -d -S -c 100 -n 2000 -H "Accept-Encoding: deflate, gzip" http://localhost
|
||||
@SET ABCALL=ab -d -S -c 100 -n 2000 -H "Accept-Encoding: deflate, gzip" http://mc.dev/_3rd_party
|
||||
|
||||
::SET TXTVIEWER=notepad.exe
|
||||
@SET TXTVIEWER="C:\Program Files\Notepad++\notepad++.exe"
|
||||
|
||||
@SET DELIM=TYPE _delimiter
|
||||
|
||||
DEL results.txt
|
||||
|
||||
:: baseline PHP
|
||||
%ABCALL%/minify/web/ab_tests/ideal_php/before.php >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: 1.0 release
|
||||
%ABCALL%/minify/web/ab_tests/v1.0/minify.php?files=before.js >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: Files controller
|
||||
%ABCALL%/minify/web/ab_tests/minify/test_Files.php >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: Groups controller
|
||||
%ABCALL%/minify/web/ab_tests/minify/test_Groups.php/test >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: Version1 controller
|
||||
%ABCALL%/minify/web/ab_tests/minify/test_Version1.php?files=before.js >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: mod_deflate
|
||||
%ABCALL%/minify/web/ab_tests/mod_deflate/before.js >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
:: type-map
|
||||
%ABCALL%/minify/web/ab_tests/type-map/before.js.var >> results.txt
|
||||
@%DELIM% >> results.txt
|
||||
|
||||
FINDSTR "Path: Length: Requests --" results.txt > results_summary.txt
|
||||
|
||||
START %TXTVIEWER% results_summary.txt
|
40
min_extras/ab_tests/type-map/.htaccess-dev
Normal file
40
min_extras/ab_tests/type-map/.htaccess-dev
Normal file
@@ -0,0 +1,40 @@
|
||||
# turn off MultiViews if enabled
|
||||
Options -MultiViews
|
||||
|
||||
# For *.var requests, negotiate using type-map
|
||||
AddHandler type-map .var
|
||||
|
||||
# use custom extensions so existing handlers for .gz/.Z don't interfere
|
||||
AddEncoding x-gzip .zg
|
||||
AddEncoding x-compress .zc
|
||||
AddEncoding deflate .zd
|
||||
|
||||
# Necessary to add charset while using type-map
|
||||
AddType application/x-javascript;charset=utf-8 js
|
||||
AddType text/css;charset=utf-8 css
|
||||
|
||||
# Below we remove the ETag header and set a far-off Expires
|
||||
# header. Since clients will aggressively cache, make sure
|
||||
# to modify the URL (querystring or via mod_rewrite) when
|
||||
# the resource changes
|
||||
|
||||
# remove ETag
|
||||
FileETag None
|
||||
|
||||
# requires mod_expires
|
||||
ExpiresActive On
|
||||
# sets Expires and Cache-Control: max-age, but not "public"
|
||||
ExpiresDefault "access plus 1 year"
|
||||
|
||||
# requires mod_headers
|
||||
# adds the "public" to Cache-Control.
|
||||
Header set Cache-Control "public, max-age=31536000"
|
||||
|
||||
# requires mod_rewrite
|
||||
RewriteEngine On
|
||||
RewriteBase /_3rd_party/minify/web/test/statics
|
||||
# IE 5 and 6 are the only ones we really care about
|
||||
RewriteCond %{HTTP_USER_AGENT} MSIE\ [56]
|
||||
# but not if it's got the SV1 patch or is really Opera
|
||||
RewriteCond %{HTTP_USER_AGENT} !(\ SV1|Opera)
|
||||
RewriteRule ^(.*)\.var$ $1 [L]
|
374
min_extras/ab_tests/type-map/before.js
Normal file
374
min_extras/ab_tests/type-map/before.js
Normal file
@@ -0,0 +1,374 @@
|
||||
(function(){
|
||||
/*
|
||||
* jQuery 1.2.3 - New Wave Javascript
|
||||
*
|
||||
* Copyright (c) 2008 John Resig (jquery.com)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
|
||||
* $Rev: 4663 $
|
||||
*/
|
||||
if(window.jQuery)
|
||||
var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)
|
||||
var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])
|
||||
selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem)
|
||||
if(elem.id!=match[3])
|
||||
return jQuery().find(selector);else{this[0]=elem;this.length=1;return this;}
|
||||
else
|
||||
selector=[];}}else
|
||||
return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))
|
||||
return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.3",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;this.each(function(i){if(this==elem)
|
||||
ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)
|
||||
if(value==undefined)
|
||||
return this.length&&jQuery[type||"attr"](this[0],name)||undefined;else{options={};options[name]=value;}
|
||||
return this.each(function(i){for(name in options)
|
||||
jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)
|
||||
value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)
|
||||
return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)
|
||||
ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])
|
||||
jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)
|
||||
elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)
|
||||
this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)
|
||||
this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
|
||||
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)
|
||||
this[expando]=null;});if(events===true)
|
||||
this.find("*").andSelf().each(function(i){if(this.nodeType==3)
|
||||
return;var events=jQuery.data(this,"events");for(var type in events)
|
||||
for(var handler in events[type])
|
||||
jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)
|
||||
if(isSimple.test(selector))
|
||||
return this.pushStack(jQuery.multiFilter(selector,this,true));else
|
||||
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)
|
||||
return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)
|
||||
return value;values.push(value);}}
|
||||
return values;}else
|
||||
return(this[0].value||"").replace(/\r/g,"");}
|
||||
return undefined;}
|
||||
return this.each(function(){if(this.nodeType!=1)
|
||||
return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))
|
||||
this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=value.constructor==Array?value:[value];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)
|
||||
this.selectedIndex=-1;}else
|
||||
this.value=value;});},html:function(value){return value==undefined?(this.length?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value==null){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data==undefined&&this.length)
|
||||
data=jQuery.data(this[0],key);return data==null&&parts[1]?this.data(parts[0]):data;}else
|
||||
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)
|
||||
elems.reverse();}
|
||||
var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))
|
||||
obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script")){scripts=scripts.add(elem);}else{if(elem.nodeType==1)
|
||||
scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.prototype.init.prototype=jQuery.prototype;function evalScript(i,elem){if(elem.src)
|
||||
jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
|
||||
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)
|
||||
elem.parentNode.removeChild(elem);}
|
||||
jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}
|
||||
if(typeof target!="object"&&typeof target!="function")
|
||||
target={};if(length==1){target=this;i=0;}
|
||||
for(;i<length;i++)
|
||||
if((options=arguments[i])!=null)
|
||||
for(var name in options){if(target===options[name])
|
||||
continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)
|
||||
target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)
|
||||
target[name]=options[name];}
|
||||
return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)
|
||||
window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)
|
||||
script.text=data;else
|
||||
script.appendChild(document.createTextNode(data));head.appendChild(script);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)
|
||||
id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])
|
||||
jQuery.cache[id]={};if(data!=undefined)
|
||||
jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])
|
||||
break;if(!name)
|
||||
jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)
|
||||
elem.removeAttribute(expando);}
|
||||
delete jQuery.cache[id];}},each:function(object,callback,args){if(args){if(object.length==undefined){for(var name in object)
|
||||
if(callback.apply(object[name],args)===false)
|
||||
break;}else
|
||||
for(var i=0,length=object.length;i<length;i++)
|
||||
if(callback.apply(object[i],args)===false)
|
||||
break;}else{if(object.length==undefined){for(var name in object)
|
||||
if(callback.call(object[name],name,object[name])===false)
|
||||
break;}else
|
||||
for(var i=0,length=object.length,value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}
|
||||
return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))
|
||||
value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))
|
||||
elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)
|
||||
elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}
|
||||
callback.call(elem);for(var name in options)
|
||||
elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}
|
||||
if(jQuery(elem).is(":visible"))
|
||||
getWH();else
|
||||
jQuery.swap(elem,props,getWH);return Math.max(0,val);}
|
||||
return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret;function color(elem){if(!jQuery.browser.safari)
|
||||
return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}
|
||||
if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}
|
||||
if(jQuery.browser.opera&&name=="display"){var save=elem.style.outline;elem.style.outline="0 solid black";elem.style.outline=save;}
|
||||
if(name.match(/float/i))
|
||||
name=styleFloat;if(!force&&elem.style&&elem.style[name])
|
||||
ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))
|
||||
name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))
|
||||
ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)
|
||||
stack.unshift(a);for(var i=0;i<stack.length;i++)
|
||||
if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}
|
||||
ret=name=="display"&&swap[stack.length-1]!=null?"none":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var i=0;i<swap.length;i++)
|
||||
if(swap[i]!=null)
|
||||
stack[i].style.display=swap[i];}
|
||||
if(name=="opacity"&&ret=="")
|
||||
ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}
|
||||
return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')
|
||||
context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)
|
||||
return;if(elem.constructor==Number)
|
||||
elem=elem.toString();if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)
|
||||
div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)
|
||||
if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)
|
||||
tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))
|
||||
div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}
|
||||
elem=jQuery.makeArray(div.childNodes);}
|
||||
if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))
|
||||
return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)
|
||||
ret.push(elem);else
|
||||
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)
|
||||
return undefined;var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)
|
||||
elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)
|
||||
elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")
|
||||
return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))
|
||||
return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)
|
||||
throw"type property can't be changed";elem.setAttribute(name,""+value);}
|
||||
if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))
|
||||
return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+
|
||||
(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}
|
||||
return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}
|
||||
name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)
|
||||
elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")
|
||||
for(var i=0,length=array.length;i<length;i++)
|
||||
ret.push(array[i]);else
|
||||
ret=array.slice(0);return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)
|
||||
if(array[i]==elem)
|
||||
return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)
|
||||
if(second[i].nodeType!=8)
|
||||
first.push(second[i]);}else
|
||||
for(var i=0;second[i];i++)
|
||||
first.push(second[i]);return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}
|
||||
return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)
|
||||
if(!inv&&callback(elems[i],i)||inv&&!callback(elems[i],i))
|
||||
ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!==null&&value!=undefined){if(value.constructor!=Array)
|
||||
value=[value];ret=ret.concat(value);}}
|
||||
return ret;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")
|
||||
ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)
|
||||
jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)
|
||||
this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)
|
||||
this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)
|
||||
this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}
|
||||
return cur;},find:function(t,context){if(typeof t!="string")
|
||||
return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)
|
||||
return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)
|
||||
for(var c=ret[i].firstChild;c;c=c.nextSibling)
|
||||
if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))
|
||||
r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)
|
||||
if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}
|
||||
if(m=="+")break;}}
|
||||
ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}
|
||||
if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}
|
||||
m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])
|
||||
oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")
|
||||
tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}
|
||||
if(m[1]==".")
|
||||
r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)
|
||||
if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}
|
||||
r=tmp;}
|
||||
ret=r;}
|
||||
t=t.replace(re2,"");}}
|
||||
if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}
|
||||
if(t)
|
||||
ret=[];if(ret&&context==ret[0])
|
||||
ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)
|
||||
tmp.push(r[i]);}
|
||||
return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}
|
||||
if(!m)
|
||||
break;if(m[1]==":"&&m[2]=="not")
|
||||
r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")
|
||||
r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))
|
||||
z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)
|
||||
tmp.push(a);}
|
||||
r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)
|
||||
if(n.nodeType==1)
|
||||
n.nodeIndex=c++;merge[id]=true;}
|
||||
var add=false;if(first==0){if(node.nodeIndex==last)
|
||||
add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)
|
||||
add=true;if(add^not)
|
||||
tmp.push(node);}
|
||||
r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")
|
||||
fn=fn[m[2]];if(typeof fn=="string")
|
||||
fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}
|
||||
return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)
|
||||
matched.push(cur);cur=cur[dir];}
|
||||
return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])
|
||||
if(cur.nodeType==1&&++num==result)
|
||||
break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))
|
||||
r.push(n);}
|
||||
return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)
|
||||
return;if(jQuery.browser.msie&&elem.setInterval!=undefined)
|
||||
elem=window;if(!handler.guid)
|
||||
handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}
|
||||
var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)
|
||||
return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)
|
||||
elem.addEventListener(type,handle,false);else if(elem.attachEvent)
|
||||
elem.attachEvent("on"+type,handle);}}
|
||||
handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)
|
||||
return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))
|
||||
for(var type in events)
|
||||
this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}
|
||||
jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)
|
||||
delete events[type][handler.guid];else
|
||||
for(handler in events[type])
|
||||
if(!parts[1]||events[type][handler].type==parts[1])
|
||||
delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)
|
||||
elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)
|
||||
elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}
|
||||
ret=null;delete events[type];}}});}
|
||||
for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data||[]);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}
|
||||
if(!elem){if(this.global[type])
|
||||
jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)
|
||||
return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event)
|
||||
data.unshift(this.fix({type:type,target:elem}));data[0].type=type;if(exclusive)
|
||||
data[0].exclusive=true;if(jQuery.isFunction(jQuery.data(elem,"handle")))
|
||||
val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)
|
||||
val=false;if(event)
|
||||
data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)
|
||||
val=ret;}
|
||||
if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}
|
||||
this.triggered=false;}
|
||||
return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]&&!event.exclusive||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)
|
||||
val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}
|
||||
if(jQuery.browser.msie)
|
||||
event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)
|
||||
originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)
|
||||
originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)
|
||||
event.target=event.srcElement||document;if(event.target.nodeType==3)
|
||||
event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)
|
||||
event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}
|
||||
if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))
|
||||
event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)
|
||||
event.metaKey=event.ctrlKey;if(!event.which&&event.button)
|
||||
event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])
|
||||
return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;event.preventDefault();return args[this.lastToggle].apply(this,arguments)||false;});},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)
|
||||
fn.call(document,jQuery);else
|
||||
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}
|
||||
jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)
|
||||
document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();})();if(jQuery.browser.opera)
|
||||
document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)
|
||||
if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}
|
||||
if(numStyles===undefined)
|
||||
numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}
|
||||
jQuery.ready();})();}
|
||||
jQuery.event.add(window,"load",jQuery.ready);}
|
||||
jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}
|
||||
return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))
|
||||
return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}
|
||||
callback=callback||function(){};var type="GET";if(params)
|
||||
if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}
|
||||
var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")
|
||||
self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}
|
||||
return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}
|
||||
return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")
|
||||
s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))
|
||||
s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))
|
||||
s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}
|
||||
if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)
|
||||
s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}
|
||||
if(head)
|
||||
head.removeChild(script);};}
|
||||
if(s.dataType=="script"&&s.cache==null)
|
||||
s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}
|
||||
if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}
|
||||
if(s.global&&!jQuery.active++)
|
||||
jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&s.dataType=="script"&&s.type.toLowerCase()=="get"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)
|
||||
script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}
|
||||
head.appendChild(script);return undefined;}
|
||||
var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)
|
||||
xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)
|
||||
xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}
|
||||
if(s.beforeSend)
|
||||
s.beforeSend(xml);if(s.global)
|
||||
jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}
|
||||
status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}
|
||||
if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}
|
||||
if(s.ifModified&&modRes)
|
||||
jQuery.lastModified[s.url]=modRes;if(!jsonp)
|
||||
success();}else
|
||||
jQuery.handleError(s,xml,status);complete();if(s.async)
|
||||
xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)
|
||||
setTimeout(function(){if(xml){xml.abort();if(!requestDone)
|
||||
onreadystatechange("timeout");}},s.timeout);}
|
||||
try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}
|
||||
if(!s.async)
|
||||
onreadystatechange();function success(){if(s.success)
|
||||
s.success(data,status);if(s.global)
|
||||
jQuery.event.trigger("ajaxSuccess",[xml,s]);}
|
||||
function complete(){if(s.complete)
|
||||
s.complete(xml,status);if(s.global)
|
||||
jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)
|
||||
jQuery.event.trigger("ajaxStop");}
|
||||
return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)
|
||||
jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}
|
||||
return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}
|
||||
return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")
|
||||
throw"parsererror";if(type=="script")
|
||||
jQuery.globalEval(data);if(type=="json")
|
||||
data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)
|
||||
jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
|
||||
for(var j in a)
|
||||
if(a[j]&&a[j].constructor==Array)
|
||||
jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
|
||||
s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")
|
||||
this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)
|
||||
return false;var opt=jQuery.extend({},optall);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)
|
||||
return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}
|
||||
if(opt.overflow!=null)
|
||||
this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))
|
||||
e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}
|
||||
if(parts[1])
|
||||
end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
|
||||
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}
|
||||
if(!type||(typeof type=="string"&&!fn))
|
||||
return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)
|
||||
queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)
|
||||
fn.apply(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)
|
||||
this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)
|
||||
if(timers[i].elem==this){if(gotoEnd)
|
||||
timers[i](true);timers.splice(i,1);}});if(!gotoEnd)
|
||||
this.dequeue();return this;}});var queue=function(elem,type,array){if(!elem)
|
||||
return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)
|
||||
q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)
|
||||
q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)
|
||||
jQuery(this).dequeue();if(jQuery.isFunction(opt.old))
|
||||
opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)
|
||||
options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)
|
||||
this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")
|
||||
this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)
|
||||
return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}
|
||||
t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)
|
||||
if(!timers[i]())
|
||||
timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")
|
||||
this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=(new Date()).getTime();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)
|
||||
if(this.options.curAnim[i]!==true)
|
||||
done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")
|
||||
this.elem.style.display="block";}
|
||||
if(this.options.hide)
|
||||
this.elem.style.display="none";if(this.options.hide||this.options.show)
|
||||
for(var p in this.options.curAnim)
|
||||
jQuery.attr(this.elem.style,p,this.options.orig[p]);}
|
||||
if(done&&jQuery.isFunction(this.options.complete))
|
||||
this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}
|
||||
return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),fixed=jQuery.css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)
|
||||
border(offsetParent);if(!fixed&&jQuery.css(offsetParent,"position")=="fixed")
|
||||
fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}
|
||||
while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(jQuery.css(parent,"display")))
|
||||
add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")
|
||||
border(parent);parent=parent.parentNode;}
|
||||
if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.css(offsetChild,"position")!="absolute"))
|
||||
add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)
|
||||
add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}
|
||||
results={top:top,left:left};}
|
||||
function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}
|
||||
function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}
|
||||
return results;};})();
|
14
min_extras/ab_tests/type-map/before.js.var
Normal file
14
min_extras/ab_tests/type-map/before.js.var
Normal file
@@ -0,0 +1,14 @@
|
||||
URI: before.js.zd
|
||||
Content-Type: application/x-javascript; qs=0.9
|
||||
Content-Encoding: deflate
|
||||
|
||||
URI: before.js.zg
|
||||
Content-Type: application/x-javascript; qs=0.8
|
||||
Content-Encoding: x-gzip
|
||||
|
||||
URI: before.js.zc
|
||||
Content-Type: application/x-javascript; qs=0.7
|
||||
Content-Encoding: x-compress
|
||||
|
||||
URI: before.js
|
||||
Content-Type: application/x-javascript; qs=0.6
|
BIN
min_extras/ab_tests/type-map/before.js.zc
Normal file
BIN
min_extras/ab_tests/type-map/before.js.zc
Normal file
Binary file not shown.
BIN
min_extras/ab_tests/type-map/before.js.zd
Normal file
BIN
min_extras/ab_tests/type-map/before.js.zd
Normal file
Binary file not shown.
BIN
min_extras/ab_tests/type-map/before.js.zg
Normal file
BIN
min_extras/ab_tests/type-map/before.js.zg
Normal file
Binary file not shown.
500
min_extras/ab_tests/v1.0/minify.php
Normal file
500
min_extras/ab_tests/v1.0/minify.php
Normal file
@@ -0,0 +1,500 @@
|
||||
<?php
|
||||
// ab test of Minify 1.0, mostly to see how fast it can serve server-cached files.
|
||||
|
||||
require '../../config.php';
|
||||
|
||||
define('MINIFY_BASE_DIR', realpath(
|
||||
dirname(__FILE__) . '/../minify'
|
||||
));
|
||||
define('MINIFY_CACHE_DIR', $minifyCachePath);
|
||||
|
||||
/**
|
||||
* Minify - Combines, minifies, and caches JavaScript and CSS files on demand.
|
||||
*
|
||||
* See http://code.google.com/p/minify/ for usage instructions.
|
||||
*
|
||||
* This library was inspired by jscsscomp by Maxim Martynyuk <flashkot@mail.ru>
|
||||
* and by the article "Supercharged JavaScript" by Patrick Hunlock
|
||||
* <wb@hunlock.com>.
|
||||
*
|
||||
* JSMin was originally written by Douglas Crockford <douglas@crockford.com>.
|
||||
*
|
||||
* Requires PHP 5.2.1+.
|
||||
*
|
||||
* @package Minify
|
||||
* @author Ryan Grove <ryan@wonko.com>
|
||||
* @copyright 2007 Ryan Grove. All rights reserved.
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version 1.1.0 (?)
|
||||
* @link http://code.google.com/p/minify/
|
||||
*/
|
||||
|
||||
if (!defined('MINIFY_BASE_DIR')) {
|
||||
/**
|
||||
* Base path from which all relative file paths should be resolved. By default
|
||||
* this is set to the document root.
|
||||
*/
|
||||
define('MINIFY_BASE_DIR', realpath($_SERVER['DOCUMENT_ROOT']));
|
||||
}
|
||||
|
||||
if (!defined('MINIFY_CACHE_DIR')) {
|
||||
/** Directory where compressed files will be cached. */
|
||||
define('MINIFY_CACHE_DIR', sys_get_temp_dir());
|
||||
}
|
||||
|
||||
if (!defined('MINIFY_ENCODING')) {
|
||||
/** Character set to use when outputting the minified files. */
|
||||
define('MINIFY_ENCODING', 'utf-8');
|
||||
}
|
||||
|
||||
if (!defined('MINIFY_MAX_FILES')) {
|
||||
/** Maximum number of files to combine in one request. */
|
||||
define('MINIFY_MAX_FILES', 16);
|
||||
}
|
||||
|
||||
if (!defined('MINIFY_REWRITE_CSS_URLS')) {
|
||||
/**
|
||||
* Whether or not Minify should attempt to rewrite relative URLs used in CSS
|
||||
* files so that they continue to point to the correct location after the file
|
||||
* is combined and minified.
|
||||
*
|
||||
* Minify is pretty good at getting this right, but occasionally it can make
|
||||
* mistakes. If you find that URL rewriting results in problems, you should
|
||||
* disable it.
|
||||
*/
|
||||
define('MINIFY_REWRITE_CSS_URLS', true);
|
||||
}
|
||||
|
||||
if (!defined('MINIFY_USE_CACHE')) {
|
||||
/**
|
||||
* Whether or not Minify should use a disk-based cache to increase
|
||||
* performance.
|
||||
*/
|
||||
define('MINIFY_USE_CACHE', true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Minify is a library for combining, minifying, and caching JavaScript and CSS
|
||||
* files on demand before sending them to a web browser.
|
||||
*
|
||||
* @package Minify
|
||||
* @author Ryan Grove <ryan@wonko.com>
|
||||
* @copyright 2007 Ryan Grove. All rights reserved.
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version 1.1.0 (?)
|
||||
* @link http://code.google.com/p/minify/
|
||||
*/
|
||||
class Minify {
|
||||
const TYPE_CSS = 'text/css';
|
||||
const TYPE_HTML = 'text/html';
|
||||
const TYPE_JS = 'text/javascript';
|
||||
|
||||
protected $files = array();
|
||||
protected $type = self::TYPE_JS;
|
||||
|
||||
// -- Public Static Methods --------------------------------------------------
|
||||
|
||||
/**
|
||||
* Combines, minifies, and outputs the requested files.
|
||||
*
|
||||
* Inspects the $_GET array for a 'files' entry containing a comma-separated
|
||||
* list and uses this as the set of files to be combined and minified.
|
||||
*/
|
||||
public static function handleRequest() {
|
||||
// 404 if no files were requested.
|
||||
if (!isset($_GET['files'])) {
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
exit;
|
||||
}
|
||||
|
||||
$files = array_map('trim', explode(',', $_GET['files'], MINIFY_MAX_FILES));
|
||||
|
||||
// 404 if the $files array is empty for some weird reason.
|
||||
if (!count($files)) {
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Determine the content type based on the extension of the first file
|
||||
// requested.
|
||||
if (preg_match('/\.js$/iD', $files[0])) {
|
||||
$type = self::TYPE_JS;
|
||||
} else if (preg_match('/\.css$/iD', $files[0])) {
|
||||
$type = self::TYPE_CSS;
|
||||
} else {
|
||||
$type = self::TYPE_HTML;
|
||||
}
|
||||
|
||||
// Minify and spit out the result.
|
||||
try {
|
||||
$minify = new Minify($type, $files);
|
||||
|
||||
header("Content-Type: $type;charset=".MINIFY_ENCODING);
|
||||
|
||||
$minify->browserCache();
|
||||
echo $minify->combine();
|
||||
exit;
|
||||
}
|
||||
catch (MinifyException $e) {
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
echo htmlentities($e->getMessage());
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Minifies the specified string and returns it.
|
||||
*
|
||||
* @param string $string JavaScript, CSS, or HTML string to minify
|
||||
* @param string $type content type of the string (Minify::TYPE_CSS,
|
||||
* Minify::TYPE_HTML, or Minify::TYPE_JS)
|
||||
* @return string minified string
|
||||
*/
|
||||
public static function min($string, $type = self::TYPE_JS) {
|
||||
switch ($type) {
|
||||
case self::TYPE_CSS:
|
||||
return self::minifyCSS($string);
|
||||
break;
|
||||
|
||||
case self::TYPE_HTML:
|
||||
return self::minifyHTML($string);
|
||||
break;
|
||||
|
||||
case self::TYPE_JS:
|
||||
return self::minifyJS($string);
|
||||
break;
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
// -- Protected Static Methods -----------------------------------------------
|
||||
|
||||
/**
|
||||
* Minifies the specified CSS string and returns it.
|
||||
*
|
||||
* @param string $css CSS string
|
||||
* @return string minified string
|
||||
* @see minify()
|
||||
* @see minifyJS()
|
||||
*/
|
||||
protected static function minifyCSS($css) {
|
||||
// Compress whitespace.
|
||||
$css = preg_replace('/\s+/', ' ', $css);
|
||||
|
||||
// Remove comments.
|
||||
$css = preg_replace('/\/\*.*?\*\//', '', $css);
|
||||
|
||||
return trim($css);
|
||||
}
|
||||
|
||||
protected static function minifyHTML($html) {
|
||||
require_once dirname(__FILE__).'/lib/htmlmin.php';
|
||||
return HTMLMin::minify($html);
|
||||
}
|
||||
|
||||
/**
|
||||
* Minifies the specified JavaScript string and returns it.
|
||||
*
|
||||
* @param string $js JavaScript string
|
||||
* @return string minified string
|
||||
* @see minify()
|
||||
* @see minifyCSS()
|
||||
*/
|
||||
protected static function minifyJS($js) {
|
||||
require_once dirname(__FILE__).'/../../../min/lib/JSMin.php';
|
||||
return JSMin::minify($js);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewrites relative URLs in the specified CSS string to point to the correct
|
||||
* location. URLs are assumed to be relative to the absolute path specified in
|
||||
* the $path parameter.
|
||||
*
|
||||
* @param string $css CSS string
|
||||
* @param string $path absolute path to which URLs are relative (should be a
|
||||
* directory, not a file)
|
||||
* @return string CSS string with rewritten URLs
|
||||
*/
|
||||
protected static function rewriteCSSUrls($css, $path) {
|
||||
/*
|
||||
Parentheses, commas, whitespace chars, single quotes, and double quotes are
|
||||
escaped with a backslash as described in the CSS spec:
|
||||
http://www.w3.org/TR/REC-CSS1#url
|
||||
*/
|
||||
$relativePath = preg_replace('/([\(\),\s\'"])/', '\\\$1',
|
||||
str_replace(MINIFY_BASE_DIR, '', $path));
|
||||
|
||||
|
||||
return preg_replace('/url\(\s*[\'"]?\/?(.+?)[\'"]?\s*\)/i', 'url('.
|
||||
$relativePath.'/$1)', $css);
|
||||
}
|
||||
|
||||
// -- Public Instance Methods ------------------------------------------------
|
||||
|
||||
/**
|
||||
* Instantiates a new Minify object. A filename can be in the form of a
|
||||
* relative path or a URL that resolves to the same site that hosts Minify.
|
||||
*
|
||||
* @param string $type content type of the specified files (either
|
||||
* Minify::TYPE_CSS or Minify::TYPE_JS)
|
||||
* @param array|string $files filename or array of filenames to be minified
|
||||
*/
|
||||
public function __construct($type = self::TYPE_JS, $files = array()) {
|
||||
if ($type !== self::TYPE_JS && $type !== self::TYPE_CSS) {
|
||||
throw new MinifyInvalidArgumentException('Invalid argument ($type): '.
|
||||
$type);
|
||||
}
|
||||
|
||||
$this->type = $type;
|
||||
|
||||
if (count((array) $files)) {
|
||||
$this->addFile($files);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified filename or array of filenames to the list of files to
|
||||
* be minified. A filename can be in the form of a relative path or a URL
|
||||
* that resolves to the same site that hosts Minify.
|
||||
*
|
||||
* @param array|string $files filename or array of filenames
|
||||
* @see getFiles()
|
||||
* @see removeFile()
|
||||
*/
|
||||
public function addFile($files) {
|
||||
$files = @array_map(array($this, 'resolveFilePath'), (array) $files);
|
||||
$this->files = array_unique(array_merge($this->files, $files));
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to serve the combined, minified files from the cache if possible.
|
||||
*
|
||||
* This method first checks the ETag value and If-Modified-Since timestamp
|
||||
* sent by the browser and exits with an HTTP "304 Not Modified" response if
|
||||
* the requested files haven't changed since they were last sent to the
|
||||
* client.
|
||||
*
|
||||
* If the browser hasn't cached the content, we check to see if it's been
|
||||
* cached on the server and, if so, we send the cached content and exit.
|
||||
*
|
||||
* If neither the client nor the server has the content in its cache, we don't
|
||||
* do anything.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function browserCache() {
|
||||
$hash = $this->getHash();
|
||||
$lastModified = $this->getLastModified();
|
||||
|
||||
$lastModifiedGMT = gmdate('D, d M Y H:i:s', $lastModified).' GMT';
|
||||
|
||||
// Check/set the ETag.
|
||||
$etag = $hash.'_'.$lastModified;
|
||||
|
||||
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
|
||||
if (strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) !== false) {
|
||||
header("Last-Modified: $lastModifiedGMT", true, 304);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
header('ETag: "'.$etag.'"');
|
||||
|
||||
// Check If-Modified-Since.
|
||||
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
|
||||
if ($lastModified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
|
||||
header("Last-Modified: $lastModifiedGMT", true, 304);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
header("Last-Modified: $lastModifiedGMT");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines and returns the contents of all files that have been added with
|
||||
* addFile() or via this class's constructor.
|
||||
*
|
||||
* If MINIFY_USE_CACHE is true, the content will be returned from the server's
|
||||
* cache if the cache is up to date; otherwise the new content will be saved
|
||||
* to the cache for future use.
|
||||
*
|
||||
* @param bool $minify minify the combined contents before returning them
|
||||
* @return string combined file contents
|
||||
*/
|
||||
public function combine($minify = true) {
|
||||
// Return contents from server cache if possible.
|
||||
if (MINIFY_USE_CACHE) {
|
||||
if ($cacheResult = $this->serverCache(true)) {
|
||||
return $cacheResult;
|
||||
}
|
||||
}
|
||||
|
||||
// Combine contents.
|
||||
$combined = array();
|
||||
|
||||
foreach($this->files as $file) {
|
||||
if ($this->type === self::TYPE_CSS && MINIFY_REWRITE_CSS_URLS) {
|
||||
// Rewrite relative CSS URLs.
|
||||
$combined[] = self::rewriteCSSUrls(file_get_contents($file),
|
||||
dirname($file));
|
||||
}
|
||||
else {
|
||||
$combined[] = file_get_contents($file);
|
||||
}
|
||||
}
|
||||
|
||||
$combined = $minify ? self::min(implode("\n", $combined), $this->type) :
|
||||
implode("\n", $combined);
|
||||
|
||||
// Save combined contents to the cache.
|
||||
if (MINIFY_USE_CACHE) {
|
||||
$cacheFile = MINIFY_CACHE_DIR.'/minify_'.$this->getHash();
|
||||
@file_put_contents($cacheFile, $combined, LOCK_EX);
|
||||
}
|
||||
|
||||
return $combined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an array of absolute pathnames of all files that have been added with
|
||||
* addFile() or via this class's constructor.
|
||||
*
|
||||
* @return array array of absolute pathnames
|
||||
* @see addFile()
|
||||
* @see removeFile()
|
||||
*/
|
||||
public function getFiles() {
|
||||
return $this->files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the MD5 hash of the concatenated filenames from the list of files to
|
||||
* be minified.
|
||||
*/
|
||||
public function getHash() {
|
||||
return hash('md5', implode('', $this->files));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the timestamp of the most recently modified file.
|
||||
*
|
||||
* @return int timestamp
|
||||
*/
|
||||
public function getLastModified() {
|
||||
$lastModified = 0;
|
||||
|
||||
// Get the timestamp of the most recently modified file.
|
||||
foreach($this->files as $file) {
|
||||
$modified = filemtime($file);
|
||||
|
||||
if ($modified !== false && $modified > $lastModified) {
|
||||
$lastModified = $modified;
|
||||
}
|
||||
}
|
||||
|
||||
return $lastModified;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified filename or array of filenames from the list of files
|
||||
* to be minified.
|
||||
*
|
||||
* @param array|string $files filename or array of filenames
|
||||
* @see addFile()
|
||||
* @see getFiles()
|
||||
*/
|
||||
public function removeFile($files) {
|
||||
$files = @array_map(array($this, 'resolveFilePath'), (array) $files);
|
||||
$this->files = array_diff($this->files, $files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to serve the combined, minified files from the server's disk-based
|
||||
* cache if possible.
|
||||
*
|
||||
* @param bool $return return cached content as a string instead of outputting
|
||||
* it to the client
|
||||
* @return bool|string
|
||||
*/
|
||||
public function serverCache($return = false) {
|
||||
$cacheFile = MINIFY_CACHE_DIR.'/minify_'.$this->getHash();
|
||||
$lastModified = $this->getLastModified();
|
||||
|
||||
if (is_file($cacheFile) && $lastModified <= filemtime($cacheFile)) {
|
||||
if ($return) {
|
||||
return file_get_contents($cacheFile);
|
||||
}
|
||||
else {
|
||||
echo file_get_contents($cacheFile);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// -- Protected Instance Methods ---------------------------------------------
|
||||
|
||||
/**
|
||||
* Returns the canonicalized absolute pathname to the specified file or local
|
||||
* URL.
|
||||
*
|
||||
* @param string $file relative file path
|
||||
* @return string canonicalized absolute pathname
|
||||
*/
|
||||
protected function resolveFilePath($file) {
|
||||
// Is this a URL?
|
||||
if (preg_match('/^https?:\/\//i', $file)) {
|
||||
if (!$parsedUrl = parse_url($file)) {
|
||||
throw new MinifyInvalidUrlException("Invalid URL: $file");
|
||||
}
|
||||
|
||||
// Does the server name match the local server name?
|
||||
if (!isset($parsedUrl['host']) ||
|
||||
$parsedUrl['host'] != $_SERVER['SERVER_NAME']) {
|
||||
throw new MinifyInvalidUrlException('Non-local URL not supported: '.
|
||||
$file);
|
||||
}
|
||||
|
||||
// Get the file's absolute path.
|
||||
$filepath = realpath(MINIFY_BASE_DIR.$parsedUrl['path']);
|
||||
}
|
||||
else {
|
||||
// Get the file's absolute path.
|
||||
$filepath = realpath(MINIFY_BASE_DIR.'/'.$file);
|
||||
}
|
||||
|
||||
// Ensure that the file exists, that the path is under the base directory,
|
||||
// that the file's extension is either '.css' or '.js', and that the file is
|
||||
// actually readable.
|
||||
if (!$filepath ||
|
||||
!is_file($filepath) ||
|
||||
!is_readable($filepath) ||
|
||||
!preg_match('/^'.preg_quote(MINIFY_BASE_DIR, '/').'/', $filepath) ||
|
||||
!preg_match('/\.(?:css|js)$/iD', $filepath)) {
|
||||
|
||||
// Even when the file exists, we still throw a
|
||||
// MinifyFileNotFoundException in order to try to prevent an information
|
||||
// disclosure vulnerability.
|
||||
throw new MinifyFileNotFoundException("File not found: $file");
|
||||
}
|
||||
|
||||
return $filepath;
|
||||
}
|
||||
}
|
||||
|
||||
// -- Exception Classes --------------------------------------------------------
|
||||
class MinifyException extends Exception {}
|
||||
class MinifyFileNotFoundException extends MinifyException {}
|
||||
class MinifyInvalidArgumentException extends MinifyException {}
|
||||
class MinifyInvalidUrlException extends MinifyException {}
|
||||
|
||||
// -- Global Scope -------------------------------------------------------------
|
||||
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
Minify::handleRequest();
|
||||
}
|
17
min_extras/config.php
Normal file
17
min_extras/config.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Add the location of Minify's "lib" directory to the include_path. In
|
||||
* production this could be done via .htaccess or some other method.
|
||||
*/
|
||||
ini_set('include_path',
|
||||
dirname(__FILE__) . '/../min/lib'
|
||||
. PATH_SEPARATOR . ini_get('include_path')
|
||||
);
|
||||
|
||||
/**
|
||||
* Set $minifyCachePath to a PHP-writeable path to enable server-side caching
|
||||
* in all examples and tests.
|
||||
*/
|
||||
$minifyCachePath = 'C:/xampp/tmp'; // '';
|
||||
|
11
min_extras/examples/1/_groupsSources.php
Normal file
11
min_extras/examples/1/_groupsSources.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
$base = realpath(dirname(__FILE__) . '/..');
|
||||
$groupsSources = array(
|
||||
'js' => array(
|
||||
"{$base}/jquery-1.2.3.js"
|
||||
,"{$base}/test space.js"
|
||||
)
|
||||
,'css' => array("{$base}/test.css")
|
||||
);
|
||||
unset($base);
|
47
min_extras/examples/1/index.php
Normal file
47
min_extras/examples/1/index.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
require '../../config.php';
|
||||
require '_groupsSources.php';
|
||||
|
||||
require 'Minify/Build.php';
|
||||
$jsBuild = new Minify_Build($groupsSources['js']);
|
||||
$cssBuild = new Minify_Build($groupsSources['css']);
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Minify Example 1</title>
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo $cssBuild->uri('m.php/css'); ?>" />
|
||||
<style type="text/css">#cssFail {width:2.8em; overflow:hidden;}</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<?php if (! $minifyCachePath): ?>
|
||||
<p><strong>Note:</strong> You should <em>always</em> enable caching using
|
||||
<code>Minify::useServerCache()</code>. For the examples this can be set in
|
||||
<code>config.php</code>. Notice that minifying jQuery takes several seconds!.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<h1>Minify Example 1 : Groups controller + Far-off Expires header</h1>
|
||||
|
||||
<p>In this example, we use a single config file <code>_groupsSources.php</code>
|
||||
to specify files for minification. During HTML generation,
|
||||
<code>Minify_Build</code> is used
|
||||
to stamp the latest modification times onto the minify URLs. Our minify server,
|
||||
<code>m.php</code>, then sends the content with far-off Expires headers.</p>
|
||||
|
||||
<p>If one of our sources is modified, its URL (particularly the query string) is
|
||||
changed in the HTML document, causing the browser to request a new version.</p>
|
||||
|
||||
<h2>Minify tests</h2>
|
||||
<ul>
|
||||
<li id="cssFail"><span>FAIL</span>PASS</li>
|
||||
<li id="jsFail1">FAIL</li>
|
||||
</ul>
|
||||
|
||||
<h2>Test client cache</h2>
|
||||
<p><a href="">Reload page</a> <small>(F5 can trigger no-cache headers)</small></p>
|
||||
|
||||
<script type="text/javascript" src="<?php echo $jsBuild->uri('m.php/js'); ?>"></script>
|
||||
</body>
|
||||
</html>
|
14
min_extras/examples/1/m.php
Normal file
14
min_extras/examples/1/m.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require '_groupsSources.php';
|
||||
require 'Minify.php';
|
||||
|
||||
if ($minifyCachePath) {
|
||||
Minify::setCache($minifyCachePath);
|
||||
}
|
||||
|
||||
Minify::serve('Groups', array(
|
||||
'groups' => $groupsSources
|
||||
,'setExpires' => time() + 86400 * 365
|
||||
));
|
11
min_extras/examples/2/_groupsSources.php
Normal file
11
min_extras/examples/2/_groupsSources.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
$base = realpath(dirname(__FILE__) . '/..');
|
||||
$groupsSources = array(
|
||||
'js' => array(
|
||||
"{$base}/jquery-1.2.3.js"
|
||||
,"{$base}/test space.js"
|
||||
)
|
||||
,'css' => array("{$base}/test.css")
|
||||
);
|
||||
unset($base);
|
86
min_extras/examples/2/index.php
Normal file
86
min_extras/examples/2/index.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
require '../../config.php';
|
||||
require '_groupsSources.php';
|
||||
|
||||
require 'Minify/Build.php';
|
||||
$jsBuild = new Minify_Build($groupsSources['js']);
|
||||
$cssBuild = new Minify_Build($groupsSources['css']);
|
||||
|
||||
ob_start();
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Minify Example 2</title>
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo $cssBuild->uri('m.php/css'); ?>" />
|
||||
<style type="text/css">
|
||||
|
||||
#cssFail {
|
||||
width:2.8em;
|
||||
overflow:hidden;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<?php if (! $minifyCachePath): ?>
|
||||
<p><strong>Note:</strong> You should <em>always</em> enable caching using
|
||||
<code>Minify::useServerCache()</code>. For the examples this can be set in
|
||||
<code>config.php</code>. Notice that minifying jQuery takes several seconds!.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<h1>Minify Example 2: Minifying <em>Everything</em></h1>
|
||||
|
||||
<p>In this example, external Javascript and CSS minification is identical to
|
||||
example 1, but here Minify is also used to minify and serve the HTML, including
|
||||
the contents of all <code><style></code> and <code><script></code>
|
||||
elements.</p>
|
||||
|
||||
<p>As the document is XHTML, Minify_HTML places the 2nd <code><script></code>
|
||||
element in a CDATA section because it contains "<". The output is valid XHTML.</p>
|
||||
|
||||
<h2>Minify tests</h2>
|
||||
<ul>
|
||||
<li id="cssFail"><span>FAIL</span>PASS</li>
|
||||
<li id="jsFail1">FAIL</li>
|
||||
<li id="jsFail2">FAIL</li>
|
||||
</ul>
|
||||
|
||||
<h2>Test client cache</h2>
|
||||
<p><a href="">Reload page</a> <small>(F5 can trigger no-cache headers)</small></p>
|
||||
|
||||
<script type="text/javascript" src="<?php echo $jsBuild->uri('m.php/js'); ?>"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
$(function () {
|
||||
if ( 1 < 2 ) {
|
||||
$('#jsFail2').html('PASS');
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
$content = ob_get_clean();
|
||||
|
||||
require 'Minify.php';
|
||||
|
||||
if ($minifyCachePath) {
|
||||
Minify::useServerCache($minifyCachePath);
|
||||
}
|
||||
|
||||
$pageLastUpdate = max(
|
||||
filemtime(__FILE__)
|
||||
,$jsBuild->lastModified
|
||||
,$cssBuild->lastModified
|
||||
);
|
||||
|
||||
Minify::serve('Page', array(
|
||||
'content' => $content
|
||||
,'id' => __FILE__
|
||||
,'lastModifiedTime' => $pageLastUpdate
|
||||
// also minify the CSS/JS inside the HTML
|
||||
,'minifyAll' => true
|
||||
));
|
14
min_extras/examples/2/m.php
Normal file
14
min_extras/examples/2/m.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require '_groupsSources.php';
|
||||
require 'Minify.php';
|
||||
|
||||
if ($minifyCachePath) {
|
||||
Minify::setCache($minifyCachePath);
|
||||
}
|
||||
|
||||
Minify::serve('Groups', array(
|
||||
'groups' => $groupsSources
|
||||
,'setExpires' => time() + 86400 * 365
|
||||
));
|
37
min_extras/examples/3/index.php
Normal file
37
min_extras/examples/3/index.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
require '../../config.php';
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Minify Example 3</title>
|
||||
<link rel="stylesheet" type="text/css" href="m.php?f=test.css" />
|
||||
<style type="text/css">#cssFail {width:2.8em; overflow:hidden;}</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<?php if (! $minifyCachePath): ?>
|
||||
<p><strong>Note:</strong> You should <em>always</em> enable caching using
|
||||
<code>Minify::useServerCache()</code>. For the examples this can be set in
|
||||
<code>config.php</code>. Notice that minifying jQuery takes several seconds!.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<h1>Minify Example 3: Files controller</h1>
|
||||
|
||||
<p>This is an example of Minify serving a directory of single css/js files.
|
||||
Each file is minified and sent with HTTP encoding (browser-permitting).</p>
|
||||
|
||||
<h2>Minify tests</h2>
|
||||
<ul>
|
||||
<li id="cssFail"><span>FAIL</span>PASS</li>
|
||||
<li id="jsFail1">FAIL</li>
|
||||
</ul>
|
||||
|
||||
<h2>Test client cache</h2>
|
||||
<p><a href="">Reload page</a> <small>(F5 can trigger no-cache headers)</small></p>
|
||||
|
||||
<script type="text/javascript" src="m.php?f=jquery-1.2.3.js"></script>
|
||||
<script type="text/javascript" src="m.php?f=test+space.js"></script>
|
||||
</body>
|
||||
</html>
|
44
min_extras/examples/3/m.php
Normal file
44
min_extras/examples/3/m.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This script will serve a single js/css file in this directory. Here we place
|
||||
* the front-end-controller logic in user code, then use the "Files" controller
|
||||
* to minify the file. Alternately, we could have created a custom controller
|
||||
* with the same logic and passed it to Minify::handleRequest().
|
||||
*/
|
||||
|
||||
require '../../config.php';
|
||||
|
||||
/**
|
||||
* The Files controller only "knows" HTML, CSS, and JS files. Other files
|
||||
* would only be trim()ed and sent as plain/text.
|
||||
*/
|
||||
$serveExtensions = array('css', 'js');
|
||||
|
||||
// serve
|
||||
if (isset($_GET['f'])) {
|
||||
$filename = basename($_GET['f']); // remove any naughty bits
|
||||
$filenamePattern = '/[^\'"\\/\\\\]+\\.(?:'
|
||||
.implode('|', $serveExtensions). ')$/';
|
||||
|
||||
if (preg_match($filenamePattern, $filename)
|
||||
&& file_exists(dirname(__FILE__) . '/../' . $filename)) {
|
||||
|
||||
require 'Minify.php';
|
||||
|
||||
if ($minifyCachePath) {
|
||||
Minify::setCache($minifyCachePath);
|
||||
}
|
||||
|
||||
// The Files controller can serve an array of files, but here we just
|
||||
// need one.
|
||||
Minify::serve('Files', array(
|
||||
// controller will cast a string to an array for you
|
||||
'files' => dirname(__FILE__) . '/../' . $filename
|
||||
));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
header("HTTP/1.0 404 Not Found");
|
||||
echo "HTTP/1.0 404 Not Found";
|
3408
min_extras/examples/jquery-1.2.3.js
vendored
Normal file
3408
min_extras/examples/jquery-1.2.3.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5
min_extras/examples/test space.js
Normal file
5
min_extras/examples/test space.js
Normal file
@@ -0,0 +1,5 @@
|
||||
$(function () {
|
||||
|
||||
$('#jsFail1').html('PASS');
|
||||
|
||||
});
|
41
min_extras/examples/test.css
Normal file
41
min_extras/examples/test.css
Normal file
@@ -0,0 +1,41 @@
|
||||
/* Test file to minify */
|
||||
|
||||
/*! copyright notice here... */
|
||||
|
||||
html {
|
||||
margin:0;
|
||||
padding:0;
|
||||
background:#aaa;
|
||||
}
|
||||
body {
|
||||
margin:0 auto;
|
||||
padding:1em;
|
||||
width:550px;
|
||||
background:#fff;
|
||||
}
|
||||
body > *:first-child {margin-top:0;}
|
||||
|
||||
h1 {
|
||||
color: #00cc00;
|
||||
font-size: 20px;
|
||||
}
|
||||
h2 {
|
||||
color: #009900;
|
||||
font-size: 17px;
|
||||
}
|
||||
h1, h2 {margin:1.3em 0 .3em;}
|
||||
|
||||
p {
|
||||
margin:0 0 1em;
|
||||
}
|
||||
|
||||
ul, li {
|
||||
padding:0;
|
||||
margin:0;
|
||||
display:block;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
#cssFail span {
|
||||
display: none;
|
||||
}
|
32
min_extras/tools/encodeFile.php
Normal file
32
min_extras/tools/encodeFile.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (isset($_FILES['subject']['name'])) {
|
||||
|
||||
require '../../min/lib/HTTP/Encoder.php';
|
||||
$he = new HTTP_Encoder(array(
|
||||
'content' => file_get_contents($_FILES['subject']['tmp_name'])
|
||||
,'method' => $_POST['method']
|
||||
));
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Transfer-Encoding: binary');
|
||||
header("Content-Disposition: attachment; filename=\"{$_FILES['subject']['name']}."
|
||||
. ($_POST['method'] == 'deflate'
|
||||
? 'zd'
|
||||
: ($_POST['method'] == 'gzip'
|
||||
? 'zg'
|
||||
: 'zc'
|
||||
)
|
||||
) . '"');
|
||||
$he->encode(9);
|
||||
echo $he->getContent();
|
||||
exit();
|
||||
}
|
||||
|
||||
?>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<p>Encode <input type="file" name="subject" /><br />
|
||||
as <input type="submit" name="method" value="deflate" />
|
||||
<input type="submit" name="method" value="gzip" />
|
||||
<input type="submit" name="method" value="compress" />
|
||||
</p>
|
||||
</form>
|
53
min_extras/tools/minifyFile.php
Normal file
53
min_extras/tools/minifyFile.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
if (isset($_FILES['subject']['name'])
|
||||
&& preg_match('/\\.(js|css|x?html?)$/', $_FILES['subject']['name'], $m)
|
||||
) {
|
||||
ini_set('include_path',
|
||||
dirname(__FILE__) . '/../../min/lib'
|
||||
. PATH_SEPARATOR . ini_get('include_path')
|
||||
);
|
||||
|
||||
// eh why not
|
||||
require 'Minify/HTML.php';
|
||||
require 'Minify/CSS.php';
|
||||
require 'Minify/Javascript.php';
|
||||
|
||||
$arg2 = null;
|
||||
switch ($m[1]) {
|
||||
case 'js':
|
||||
$type = 'Javascript';
|
||||
break;
|
||||
case 'css':
|
||||
$type = 'CSS';
|
||||
break;
|
||||
case 'html': // fallthrough
|
||||
case 'htm': // fallthrough
|
||||
case 'xhtml':
|
||||
$type = 'HTML';
|
||||
$arg2 = array(
|
||||
'cssMinifier' => array('Minify_CSS', 'minify')
|
||||
,'jsMinifier' => array('Minify_Javascript', 'minify')
|
||||
);
|
||||
}
|
||||
$func = array('Minify_' . $type, 'minify');
|
||||
|
||||
$out = call_user_func($func, file_get_contents($_FILES['subject']['tmp_name']), $arg2);
|
||||
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Transfer-Encoding: binary');
|
||||
header('Content-Disposition: attachment; filename="'
|
||||
. preg_replace('/\\.(\w+)$/', '.min.$1', $_FILES['subject']['name'])
|
||||
. '"');
|
||||
|
||||
//@unlink($_FILES['subject']['tmp_name']);
|
||||
echo $out;
|
||||
exit();
|
||||
}
|
||||
|
||||
?>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<p>Minify <input type="file" name="subject" /><br />
|
||||
<input type="submit" name="method" value="Go!" />
|
||||
</p>
|
||||
</form>
|
44
min_extras/unit_tests/HTTP_ConditionalGet/2.php
Normal file
44
min_extras/unit_tests/HTTP_ConditionalGet/2.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/ConditionalGet.php';
|
||||
|
||||
// emulate regularly updating document
|
||||
$every = 20;
|
||||
$lastModified = round(time()/$every)*$every - $every;
|
||||
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'lastModifiedTime' => $lastModified
|
||||
));
|
||||
if ($cg->cacheIsValid) {
|
||||
$cg->sendHeaders();
|
||||
// we're done
|
||||
exit();
|
||||
}
|
||||
|
||||
// generate content
|
||||
$title = 'Last-Modified is known : add Content-Length';
|
||||
$explain = '
|
||||
<p>Here, like <a href="./">the first example</a>, we know the Last-Modified time,
|
||||
but we also want to set the Content-Length to increase cacheability and allow
|
||||
HTTP persistent connections. Instead of sending headers immediately, we first
|
||||
generate our content, then use <code>setContentLength(strlen($content))</code>
|
||||
to add the header. Then finally call <code>sendHeaders()</code> and send the
|
||||
content.</p>
|
||||
<p><strong>Note:</strong> This is not required if your PHP config buffers all
|
||||
output and your script doesn\'t do any incremental flushing of the output
|
||||
buffer. PHP will generally set Content-Length for you if it can.</p>
|
||||
<p>This script emulates a document that changes every ' .$every. ' seconds.
|
||||
<br>This is version: ' . date('r', $lastModified) . '</p>
|
||||
';
|
||||
|
||||
require '_include.php';
|
||||
$content = get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
));
|
||||
|
||||
$cg->setContentLength(strlen($content));
|
||||
$cg->sendHeaders();
|
||||
send_slowly($content);
|
||||
|
40
min_extras/unit_tests/HTTP_ConditionalGet/3.php
Normal file
40
min_extras/unit_tests/HTTP_ConditionalGet/3.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/ConditionalGet.php';
|
||||
|
||||
// generate content first (not ideal)
|
||||
// emulate regularly updating document
|
||||
$every = 20;
|
||||
$lastModified = round(time()/$every)*$every - $every;
|
||||
$title = 'Last-Modified is unknown : use hash of content for ETag';
|
||||
$explain = '
|
||||
<p>When Last-Modified is unknown, you can still use ETags, but you need a short
|
||||
string that is unique for that content. In the worst case, you have to generate
|
||||
all the content first, <em>then</em> instantiate HTTP_ConditionalGet, setting
|
||||
the array key <code>contentHash</code> to the output of a hash function of the
|
||||
content. Since we have the full content, we might as well also use
|
||||
<code>setContentLength(strlen($content))</code> in the case where we need to
|
||||
send it.</p>
|
||||
<p>This script emulates a document that changes every ' .$every. ' seconds.
|
||||
<br>This is version: ' . date('r', $lastModified) . '</p>
|
||||
';
|
||||
require '_include.php';
|
||||
$content = get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
));
|
||||
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'contentHash' => substr(md5($content), 7)
|
||||
));
|
||||
if ($cg->cacheIsValid) {
|
||||
$cg->sendHeaders();
|
||||
// we're done
|
||||
exit();
|
||||
}
|
||||
$cg->setContentLength(strlen($content));
|
||||
$cg->sendHeaders();
|
||||
|
||||
send_slowly($content);
|
||||
|
46
min_extras/unit_tests/HTTP_ConditionalGet/4.php
Normal file
46
min_extras/unit_tests/HTTP_ConditionalGet/4.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/ConditionalGet.php';
|
||||
|
||||
// emulate regularly updating document
|
||||
$every = 20;
|
||||
$lastModified = round(time()/$every)*$every - $every;
|
||||
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'lastModifiedTime' => $lastModified
|
||||
));
|
||||
$cg->sendHeaders();
|
||||
if ($cg->cacheIsValid) {
|
||||
// we're done
|
||||
exit();
|
||||
}
|
||||
|
||||
// output encoded content
|
||||
|
||||
$title = 'ConditionalGet + Encoder';
|
||||
$explain = '
|
||||
<p>Using ConditionalGet and Encoder is straightforward. First impliment the
|
||||
ConditionalGet, then if the cache is not valid, encode and send the content</p>
|
||||
<p>This script emulates a document that changes every ' .$every. ' seconds.
|
||||
<br>This is version: ' . date('r', $lastModified) . '</p>
|
||||
';
|
||||
require '_include.php';
|
||||
$content = get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
));
|
||||
|
||||
require 'HTTP/Encoder.php';
|
||||
$he = new HTTP_Encoder(array(
|
||||
'content' => get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
))
|
||||
));
|
||||
$he->encode();
|
||||
|
||||
// usually you would just $he->sendAll(), but here we want to emulate slow
|
||||
// connection
|
||||
$he->sendHeaders();
|
||||
send_slowly($he->getContent());
|
27
min_extras/unit_tests/HTTP_ConditionalGet/5.php
Normal file
27
min_extras/unit_tests/HTTP_ConditionalGet/5.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/ConditionalGet.php';
|
||||
|
||||
// far expires
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'maxAge' => 20
|
||||
,'lastModifiedTime' => filemtime(__FILE__)
|
||||
));
|
||||
$cg->sendHeaders();
|
||||
|
||||
// generate, send content
|
||||
$title = 'Last-Modified + Expires';
|
||||
$explain = '
|
||||
<p>Here we set a static "lastModifiedTime" and "maxAge" to 20. The browser
|
||||
will consider this document fresh for 20 seconds, then revalidate its cache. After
|
||||
the 304 response, the cache will be good for another 20 seconds. Unless you force
|
||||
a reload, there will only be 304 responses for this page after the initial download.
|
||||
';
|
||||
|
||||
require '_include.php';
|
||||
echo get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
));
|
||||
|
64
min_extras/unit_tests/HTTP_ConditionalGet/_include.php
Normal file
64
min_extras/unit_tests/HTTP_ConditionalGet/_include.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
function send_slowly($content)
|
||||
{
|
||||
$half = ceil(strlen($content) / 2);
|
||||
$content = str_split($content, $half);
|
||||
while ($chunk = array_shift($content)) {
|
||||
sleep(1);
|
||||
echo $chunk;
|
||||
ob_get_level() && ob_flush();
|
||||
flush();
|
||||
}
|
||||
}
|
||||
|
||||
function get_content($data)
|
||||
{
|
||||
ob_start();
|
||||
?>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>HTTP_ConditionalGet : <?php echo $data['title']; ?></title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>HTTP_ConditionalGet</h1>
|
||||
<h2><?php echo $data['title']; ?></h2>
|
||||
<?php echo $data['explain']; ?>
|
||||
<ul>
|
||||
<li><a href="./">Last-Modified is known : simple usage</a></li>
|
||||
<li><a href="2.php">Last-Modified is known : add Content-Length</a></li>
|
||||
<li><a href="3.php">Last-Modified is unknown : use hash of content for ETag</a></li>
|
||||
<li><a href="4.php">ConditionalGet + Encoder</a></li>
|
||||
<li><a href="5.php">Last-Modified + Expires</a></li>
|
||||
</ul>
|
||||
<h2>Notes</h2>
|
||||
<h3>How to distinguish 200 and 304 responses</h3>
|
||||
<p>For these pages all 200 responses are sent in chunks a second apart, so you
|
||||
should notice that 304 responses are quicker. You can also use HTTP sniffers
|
||||
like <a href="http://www.fiddlertool.com/">Fiddler (win)</a> and
|
||||
<a href="http://livehttpheaders.mozdev.org/">LiveHTTPHeaders (Firefox add-on)</a>
|
||||
to verify headers and content being sent.</p>
|
||||
<h3>Browser notes</h3>
|
||||
<dl>
|
||||
<dt>Opera</dt>
|
||||
<dd>Opera has a couple behaviors against the HTTP spec: Manual refreshes (F5)
|
||||
prevents the ETag/If-Modified-Since headers from being sent; it only sends
|
||||
them when following a link or bookmark. Also, Opera will not honor the
|
||||
<code>must-revalidate</code> Cache-Control value unless <code>max-age</code>
|
||||
is set. To get Opera to follow the spec, ConditionalGet will send Opera max-age=0
|
||||
(if one is not already set).</dd>
|
||||
<dt>Safari</dt>
|
||||
<dd>ETag validation is unsupported, but Safari supports HTTP/1.0 validation via
|
||||
If-Modified-Since headers as long as the cache is explicitly marked
|
||||
"public" or "private" ("private" is default in ConditionalGet).</dd>
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $content;
|
||||
}
|
||||
|
36
min_extras/unit_tests/HTTP_ConditionalGet/index.php
Normal file
36
min_extras/unit_tests/HTTP_ConditionalGet/index.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/ConditionalGet.php';
|
||||
|
||||
// emulate regularly updating document
|
||||
$every = 20;
|
||||
$lastModified = round(time()/$every)*$every - $every;
|
||||
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'lastModifiedTime' => $lastModified
|
||||
));
|
||||
$cg->sendHeaders();
|
||||
if ($cg->cacheIsValid) {
|
||||
// we're done
|
||||
exit();
|
||||
}
|
||||
|
||||
$title = 'Last-Modified is known : simple usage';
|
||||
$explain = '
|
||||
<p>If your content has not changed since a certain timestamp, set this via the
|
||||
the <code>lastModifiedTime</code> array key when instantiating HTTP_ConditionalGet.
|
||||
You can immediately call the method <code>sendHeaders()</code> to set the
|
||||
Last-Modified, ETag, and Cache-Control headers. The, if <code>cacheIsValid</code>
|
||||
property is false, you echo the content.</p>
|
||||
<p>This script emulates a document that changes every ' .$every. ' seconds.
|
||||
<br>This is version: ' . date('r', $lastModified) . '</p>
|
||||
';
|
||||
|
||||
require '_include.php';
|
||||
|
||||
echo send_slowly(get_content(array(
|
||||
'title' => $title
|
||||
,'explain' => $explain
|
||||
)));
|
||||
|
BIN
min_extras/unit_tests/HTTP_Encoder/green.png
Normal file
BIN
min_extras/unit_tests/HTTP_Encoder/green.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 202 B |
60
min_extras/unit_tests/HTTP_Encoder/index.php
Normal file
60
min_extras/unit_tests/HTTP_Encoder/index.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
ini_set('display_errors', 'on');
|
||||
|
||||
require '../../config.php';
|
||||
require 'HTTP/Encoder.php';
|
||||
|
||||
if (!isset($_GET['test'])) {
|
||||
$type = 'text/html';
|
||||
ob_start();
|
||||
?>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>HTTP_Encoder Test</title>
|
||||
<style type="text/css">
|
||||
@import "?test=2";
|
||||
#img {background:url("?test=1");}
|
||||
.green {background:#0f0;}
|
||||
p span {padding:0 .5em;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>HTTP_Encoder test</h1>
|
||||
<p><span class="green"> HTML </span></p>
|
||||
<p><span id="css"> CSS </span></p>
|
||||
<p><span id="js"> Javascript </span></p>
|
||||
<p><span id="img"> image </span></p>
|
||||
<script src="?test=3" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
} elseif ($_GET['test'] == '1') {
|
||||
$content = file_get_contents(dirname(__FILE__) . '/green.png');
|
||||
$type = 'image/png';
|
||||
|
||||
} elseif ($_GET['test'] == '2') {
|
||||
$content = '#css {background:#0f0;}';
|
||||
$type = 'text/css';
|
||||
|
||||
} else {
|
||||
$content = '
|
||||
window.onload = function(){
|
||||
document.getElementById("js").className = "green";
|
||||
};
|
||||
';
|
||||
$type = 'application/x-javascript';
|
||||
}
|
||||
|
||||
$he = new HTTP_Encoder(array(
|
||||
'content' => $content
|
||||
,'type' => $type
|
||||
));
|
||||
$he->encode();
|
||||
$he->sendAll();
|
||||
|
||||
?>
|
28
min_extras/unit_tests/_inc.php
Normal file
28
min_extras/unit_tests/_inc.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
require '../config.php';
|
||||
|
||||
error_reporting(E_ALL | E_STRICT);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: text/plain');
|
||||
|
||||
$thisDir = dirname(__FILE__);
|
||||
|
||||
/**
|
||||
* pTest - PHP Unit Tester
|
||||
* @param mixed $test Condition to test, evaluated as boolean
|
||||
* @param string $message Descriptive message to output upon test
|
||||
* @url http://www.sitepoint.com/blogs/2007/08/13/ptest-php-unit-tester-in-9-lines-of-code/
|
||||
*/
|
||||
function assertTrue($test, $message)
|
||||
{
|
||||
static $count;
|
||||
if (!isset($count)) $count = array('pass'=>0, 'fail'=>0, 'total'=>0);
|
||||
|
||||
$mode = $test ? 'pass' : 'fail';
|
||||
$outMode = $test ? 'PASS' : '!FAIL';
|
||||
printf("%s: %s (%d of %d tests run so far have %sed)\n",
|
||||
$outMode, $message, ++$count[$mode], ++$count['total'], $mode);
|
||||
|
||||
return (bool)$test;
|
||||
}
|
6
min_extras/unit_tests/_test_files/css/comments.css
Normal file
6
min_extras/unit_tests/_test_files/css/comments.css
Normal file
@@ -0,0 +1,6 @@
|
||||
|
||||
/* block comments get removed */
|
||||
|
||||
/*! YUI Compressor style comments are preserved */
|
||||
|
||||
/* but all other comments are removed */
|
2
min_extras/unit_tests/_test_files/css/comments.min.css
vendored
Normal file
2
min_extras/unit_tests/_test_files/css/comments.min.css
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
/* YUI Compressor style comments are preserved */
|
62
min_extras/unit_tests/_test_files/css/hacks.css
Normal file
62
min_extras/unit_tests/_test_files/css/hacks.css
Normal file
@@ -0,0 +1,62 @@
|
||||
/* hide from ie5/mac \*/ a{}
|
||||
.foo {color:red}
|
||||
/* necessary comment */
|
||||
|
||||
/* comment to attempt to confuse parser */
|
||||
|
||||
/* feed to ie5/mac \*//*/
|
||||
@import "ie5mac.css";
|
||||
/* necessary comment */
|
||||
|
||||
/* comment to attempt to confuse parser */
|
||||
|
||||
/*/ hide from nav4 */
|
||||
.foo {display:block;}
|
||||
/* necessary comment */
|
||||
|
||||
/* comment to attempt to confuse parser */
|
||||
|
||||
/*/ feed to nav *//*/
|
||||
.foo {display:crazy;}
|
||||
/* necessary comment */
|
||||
|
||||
/* hide props from various IE/win */
|
||||
div {
|
||||
width: 140px;
|
||||
width/* */:/**/100px;
|
||||
width: /**/100px;
|
||||
}
|
||||
|
||||
html>/**/body {}
|
||||
|
||||
/* Tantek's box model hack */
|
||||
div {
|
||||
width:400px;
|
||||
voice-family: "\"}\"";
|
||||
voice-family:inherit;
|
||||
width:300px;
|
||||
}
|
||||
|
||||
/* don't minimize hex colors in filters */
|
||||
div {
|
||||
filter:chroma(color=#aabbcc);
|
||||
filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000);
|
||||
}
|
||||
|
||||
@media screen {
|
||||
/* for IE 5.x-6, hidden from IE 5 Mac */ /*\*/
|
||||
* html div#page {
|
||||
height: 1%;
|
||||
}
|
||||
/**/ /* end hidden from IE 5 Mac */
|
||||
}
|
||||
|
||||
foo { /* filters for IE */
|
||||
_height : 20px;
|
||||
*height : 15px;
|
||||
}
|
||||
|
||||
/* http://tantek.com/CSS/Examples/midpass.html */
|
||||
@media tty {
|
||||
i{content:"\";/*" "*/}} @import 'midpassafter.css'; /*";}
|
||||
}/* */
|
4
min_extras/unit_tests/_test_files/css/hacks.min.css
vendored
Normal file
4
min_extras/unit_tests/_test_files/css/hacks.min.css
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
/*\*/a{}.foo{color:red}/**//*\*//*/@import "ie5mac.css";/**//*/*/.foo{display:block}/**//*/*//*/.foo{display:crazy}/**/div{width:140px;width/**/:/**/100px;width:/**/100px}html>/**/body{}div{width:400px;voice-family:"\"}\"";voice-family:inherit;width:300px}div{filter:chroma(color=#aabbcc);filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000)}@media
|
||||
screen{/*\*/* html
|
||||
div#page{height:1%}/**/}foo{_height:20px;*height:15px}@media
|
||||
tty{i{content:"\";/*" "*/}}@import 'midpassafter.css';/*"}}/* */
|
10
min_extras/unit_tests/_test_files/css/paths.css
Normal file
10
min_extras/unit_tests/_test_files/css/paths.css
Normal file
@@ -0,0 +1,10 @@
|
||||
@import "foo.css";
|
||||
@import 'bar/foo.css' print;
|
||||
@import '/css/foo.css'; /* abs, should not alter */
|
||||
@import 'http://foo.com/css/foo.css'; /* abs, should not alter */
|
||||
@import url(../foo.css) tv, projection;
|
||||
@import url("/css/foo.css"); /* abs, should not alter */
|
||||
@import url(/css2/foo.css); /* abs, should not alter */
|
||||
foo {background:url('bar/foo.png')}
|
||||
foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */
|
||||
foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */
|
1
min_extras/unit_tests/_test_files/css/paths.min.css
vendored
Normal file
1
min_extras/unit_tests/_test_files/css/paths.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
@import "../foo.css";@import '../bar/foo.css' print;@import '/css/foo.css';@import 'http://foo.com/css/foo.css';@import url(../../foo.css) tv, projection;@import url("/css/foo.css");@import url(/css2/foo.css);foo{background:url('../bar/foo.png')}foo{background:url('http://foo.com/css/foo.css')}foo{background:url("//foo.com/css/foo.css")}
|
1
min_extras/unit_tests/_test_files/css/readme.txt
Normal file
1
min_extras/unit_tests/_test_files/css/readme.txt
Normal file
@@ -0,0 +1 @@
|
||||
Test suite from http://search.cpan.org/~gtermars/CSS-Minifier-XS/
|
42
min_extras/unit_tests/_test_files/css/selectors.css
Normal file
42
min_extras/unit_tests/_test_files/css/selectors.css
Normal file
@@ -0,0 +1,42 @@
|
||||
/* http://www.w3.org/TR/css3-selectors/ */
|
||||
|
||||
*
|
||||
E[foo]
|
||||
E[foo="bar"]
|
||||
E[foo~="bar"]
|
||||
E[foo^="bar"]
|
||||
E[foo$="bar"]
|
||||
E[foo*="bar"]
|
||||
E[hreflang|="en"]
|
||||
E:root
|
||||
E:nth-child(n)
|
||||
E:nth-last-child(n)
|
||||
E:nth-of-type(n)
|
||||
E:nth-last-of-type(n)
|
||||
E:first-child
|
||||
E:last-child
|
||||
E:first-of-type
|
||||
E:last-of-type
|
||||
E:only-child
|
||||
E:only-of-type
|
||||
E:empty
|
||||
E:link
|
||||
E:visited
|
||||
E:active
|
||||
E:hover
|
||||
E:focus
|
||||
E:target
|
||||
E:lang(fr)
|
||||
E:enabled
|
||||
E:disabled
|
||||
E:checked
|
||||
E::first-line
|
||||
E::first-letter
|
||||
E::selection
|
||||
E::before
|
||||
E::after
|
||||
E.warning#myid
|
||||
E:not(s)
|
||||
> F
|
||||
+ F
|
||||
~ F {color: red;}
|
37
min_extras/unit_tests/_test_files/css/selectors.min.css
vendored
Normal file
37
min_extras/unit_tests/_test_files/css/selectors.min.css
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
*
|
||||
E[foo]
|
||||
E[foo="bar"]
|
||||
E[foo~="bar"]
|
||||
E[foo^="bar"]
|
||||
E[foo$="bar"]
|
||||
E[foo*="bar"]
|
||||
E[hreflang|="en"]
|
||||
E:root
|
||||
E:nth-child(n)
|
||||
E:nth-last-child(n)
|
||||
E:nth-of-type(n)
|
||||
E:nth-last-of-type(n)
|
||||
E:first-child
|
||||
E:last-child
|
||||
E:first-of-type
|
||||
E:last-of-type
|
||||
E:only-child
|
||||
E:only-of-type
|
||||
E:empty
|
||||
E:link
|
||||
E:visited
|
||||
E:active
|
||||
E:hover
|
||||
E:focus
|
||||
E:target
|
||||
E:lang(fr)
|
||||
E:enabled
|
||||
E:disabled
|
||||
E:checked
|
||||
E::first-line
|
||||
E::first-letter
|
||||
E::selection
|
||||
E::before
|
||||
E::after
|
||||
E.warning#myid
|
||||
E:not(s)>F+F~F{color:red}
|
31
min_extras/unit_tests/_test_files/css/styles.css
Normal file
31
min_extras/unit_tests/_test_files/css/styles.css
Normal file
@@ -0,0 +1,31 @@
|
||||
/* some CSS to try to exercise things in general */
|
||||
|
||||
@import url( more.css );
|
||||
|
||||
body, td, th {
|
||||
font-family: Verdana , "Bitstream Vera Sans" , sans-serif ;
|
||||
|
||||
font-size : 12px;
|
||||
}
|
||||
|
||||
.nav {
|
||||
margin-left: 20%;
|
||||
}
|
||||
#main-nav {
|
||||
background-color: red;
|
||||
border: 1px solid #00ff77;
|
||||
}
|
||||
|
||||
div#content
|
||||
h1 + p {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@media all and (min-width: 640px) {
|
||||
#media-queries-1 { background-color: #0f0; }
|
||||
}
|
||||
|
||||
@media screen and (max-width: 2000px) {
|
||||
#media-queries-2 { background-color: #0f0; }
|
||||
}
|
3
min_extras/unit_tests/_test_files/css/styles.min.css
vendored
Normal file
3
min_extras/unit_tests/_test_files/css/styles.min.css
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
@import url(more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px
|
||||
solid #0f7}div#content
|
||||
h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}}
|
434
min_extras/unit_tests/_test_files/css/subsilver.css
Normal file
434
min_extras/unit_tests/_test_files/css/subsilver.css
Normal file
@@ -0,0 +1,434 @@
|
||||
/* Based on the original Style Sheet for the fisubsilver v2 Theme for phpBB version 2+
|
||||
Edited by Daz - http://www.forumimages.com - last updated 26-06-03 */
|
||||
/* The content of the posts (body of text) */
|
||||
/* General page style */
|
||||
|
||||
|
||||
|
||||
/* begin suggest post */
|
||||
.float-l{
|
||||
float: left;
|
||||
}
|
||||
|
||||
.form-suggest{
|
||||
height:200px;
|
||||
background:#DEE2D0;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.form-input input{
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.hide{
|
||||
display:none;
|
||||
}
|
||||
|
||||
.form-input textarea{
|
||||
font-size: 11px;
|
||||
width: 350px;
|
||||
}
|
||||
|
||||
.form-label{
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
line-height: 25px;
|
||||
padding-right: 10px;
|
||||
text-align: right;
|
||||
width: 100px;
|
||||
color: #39738F;
|
||||
}
|
||||
|
||||
.font-9{
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.form-topic{
|
||||
font-weight:bold;
|
||||
|
||||
}
|
||||
|
||||
.form-error{
|
||||
color:red;
|
||||
}
|
||||
|
||||
.inline{
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.space-10{
|
||||
clear: both;
|
||||
font-size: 10px;
|
||||
height: 10px;
|
||||
line-height: 10px;
|
||||
}
|
||||
|
||||
.suggest-success{
|
||||
color:green;
|
||||
padding-left:10px;
|
||||
font-size:11px;
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
.top{
|
||||
vertical-align: top;
|
||||
}
|
||||
/* end suggest post */
|
||||
|
||||
table td{
|
||||
padding:3px;
|
||||
}
|
||||
|
||||
a:link,a:active,a:visited,a.postlink{
|
||||
color: #006699;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
color: #DD6900;
|
||||
}
|
||||
|
||||
a.admin:hover,a.mod:hover{
|
||||
color: #DD6900;
|
||||
}
|
||||
|
||||
a.but,a.but:hover,a.but:visited{
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.topictitle:visited{
|
||||
color: #5493B4;
|
||||
}
|
||||
|
||||
a.topictitle:hover{
|
||||
color: #DD6900;
|
||||
}
|
||||
|
||||
|
||||
|
||||
body{
|
||||
color: #000000;
|
||||
font: 11px Verdana,Arial,Helvetica,sans-serif;
|
||||
margin: 0 10px 10px 10px;
|
||||
padding: 0;
|
||||
overflow:auto;
|
||||
}
|
||||
|
||||
/* General font families for common tags */
|
||||
font,th,td,p{
|
||||
font: 12px Verdana,Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
/* Form elements */
|
||||
form{
|
||||
display: inline;
|
||||
}
|
||||
|
||||
hr{
|
||||
border: 0px solid #FFFFFF;
|
||||
border-top-width: 1px;
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
/* Gets rid of the need for border="0" on hyperlinked images */
|
||||
img{
|
||||
border: 0 solid;
|
||||
}
|
||||
|
||||
input{
|
||||
font: 11px Verdana,Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
input.button,input.liteoption,.fakebut{
|
||||
background: #FAFAFA;
|
||||
border: 1px solid #000000;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
input.catbutton{
|
||||
background: #FAFAFA;
|
||||
border: 1px solid #000000;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
input.mainoption{
|
||||
background: #FAFAFA;
|
||||
border: 1px solid #000000;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
input.post,textarea.post{
|
||||
background: #FFFFFF;
|
||||
border: 1px solid #000000;
|
||||
font: 11px Verdana,Arial,Helvetica,sans-serif;
|
||||
padding-bottom: 2px;
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
select{
|
||||
background: #FFFFFF;
|
||||
font: 11px Verdana,Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
table{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
td{
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* Category gradients*/
|
||||
td.cat{
|
||||
background-color: #C2C6BA;
|
||||
font-weight: bold;
|
||||
height: 20px;
|
||||
letter-spacing: 1px;
|
||||
text-indent: 4px;
|
||||
}
|
||||
|
||||
td.genmed,.genmed{
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
/* This is for the table cell above the Topics,Post & Last posts on the index.php */
|
||||
td.rowpic{
|
||||
background: #C2C6BA;
|
||||
}
|
||||
|
||||
td.spacerow{
|
||||
background: #E5E6E2;
|
||||
}
|
||||
|
||||
/* Table Header cells */
|
||||
th{
|
||||
background-color: #FADD31;
|
||||
background-image: url(images/cellpic3.gif);
|
||||
background-repeat: repeat-x;
|
||||
color: #68685E;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
line-height:16px;
|
||||
height: 16px;
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Admin & Moderator Colours MODification */
|
||||
.admin,.mod{
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.admin,a.admin,a.admin:visited{
|
||||
color: #FFA34F;
|
||||
}
|
||||
|
||||
/* This is the border line & background colour round the entire page */
|
||||
.bodyline{
|
||||
background: #FFFFFF;
|
||||
border: 1px solid #98AAB1;
|
||||
}
|
||||
|
||||
.center{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
.code{
|
||||
background: #FAFAFA;
|
||||
border: 1px solid #D1D7DC;
|
||||
color: #006600;
|
||||
font: 12px Courier,"Courier New",sans-serif;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
/* This is for the error messages that pop up */
|
||||
.errorline{
|
||||
background: #E5E6E2;
|
||||
border: 1px solid #8F8B8B;
|
||||
color:#D92A2A;
|
||||
}
|
||||
|
||||
.explaintitle{
|
||||
color: #5C81B1;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* This is the outline round the main forum tables */
|
||||
.forumline{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
/* General text */
|
||||
.gensmall{
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.h1-font{
|
||||
color: #006699;
|
||||
display: inline;
|
||||
font: bold 13px Verdana, Arial, Helvetica, sans-serif;
|
||||
margin: 0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.h2-font{
|
||||
display: inline;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.height1{
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
.height22{
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.height25{
|
||||
height: 25px;
|
||||
}
|
||||
|
||||
.height28{
|
||||
height: 28px;
|
||||
}
|
||||
|
||||
.height30{
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.height40{
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
/* This is the line in the posting page which shows the rollover
|
||||
help line. Colour value in row2 */
|
||||
.helpline{
|
||||
border: 0 solid;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.imgfolder{
|
||||
margin: 1px 4px 1px 4px;
|
||||
}
|
||||
|
||||
.imgspace{
|
||||
margin-left: 1px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
/* Specify the space around images */
|
||||
.imgtopic,.imgicon{
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.left{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* The largest text used in the index page title and toptic title etc. */
|
||||
.maintitle,h1,h2{
|
||||
color: #5C81B1;
|
||||
font: bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.maxwidth{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.mod,a.mod,a.mod:visited{
|
||||
color: #006600;
|
||||
}
|
||||
|
||||
/* Name of poster in viewmsg.php and viewtopic.php and other places */
|
||||
.name{
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Used for the navigation text,(Page 1,2,3 etc) and the navigation bar when in a forum */
|
||||
.nav{
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nowrap{
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.postbody{
|
||||
font-size: 12px;
|
||||
line-height: 125%;
|
||||
}
|
||||
|
||||
.postbody a{
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Location,number of posts,post date etc */
|
||||
.postdetails{
|
||||
color: #00396A;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
/* Quote blocks */
|
||||
.quote{
|
||||
background: #F3F3EF;
|
||||
border: 1px solid #C2C6BA;
|
||||
color: #006699;
|
||||
font-size: 11px;
|
||||
line-height: 125%;
|
||||
}
|
||||
|
||||
.right{
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* Main table cell colours and backgrounds */
|
||||
.row1{
|
||||
background: #F0F0EB;
|
||||
}
|
||||
|
||||
.row2,.helpline{
|
||||
background: #E5E6E2;
|
||||
}
|
||||
|
||||
.row3{
|
||||
background: #DBDBD4;
|
||||
}
|
||||
|
||||
.subtitle,h2{
|
||||
font: bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* titles for the topics:could specify viewed link colour too */
|
||||
.topictitle {
|
||||
color: #000000;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.underline{
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.top{
|
||||
vertical-align:top;
|
||||
}
|
||||
|
||||
.image-hspace{
|
||||
margin-right:3px;
|
||||
}
|
||||
|
||||
.clear{
|
||||
clear:both;
|
||||
}
|
18
min_extras/unit_tests/_test_files/css/subsilver.min.css
vendored
Normal file
18
min_extras/unit_tests/_test_files/css/subsilver.min.css
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input
|
||||
input{font-size:10px}.hide{display:none}.form-input
|
||||
textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table
|
||||
td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0
|
||||
10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px
|
||||
solid #FFF;border-top-width:1px;height:0px}img{border:0
|
||||
solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px
|
||||
solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px
|
||||
solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px
|
||||
solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px
|
||||
solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0
|
||||
solid;font-size:10px}.imgfolder{margin:1px
|
||||
4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody
|
||||
a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px
|
||||
solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both}
|
10
min_extras/unit_tests/_test_files/css/unusual_strings.css
Normal file
10
min_extras/unit_tests/_test_files/css/unusual_strings.css
Normal file
@@ -0,0 +1,10 @@
|
||||
/* test unusual, but valid strings in CSS */
|
||||
|
||||
foo[attr="multiple spaces"] {
|
||||
content: "Hello World!";
|
||||
}
|
||||
|
||||
foo[attr="Hel\
|
||||
lo"] {
|
||||
content: " \"World\"";
|
||||
}
|
2
min_extras/unit_tests/_test_files/css/unusual_strings.min.css
vendored
Normal file
2
min_extras/unit_tests/_test_files/css/unusual_strings.min.css
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
foo[attr="multiple spaces"]{content:"Hello World!"}foo[attr="Hel\
|
||||
lo"]{content:" \"World\""}
|
658
min_extras/unit_tests/_test_files/css/vladmirated.css
Normal file
658
min_extras/unit_tests/_test_files/css/vladmirated.css
Normal file
@@ -0,0 +1,658 @@
|
||||
/* from http://www.vladimirated.com/web-development-minify-css-using-php-and-cssmin-class */
|
||||
|
||||
#comments_inviter #close_me {
|
||||
clear: both;
|
||||
text-align: center;
|
||||
border-top: 1px solid #eeeeee;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
#comments_inviter #close_me span {
|
||||
color: #108eed;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#comments_inviter img {
|
||||
float: left;
|
||||
margin-right: 3px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#comments_inviter {
|
||||
width: 200px;
|
||||
background-color: #FFFFFF;
|
||||
border: 4px solid #eeeeee;
|
||||
font-size: 10px;
|
||||
font-family: verdana;
|
||||
padding: 10px;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.one_com {
|
||||
background-color: #FAFAFA;
|
||||
padding: 10px;
|
||||
margin-bottom: 20px;
|
||||
border: 1px solid #EEEEEE;
|
||||
}
|
||||
|
||||
.one_com .com_says, .one_com .com_det {
|
||||
text-transform: lowercase;
|
||||
color: #333333;
|
||||
padding: 0px;
|
||||
font-family: verdana;
|
||||
margin: 0px;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.flvPlayer {
|
||||
text-align: center;
|
||||
border: 5px solid #dddddd;
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
.one_com .com_det {
|
||||
font-size: 10px;
|
||||
font-weight: normal;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 8px solid #eeeeee;
|
||||
}
|
||||
|
||||
.one_com .com_det a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.one_com .com_txt {
|
||||
background-color: #ffffff;
|
||||
margin-bottom: 10px;
|
||||
border-bottom: 2px solid #eeeeee
|
||||
}
|
||||
|
||||
.one_com .com_txt p {
|
||||
font-family: verdana;
|
||||
font-size: 13px;
|
||||
color: #777777;
|
||||
margin: 0px;
|
||||
padding: 5px;
|
||||
padding-bottom: 10px;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
|
||||
.one_com .com_says a {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.one_com .com_det a {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.post_box .related_posts {
|
||||
|
||||
}
|
||||
|
||||
.post_box .related_posts p {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
padding-bottom: 20px;
|
||||
padding-left: 35px;
|
||||
font-family: verdana;
|
||||
|
||||
}
|
||||
|
||||
.post_box .related_posts a {
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
.post_nav_2 p {
|
||||
|
||||
text-align: center;
|
||||
color: #cccccc;
|
||||
font-family: verdana;
|
||||
}
|
||||
|
||||
.post_box .related_posts h3, #comments_box #respond, .comments_posted h3 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-size: 18px;
|
||||
color: #FF8000;
|
||||
padding-top: 30px;
|
||||
margin-bottom: 20px;
|
||||
width: 300px;
|
||||
border-bottom: 5px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.comments_posted {
|
||||
|
||||
margin-bottom: 50px;
|
||||
|
||||
}
|
||||
|
||||
.comments_posted h3 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
margin-bottom: 20px;
|
||||
|
||||
}
|
||||
|
||||
.cmt_txtarea {
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
|
||||
}
|
||||
|
||||
#comments_box #respond {
|
||||
|
||||
padding-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
|
||||
}
|
||||
|
||||
.pagetitle {
|
||||
color: #65DA33;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#searchform {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.si {
|
||||
background-color: #FFFFEE;
|
||||
border: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
#rightcol #r_news, #rightcol #linksbro, #rightcol #quick_tags {
|
||||
margin-top: 30px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
#post_nav p {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
#post_nav {
|
||||
text-align: left;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
#post_nav a, .post_nav_2 p a {
|
||||
text-decoration: none;
|
||||
font-family: Verdana;
|
||||
font-size: 12px;
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
#post_nav a:hover, .post_nav_2 p a:hover {
|
||||
text-decoration: underline;
|
||||
color: #FF8000;
|
||||
}
|
||||
|
||||
#rightcol #about {
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
#rightcol #r_news input {
|
||||
color: #333333;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#header {
|
||||
height: 200px;
|
||||
width: 100%;
|
||||
background-image: url('images/header_bg.jpg');
|
||||
background-repeat: x-repeat;
|
||||
}
|
||||
|
||||
#header img {
|
||||
|
||||
float: right;
|
||||
margin-right: -3px;
|
||||
z-index: 100;
|
||||
|
||||
}
|
||||
|
||||
.tags {
|
||||
text-transform: lowercase;
|
||||
color: #333333;
|
||||
font-family: arial;
|
||||
font-size: 12px;
|
||||
border-top: 2px dotted #EEEEEE;
|
||||
width: 300px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 0px;
|
||||
margin-top: 0px;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.tags a {
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
.tags p {
|
||||
text-align: left;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
blockquote strong {
|
||||
font-family: verdana;
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
color: #FF0000;
|
||||
font-style: italic;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0px;
|
||||
background-color: #eeeeee;
|
||||
border: 2px solid #dddddd;
|
||||
padding: 24px;
|
||||
padding-top: 10px;
|
||||
padding-left: 60px;
|
||||
padding-bottom: 10px;
|
||||
font-size: 13px;
|
||||
color: #333333;
|
||||
margin-bottom: 30px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
|
||||
html>body #header img { margin-right: 0px; }
|
||||
|
||||
#subscribe h3 {
|
||||
color: #ff0000;
|
||||
margin-top: 30px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.post_actions a{
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
.post_actions {
|
||||
border-top: 4px solid #DDDDDD;
|
||||
border-bottom: 1px solid #EEEEEE;
|
||||
text-align: center;
|
||||
background-color: #FFFFDd;
|
||||
color: #dddddd;
|
||||
white-space: no-wrap;
|
||||
padding-left: 20px;
|
||||
padding-bottom: 5px;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
#subscribe td {
|
||||
color: #333333;
|
||||
font-size: 12px;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
|
||||
#subscribe input {
|
||||
font-size: 13px;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.post_content {
|
||||
font-size: 13px;
|
||||
margin-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
text-align: justify;
|
||||
font-family: verdana;
|
||||
}
|
||||
|
||||
.post_content p {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
padding-bottom: 20px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
z-index: 200;
|
||||
margin: 0px;
|
||||
position: absolute;
|
||||
float: left;
|
||||
text-transform: lowercase;
|
||||
padding: 0px;
|
||||
font-size: 45px;
|
||||
margin-top: 70px;
|
||||
margin-left: 40px;
|
||||
|
||||
}
|
||||
|
||||
#header h1 a {
|
||||
white-space: no-wrap;
|
||||
text-decoration: none;
|
||||
color: #FAFAFA;
|
||||
display: block
|
||||
}
|
||||
|
||||
#header h1 a:hover {
|
||||
color: #FAFAFA;
|
||||
border-bottom: 3px dotted #FAFAFA;
|
||||
}
|
||||
|
||||
html>body #header h1 { margin-left: 60px; }
|
||||
|
||||
body {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Grande', Sans-Serif, Verdana, Arial;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#leftcol {
|
||||
float: left;
|
||||
width: 200px;
|
||||
margin-left: 0px;
|
||||
margin-top: 17px;
|
||||
color: #000;
|
||||
padding: 3px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#leftcol .box_head h3 {
|
||||
text-transform: uppercase;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-family: georgia;
|
||||
font-size: 18px;
|
||||
color: #dddddd;
|
||||
border-top: 4px solid #dddddd;
|
||||
border-bottom: 4px solid #cccccc;
|
||||
padding-left: 10px;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
background-image: url('images/stripesbg.png');
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#leftcol .box_head input {
|
||||
text-transform: lowercase;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
#leftcol .box_head {
|
||||
margin-left: 7px;
|
||||
background-color: #ffefd4;
|
||||
border-bottom: 2px solid #eeeeee;
|
||||
padding-bottom: 20px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
#leftcol .box_head p a {
|
||||
color: #0a2d4d;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
border-bottom: 3px solid #fefefe;
|
||||
padding-top: 20px;
|
||||
text-transform: lowercase;
|
||||
padding-bottom: 20px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
#leftcol .box_head p a:hover {
|
||||
background-color: #fafafa;
|
||||
border-bottom: 3px solid #eeeeee;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#leftcol .box_head p {
|
||||
text-align: left;
|
||||
margin: 0px;
|
||||
width: 170px;
|
||||
padding-bottom: 0px;
|
||||
padding-top: 0px;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
#rightcol {
|
||||
position: absolute;
|
||||
left: 77%;
|
||||
top: 278px;
|
||||
border: 3px solid #eeeeee;
|
||||
width: 200px;
|
||||
z-index: 3;
|
||||
color: #333333;
|
||||
padding: 10px;
|
||||
text-transform: lowercase;
|
||||
|
||||
}
|
||||
|
||||
#rightcol p {
|
||||
padding: 0px;
|
||||
marging: 0px;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
#rightcol #about img, #rightcol #linksbro img {
|
||||
border: 5px solid #eeeeee;
|
||||
}
|
||||
|
||||
#rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags h3 {
|
||||
background-color: #fafafa;
|
||||
border: 1px dotted #e0e0e0;
|
||||
font-size: 14px;
|
||||
color: #104bbc;
|
||||
padding: 5px;
|
||||
padding-top: 10px;
|
||||
font-family: Arial;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
#rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p a {
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
#rightcol #about p, #rightcol #r_news p, #rightcol #linksbro p {
|
||||
font-size: 12px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#content_warp {
|
||||
margin: 20px 25% 0 215px;
|
||||
padding: 3px;
|
||||
color: #000;
|
||||
background-color: #ededed;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin: 5px;
|
||||
background-color: #FFFFFF;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
|
||||
#footer {
|
||||
width: 99%;
|
||||
margin-top: 30px;
|
||||
height: 98px;
|
||||
background-color: #101b1d;
|
||||
}
|
||||
|
||||
#footer td a {
|
||||
color: #FF8000;
|
||||
}
|
||||
|
||||
#footer td a img {
|
||||
border: 2px solid #108eed;
|
||||
}
|
||||
|
||||
#footer td p {
|
||||
font-family: Verdana;
|
||||
font-size: 10px;
|
||||
color: #c0c0c0;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
text-align: center;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.s_offer {
|
||||
color: #65DA33;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.post_box {
|
||||
text-transform: lowercase;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
#newsletter_box {
|
||||
text-transform: lowercase;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 30px;
|
||||
font-style: normal;
|
||||
background-color: #ffffff;
|
||||
border: 5px solid #dddddd;
|
||||
}
|
||||
|
||||
#newsletter_head {
|
||||
color: #EEEEEE;
|
||||
font-family: Georgia;
|
||||
background-image: url('images/stripesbg.png');
|
||||
padding: 10px;
|
||||
padding-left: 30px;
|
||||
border-bottom: 5px solid #dddddd;
|
||||
}
|
||||
|
||||
#newsletter_body {
|
||||
color: #333333;
|
||||
font-family: Verdana;
|
||||
text-align: justify;
|
||||
background-color: #FFFFFF;
|
||||
padding: 10px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.s_offer {
|
||||
color: #65DA33;
|
||||
font-size: 26px;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.post_title a {
|
||||
color: #EEEEEE;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.post_title a:hover {
|
||||
color: #c0c0c0;
|
||||
}
|
||||
|
||||
.post_title {
|
||||
background-image: url('images/stripe_post.png');
|
||||
text-transform: uppercase;
|
||||
font-size: 18px;
|
||||
font-family: georgia;
|
||||
padding: 10px;
|
||||
border-top: 4px solid #c0c0c0;
|
||||
margin: 0px;
|
||||
border-bottom: 2px solid #ffffdd;
|
||||
}
|
||||
|
||||
.post_det {
|
||||
text-transform: none;
|
||||
margin: 0px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
padding: 0px;
|
||||
padding-top: 5px;
|
||||
color: #999999;
|
||||
font-size: 10px;
|
||||
font-family: verdana;
|
||||
margin-bottom: 20px;
|
||||
background-color: #eeeeee;
|
||||
padding-bottom: 5px;
|
||||
padding-left: 10px;
|
||||
text-align: left;
|
||||
border-bottom: 2px solid #dddddd;
|
||||
}
|
||||
|
||||
.post_det a {
|
||||
color: #999999;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
|
||||
.subtle {
|
||||
text-transform: lowercase;
|
||||
font-size: 10px;
|
||||
font-family: verdana;
|
||||
color: #108eed;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
#top_menu #navlist, #top_menu #navlist li {
|
||||
padding:0px;
|
||||
margin: 0px;
|
||||
padding-top: 14px;
|
||||
text-transform: lowercase;
|
||||
padding-bottom: 17px;
|
||||
padding-left: 30px;
|
||||
border-left: 1px solid #65cdef;
|
||||
}
|
||||
|
||||
#top_menu #navlist, #top_menu #navlist li #first {
|
||||
|
||||
border-left: 0px;
|
||||
|
||||
}
|
||||
|
||||
#top_menu #navlist {
|
||||
padding-left: 30px;
|
||||
background-color: #1dabd9;
|
||||
border-top: 5px solid #0e96c3;
|
||||
border-bottom: 5px solid #0e96c3;
|
||||
}
|
||||
|
||||
#top_menu #navlist li {
|
||||
color: #444444;
|
||||
font-size: 10px;
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding-right: 30px;
|
||||
}
|
||||
|
||||
#top_menu #navlist li a {
|
||||
text-decoration: none;
|
||||
font-family: Verdana;
|
||||
color: #fafafa;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#top_menu #navlist li a:hover {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.post_content a {
|
||||
color: #108eed;
|
||||
}
|
||||
|
||||
ul#tagcloud { padding:0; margin:0; text-align:center; list-style:none; }
|
||||
ul#tagcloud li { display:inline; font-size:70%; color:#ccc; background: none; padding: 0;}
|
||||
ul#tagcloud li a, ul#tagcloud li a:link { text-decoration:none; }
|
||||
ul#tagcloud li a:hover { text-decoration:underline; }
|
||||
ul#tagcloud li.t1 a { color:#797979; font-size: 120%; }
|
||||
ul#tagcloud li.t2 a { color:#6d6d6d; font-size: 160%; }
|
||||
ul#tagcloud li.t3 a { color:#616161; font-size: 190%; }
|
||||
ul#tagcloud li.t4 a { color:#555555; font-size: 210%; }
|
||||
ul#tagcloud li.t5 a { color:#484848; font-size: 230%; }
|
||||
ul#tagcloud li.t6 a { color:#3c3c3c; font-size: 250%; }
|
||||
ul#tagcloud li.t7 a { color:#303030; font-size: 270%; }
|
||||
ul#tagcloud li.t8 a { color:#242424; font-size: 290%; }
|
||||
ul#tagcloud li.t9 a { color:#181818; font-size: 310%; }
|
||||
ul#tagcloud li.t10 a { color:#0c0c0c; font-size: 330%; }
|
79
min_extras/unit_tests/_test_files/css/vladmirated.min.css
vendored
Normal file
79
min_extras/unit_tests/_test_files/css/vladmirated.min.css
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
#comments_inviter
|
||||
#close_me{clear:both;text-align:center;border-top:1px solid #eee;padding-top:10px}#comments_inviter #close_me
|
||||
span{color:#108eed;cursor:pointer;font-weight:bold}#comments_inviter
|
||||
img{float:left;margin-right:3px;margin-bottom:10px}#comments_inviter{width:200px;background-color:#FFF;border:4px
|
||||
solid #eee;font-size:10px;font-family:verdana;padding:10px;color:#333}.one_com{background-color:#FAFAFA;padding:10px;margin-bottom:20px;border:1px
|
||||
solid #EEE}.one_com .com_says, .one_com
|
||||
.com_det{text-transform:lowercase;color:#333;padding:0px;font-family:verdana;margin:0px;font-size:13px;font-weight:bold}.flvPlayer{text-align:center;border:5px
|
||||
solid #ddd;width:320px}.one_com
|
||||
.com_det{font-size:10px;font-weight:normal;margin-bottom:20px;padding-bottom:10px;border-bottom:8px solid #eee}.one_com .com_det
|
||||
a{text-decoration:none}.one_com
|
||||
.com_txt{background-color:#fff;margin-bottom:10px;border-bottom:2px solid #eee}.one_com .com_txt
|
||||
p{font-family:verdana;font-size:13px;color:#777;margin:0px;padding:5px;padding-bottom:10px;text-transform:lowercase}.one_com .com_says
|
||||
a{color:#333}.one_com .com_det
|
||||
a{color:#333}.post_box
|
||||
.related_posts{}.post_box .related_posts
|
||||
p{padding:0px;margin:0px;padding-bottom:20px;padding-left:35px;font-family:verdana}.post_box .related_posts
|
||||
a{color:#108eed}.post_nav_2
|
||||
p{text-align:center;color:#ccc;font-family:verdana}.post_box .related_posts h3, #comments_box #respond, .comments_posted
|
||||
h3{padding:0px;margin:0px;font-size:18px;color:#FF8000;padding-top:30px;margin-bottom:20px;width:300px;border-bottom:5px solid #e0e0e0}.comments_posted{margin-bottom:50px}.comments_posted
|
||||
h3{padding:0px;margin:0px;margin-bottom:20px}.cmt_txtarea{width:300px;height:100px}#comments_box
|
||||
#respond{padding-top:0px;margin-bottom:0px}.pagetitle{color:#65DA33;text-align:center}#searchform{padding:0px;margin:0px}.si{background-color:#FFE;border:1px
|
||||
solid #e0e0e0}#rightcol #r_news, #rightcol #linksbro, #rightcol
|
||||
#quick_tags{margin-top:30px;padding-bottom:10px}#post_nav
|
||||
p{padding:0px;margin:0px;padding-bottom:5px}#post_nav{text-align:left;padding-bottom:15px}#post_nav a, .post_nav_2 p
|
||||
a{text-decoration:none;font-family:Verdana;font-size:12px;color:#108eed}#post_nav a:hover, .post_nav_2 p a:hover{text-decoration:underline;color:#FF8000}#rightcol
|
||||
#about{padding-bottom:10px}#rightcol #r_news
|
||||
input{color:#333;font-size:12px}#header{height:200px;width:100%;background-image:url('images/header_bg.jpg');background-repeat:x-repeat}#header
|
||||
img{float:right;margin-right: -3px;z-index:100}.tags{text-transform:lowercase;color:#333;font-family:arial;font-size:12px;border-top:2px dotted #EEE;width:300px;padding-top:20px;padding-bottom:0px;margin-top:0px;padding-left:20px;padding-right:20px}.tags
|
||||
a{color:#108eed}.tags
|
||||
p{text-align:left;margin:0px;padding:0px}blockquote
|
||||
strong{font-family:verdana;display:block;margin-top:10px;color:#F00;font-style:italic;text-align:right}blockquote{margin:0px;background-color:#eee;border:2px
|
||||
solid #ddd;padding:24px;padding-top:10px;padding-left:60px;padding-bottom:10px;font-size:13px;color:#333;margin-bottom:30px;margin-top:10px}html>body #header
|
||||
img{margin-right:0px}#subscribe
|
||||
h3{color:#f00;margin-top:30px;padding:20px}.post_actions
|
||||
a{color:#108eed}.post_actions{border-top:4px solid #DDD;border-bottom:1px solid #EEE;text-align:center;background-color:#FFD;color:#ddd;white-space:no-wrap;padding-left:20px;padding-bottom:5px;text-transform:capitalize}#subscribe
|
||||
td{color:#333;font-size:12px;text-transform:lowercase}#subscribe
|
||||
input{font-size:13px;color:#333}.post_content{font-size:13px;margin-top:10px;padding-bottom:10px;text-align:justify;font-family:verdana}.post_content
|
||||
p{margin:0px;padding:0px;padding-bottom:20px;line-height:20px}#header
|
||||
h1{z-index:200;margin:0px;position:absolute;float:left;text-transform:lowercase;padding:0px;font-size:45px;margin-top:70px;margin-left:40px}#header h1
|
||||
a{white-space:no-wrap;text-decoration:none;color:#FAFAFA;display:block}#header h1 a:hover{color:#FAFAFA;border-bottom:3px dotted #FAFAFA}html>body #header
|
||||
h1{margin-left:60px}body{margin:0px;padding:0px;height:100%;width:100%;font-family:'Lucida Sans Unicode','Lucida Grande',Sans-Serif,Verdana,Arial;font-size:12px}#leftcol{float:left;width:200px;margin-left:0px;margin-top:17px;color:#000;padding:3px;height:100%}#leftcol .box_head
|
||||
h3{text-transform:uppercase;padding:0px;margin:0px;font-family:georgia;font-size:18px;color:#ddd;border-top:4px solid #ddd;border-bottom:4px solid #ccc;padding-left:10px;padding-top:10px;padding-bottom:10px;background-image:url('images/stripesbg.png');margin-bottom:10px}#leftcol .box_head
|
||||
input{text-transform:lowercase;color:#333}#leftcol
|
||||
.box_head{margin-left:7px;background-color:#ffefd4;border-bottom:2px solid #eee;padding-bottom:20px;margin-bottom:30px}#leftcol .box_head p
|
||||
a{color:#0a2d4d;display:block;text-decoration:none;border-bottom:3px solid #fefefe;padding-top:20px;text-transform:lowercase;padding-bottom:20px;padding-left:5px;padding-right:5px}#leftcol .box_head p a:hover{background-color:#fafafa;border-bottom:3px solid #eee;color:#000}#leftcol .box_head
|
||||
p{text-align:left;margin:0px;width:170px;padding-bottom:0px;padding-top:0px;font-size:11px}#rightcol{position:absolute;left:77%;top:278px;border:3px
|
||||
solid #eee;width:200px;z-index:3;color:#333;padding:10px;text-transform:lowercase}#rightcol
|
||||
p{padding:0px;marging:0px;text-align:justify}#rightcol #about img, #rightcol #linksbro
|
||||
img{border:5px
|
||||
solid #eee}#rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags
|
||||
h3{background-color:#fafafa;border:1px
|
||||
dotted #e0e0e0;font-size:14px;color:#104bbc;padding:5px;padding-top:10px;font-family:Arial;padding-bottom:10px}#rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p
|
||||
a{color:#108eed}#rightcol #about p, #rightcol #r_news p, #rightcol #linksbro
|
||||
p{font-size:12px;text-align:left}#content_warp{margin:20px
|
||||
25% 0 215px;padding:3px;color:#000;background-color:#ededed}#content{margin:5px;background-color:#FFF;padding:10px}#footer{width:99%;margin-top:30px;height:98px;background-color:#101b1d}#footer td
|
||||
a{color:#FF8000}#footer td a
|
||||
img{border:2px
|
||||
solid #108eed}#footer td
|
||||
p{font-family:Verdana;font-size:10px;color:#c0c0c0;padding:0px;margin:0px;text-align:center;padding-bottom:10px}.s_offer{color:#65DA33;font-size:20px;font-weight:bold;font-style:normal}.post_box{text-transform:lowercase;margin-bottom:40px}#newsletter_box{text-transform:lowercase;margin-bottom:10px;margin-top:30px;font-style:normal;background-color:#fff;border:5px
|
||||
solid #ddd}#newsletter_head{color:#EEE;font-family:Georgia;background-image:url('images/stripesbg.png');padding:10px;padding-left:30px;border-bottom:5px solid #ddd}#newsletter_body{color:#333;font-family:Verdana;text-align:justify;background-color:#FFF;padding:10px;font-size:13px}.s_offer{color:#65DA33;font-size:26px;font-weight:bold;font-style:normal}.post_title
|
||||
a{color:#EEE;text-decoration:none}.post_title a:hover{color:#c0c0c0}.post_title{background-image:url('images/stripe_post.png');text-transform:uppercase;font-size:18px;font-family:georgia;padding:10px;border-top:4px solid #c0c0c0;margin:0px;border-bottom:2px solid #ffd}.post_det{text-transform:none;margin:0px;border-top:1px solid #f0f0f0;padding:0px;padding-top:5px;color:#999;font-size:10px;font-family:verdana;margin-bottom:20px;background-color:#eee;padding-bottom:5px;padding-left:10px;text-align:left;border-bottom:2px solid #ddd}.post_det
|
||||
a{color:#999;text-decoration:none}.subtle{text-transform:lowercase;font-size:10px;font-family:verdana;color:#108eed;text-align:justify}#top_menu #navlist, #top_menu #navlist
|
||||
li{padding:0px;margin:0px;padding-top:14px;text-transform:lowercase;padding-bottom:17px;padding-left:30px;border-left:1px solid #65cdef}#top_menu #navlist, #top_menu #navlist li
|
||||
#first{border-left:0px}#top_menu
|
||||
#navlist{padding-left:30px;background-color:#1dabd9;border-top:5px solid #0e96c3;border-bottom:5px solid #0e96c3}#top_menu #navlist
|
||||
li{color:#444;font-size:10px;display:inline;list-style-type:none;padding-right:30px}#top_menu #navlist li
|
||||
a{text-decoration:none;font-family:Verdana;color:#fafafa;font-size:12px;font-weight:bold}#top_menu #navlist li a:hover{color:#333}.post_content
|
||||
a{color:#108eed}ul#tagcloud{padding:0;margin:0;text-align:center;list-style:none}ul#tagcloud
|
||||
li{display:inline;font-size:70%;color:#ccc;background:none;padding:0}ul#tagcloud li a, ul#tagcloud li a:link{text-decoration:none}ul#tagcloud li a:hover{text-decoration:underline}ul#tagcloud li.t1
|
||||
a{color:#797979;font-size:120%}ul#tagcloud li.t2
|
||||
a{color:#6d6d6d;font-size:160%}ul#tagcloud li.t3
|
||||
a{color:#616161;font-size:190%}ul#tagcloud li.t4
|
||||
a{color:#555;font-size:210%}ul#tagcloud li.t5
|
||||
a{color:#484848;font-size:230%}ul#tagcloud li.t6
|
||||
a{color:#3c3c3c;font-size:250%}ul#tagcloud li.t7
|
||||
a{color:#303030;font-size:270%}ul#tagcloud li.t8
|
||||
a{color:#242424;font-size:290%}ul#tagcloud li.t9
|
||||
a{color:#181818;font-size:310%}ul#tagcloud li.t10
|
||||
a{color:#0c0c0c;font-size:330%}
|
@@ -0,0 +1,3 @@
|
||||
/* @import url('bad.css' ) bad; */
|
||||
adjacent2 foo { background: red url(/red.gif); }
|
||||
adjacent2 bar { background: url('../green.gif') }
|
@@ -0,0 +1 @@
|
||||
/* I should not be imported */
|
4
min_extras/unit_tests/_test_files/cssLinearizer/1/tv.css
Normal file
4
min_extras/unit_tests/_test_files/cssLinearizer/1/tv.css
Normal file
@@ -0,0 +1,4 @@
|
||||
@import url( adjacent.css ) all;
|
||||
@import '../input.css';
|
||||
tv foo { background: red url(/red.gif); }
|
||||
tv bar { background: url('../green.gif') }
|
@@ -0,0 +1,4 @@
|
||||
@import url(../css/styles.css);
|
||||
@import url(http://example.com/hello.css);
|
||||
adjacent foo { background: red url(/red.gif); }
|
||||
adjacent bar { background: url('../green.gif') }
|
@@ -0,0 +1,4 @@
|
||||
@import url( adjacent.css ) screen;
|
||||
@import "1/tv.css" tv, projection;
|
||||
input foo { background: red url(/red.gif); }
|
||||
input bar { background: url('../green.gif') }
|
48
min_extras/unit_tests/_test_files/cssLinearizer/output.css
Normal file
48
min_extras/unit_tests/_test_files/cssLinearizer/output.css
Normal file
@@ -0,0 +1,48 @@
|
||||
@media screen {
|
||||
/* some CSS to try to exercise things in general */
|
||||
|
||||
|
||||
|
||||
body, td, th {
|
||||
font-family: Verdana , "Bitstream Vera Sans" , sans-serif ;
|
||||
|
||||
font-size : 12px;
|
||||
}
|
||||
|
||||
.nav {
|
||||
margin-left: 20%;
|
||||
}
|
||||
#main-nav {
|
||||
background-color: red;
|
||||
border: 1px solid #00ff77;
|
||||
}
|
||||
|
||||
div#content
|
||||
h1 + p {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@media all and (min-width: 640px) {
|
||||
#media-queries-1 { background-color: #0f0; }
|
||||
}
|
||||
|
||||
@media screen and (max-width: 2000px) {
|
||||
#media-queries-2 { background-color: #0f0; }
|
||||
}
|
||||
|
||||
adjacent foo { background: red url(/red.gif); }
|
||||
adjacent bar { background: url('%TEST_FILES_URI%/cssLinearizer/../green.gif') }
|
||||
}
|
||||
@media tv,projection {
|
||||
/* */
|
||||
adjacent2 foo { background: red url(/red.gif); }
|
||||
adjacent2 bar { background: url('%TEST_FILES_URI%/cssLinearizer/1/../green.gif') }
|
||||
|
||||
tv foo { background: red url(/red.gif); }
|
||||
tv bar { background: url('%TEST_FILES_URI%/cssLinearizer/1/../green.gif') }
|
||||
}
|
||||
|
||||
|
||||
input foo { background: red url(/red.gif); }
|
||||
input bar { background: url('%TEST_FILES_URI%/cssLinearizer/../green.gif') }
|
95
min_extras/unit_tests/_test_files/html/before.html
Normal file
95
min_extras/unit_tests/_test_files/html/before.html
Normal file
@@ -0,0 +1,95 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||
<head>
|
||||
<!-- comments get removed -->
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="author" content="Dave Shea" />
|
||||
<!-- also whitespace around block or undisplayed elements -->
|
||||
<meta name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display" />
|
||||
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design." />
|
||||
<meta name="robots" content="all" />
|
||||
<title>css Zen Garden: The Beauty in CSS Design</title>
|
||||
|
||||
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
||||
<script type="text/javascript"><!--
|
||||
// js comment inside SCRIPT element
|
||||
var is = {
|
||||
ie: navigator.appName == 'Microsoft Internet Explorer',
|
||||
java: navigator.javaEnabled(),
|
||||
ns: navigator.appName == 'Netscape',
|
||||
ua: navigator.userAgent.toLowerCase(),
|
||||
version: parseFloat(navigator.appVersion.substr(21)) ||
|
||||
parseFloat(navigator.appVersion),
|
||||
win: navigator.platform == 'Win32'
|
||||
}
|
||||
is.mac = is.ua.indexOf('mac') >= 0;
|
||||
if (is.ua.indexOf('opera') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.opera = true;
|
||||
}
|
||||
if (is.ua.indexOf('gecko') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.gecko = true;
|
||||
}
|
||||
// --></script>
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
var i = 0;
|
||||
while (++i < 10)
|
||||
{
|
||||
// ...
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
/* <![CDATA[ */ i = 1; /* ]]> */
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
(i < 1); /* CDATA needed */
|
||||
</script>
|
||||
<!--[if IE 6]>
|
||||
<style type="text/css">
|
||||
/*! copyright: you'll need CDATA for this < & */
|
||||
body {background:white;}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<style type="text/css" title="currentStyle" media="screen">
|
||||
@import "/001/001.css";
|
||||
/*\*/ css hack {} /* */
|
||||
/* normal CSS comment */
|
||||
/*/*/ css hack {} /* */
|
||||
css hack {
|
||||
display/**/:/**/none;
|
||||
display:none;
|
||||
}
|
||||
</style>
|
||||
<link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico" />
|
||||
<link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="RSS"
|
||||
href="http://www.csszengarden.com/zengarden.xml" />
|
||||
</head>
|
||||
<body id="css-zen-garden">
|
||||
<div id="container">
|
||||
<div id="pageHeader">
|
||||
<h1><span>css Zen Garden</span></h1>
|
||||
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
||||
Design</span></h2>
|
||||
</div>
|
||||
<pre>
|
||||
White space is important here!
|
||||
</pre>
|
||||
<div id="quickSummary">
|
||||
<p class="p1"><span>A demonstration of what can be accomplished visually through <acronym title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p>
|
||||
<p class="p2"><span>Download the sample <a href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p>
|
||||
</div>
|
||||
<textarea name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||
|
||||
1234567890</textarea>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
43
min_extras/unit_tests/_test_files/html/before.min.html
Normal file
43
min_extras/unit_tests/_test_files/html/before.min.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html
|
||||
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" ><head><meta
|
||||
http-equiv="content-type" content="text/html; charset=iso-8859-1" /><meta
|
||||
name="author" content="Dave Shea" /><meta
|
||||
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display" /><meta
|
||||
name="description" content="A demonstration of what can be accomplished visually through CSS-based design." /><meta
|
||||
name="robots" content="all" /><title>css Zen Garden: The Beauty in CSS Design</title><script
|
||||
type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
|
||||
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
|
||||
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}</script><script
|
||||
type="text/javascript">/*<![CDATA[*/var i=0;while(++i<10)
|
||||
{}/*]]>*/</script><script
|
||||
type="text/javascript">i=1;</script><script
|
||||
type="text/javascript">/*<![CDATA[*/(i<1);/*]]>*/</script><!--[if IE 6]><style
|
||||
type="text/css">/*<![CDATA[*/
|
||||
/* copyright: you'll need CDATA for this < & */
|
||||
body{background:white}/*]]>*/</style><![endif]--><style
|
||||
type="text/css" title="currentStyle" media="screen">@import "/001/001.css";/*\*/css
|
||||
hack{}/**//*/*/css
|
||||
hack{}/**/css
|
||||
hack{display/**/:/**/none;display:none}</style><link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico" /><link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="RSS"
|
||||
href="http://www.csszengarden.com/zengarden.xml" /></head><body
|
||||
id="css-zen-garden"><div
|
||||
id="container"><div
|
||||
id="pageHeader"><h1><span>css Zen Garden</span></h1><h2><span>The Beauty of <acronym
|
||||
title="Cascading Style Sheets">CSS</acronym> Design</span></h2></div><pre>
|
||||
White space is important here!
|
||||
</pre><div
|
||||
id="quickSummary"><p
|
||||
class="p1"><span>A demonstration of what can be accomplished visually through <acronym
|
||||
title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p><p
|
||||
class="p2"><span>Download the sample <a
|
||||
href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a
|
||||
href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p></div><textarea
|
||||
name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||
|
||||
1234567890</textarea></div></body></html>
|
93
min_extras/unit_tests/_test_files/html/before2.html
Normal file
93
min_extras/unit_tests/_test_files/html/before2.html
Normal file
@@ -0,0 +1,93 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- comments get removed -->
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="author" content="Dave Shea">
|
||||
<!-- also whitespace around block or undisplayed elements -->
|
||||
<meta name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display">
|
||||
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design.">
|
||||
<meta name="robots" content="all">
|
||||
<title>css Zen Garden: The Beauty in CSS Design</title>
|
||||
|
||||
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
||||
<script type="text/javascript"><!--
|
||||
// js comment inside SCRIPT element
|
||||
var is = {
|
||||
ie: navigator.appName == 'Microsoft Internet Explorer',
|
||||
java: navigator.javaEnabled(),
|
||||
ns: navigator.appName == 'Netscape',
|
||||
ua: navigator.userAgent.toLowerCase(),
|
||||
version: parseFloat(navigator.appVersion.substr(21)) ||
|
||||
parseFloat(navigator.appVersion),
|
||||
win: navigator.platform == 'Win32'
|
||||
}
|
||||
is.mac = is.ua.indexOf('mac') >= 0;
|
||||
if (is.ua.indexOf('opera') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.opera = true;
|
||||
}
|
||||
if (is.ua.indexOf('gecko') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.gecko = true;
|
||||
}
|
||||
// --></script>
|
||||
<script type="text/javascript">
|
||||
var i = 0;
|
||||
while (++i < 10)
|
||||
{
|
||||
// ...
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
i = 1;
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
(i < 1);
|
||||
</script>
|
||||
<!--[if IE 6]>
|
||||
<style type="text/css">
|
||||
/*! copyright: you'll need CDATA for this < & */
|
||||
body {background:white;}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<style type="text/css" title="currentStyle" media="screen">
|
||||
@import "/001/001.css";
|
||||
/*\*/ css hack {} /* */
|
||||
/* normal CSS comment */
|
||||
/*/*/ css hack {} /* */
|
||||
css hack {
|
||||
display/**/:/**/none;
|
||||
display:none;
|
||||
}
|
||||
</style>
|
||||
<link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico">
|
||||
<link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="RSS"
|
||||
href="http://www.csszengarden.com/zengarden.xml">
|
||||
</head>
|
||||
<body id="css-zen-garden">
|
||||
<div id="container">
|
||||
<div id="pageHeader">
|
||||
<h1><span>css Zen Garden</span></h1>
|
||||
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
||||
Design</span></h2>
|
||||
</div>
|
||||
<pre>
|
||||
White space is important here!
|
||||
</pre>
|
||||
<div id="quickSummary">
|
||||
<p class="p1"><span>A demonstration of what can be accomplished visually through <acronym title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p>
|
||||
<p class="p2"><span>Download the sample <a href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p>
|
||||
</div>
|
||||
<textarea name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||
|
||||
1234567890</textarea>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
43
min_extras/unit_tests/_test_files/html/before2.min.html
Normal file
43
min_extras/unit_tests/_test_files/html/before2.min.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html
|
||||
lang="en"><head><meta
|
||||
http-equiv="content-type" content="text/html; charset=iso-8859-1"><meta
|
||||
name="author" content="Dave Shea"><meta
|
||||
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display"><meta
|
||||
name="description" content="A demonstration of what can be accomplished visually through CSS-based design."><meta
|
||||
name="robots" content="all"><title>css Zen Garden: The Beauty in CSS Design</title><script
|
||||
type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
|
||||
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
|
||||
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}</script><script
|
||||
type="text/javascript">var i=0;while(++i<10)
|
||||
{}</script><script
|
||||
type="text/javascript">i=1;</script><script
|
||||
type="text/javascript">(i<1);</script><!--[if IE 6]><style
|
||||
type="text/css">
|
||||
/* copyright: you'll need CDATA for this < & */
|
||||
body{background:white}</style><![endif]--><style
|
||||
type="text/css" title="currentStyle" media="screen">@import "/001/001.css";/*\*/css
|
||||
hack{}/**//*/*/css
|
||||
hack{}/**/css
|
||||
hack{display/**/:/**/none;display:none}</style><link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico"><link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="RSS"
|
||||
href="http://www.csszengarden.com/zengarden.xml"></head><body
|
||||
id="css-zen-garden"><div
|
||||
id="container"><div
|
||||
id="pageHeader"><h1><span>css Zen Garden</span></h1><h2><span>The Beauty of <acronym
|
||||
title="Cascading Style Sheets">CSS</acronym> Design</span></h2></div><pre>
|
||||
White space is important here!
|
||||
</pre><div
|
||||
id="quickSummary"><p
|
||||
class="p1"><span>A demonstration of what can be accomplished visually through <acronym
|
||||
title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p><p
|
||||
class="p2"><span>Download the sample <a
|
||||
href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a
|
||||
href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p></div><textarea
|
||||
name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||
|
||||
1234567890</textarea></div></body></html>
|
35
min_extras/unit_tests/_test_files/js/before.js
Normal file
35
min_extras/unit_tests/_test_files/js/before.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/*! is.js
|
||||
|
||||
(c) 2001 Douglas Crockford
|
||||
2001 June 3
|
||||
*/
|
||||
|
||||
// is
|
||||
|
||||
// The -is- object is used to identify the browser. Every browser edition
|
||||
// identifies itself, but there is no standard way of doing it, and some of
|
||||
// the identification is deceptive. This is because the authors of web
|
||||
// browsers are liars. For example, Microsoft's IE browsers claim to be
|
||||
// Mozilla 4. Netscape 6 claims to be version 5.
|
||||
|
||||
var is = {
|
||||
ie: navigator.appName == 'Microsoft Internet Explorer',
|
||||
java: navigator.javaEnabled(),
|
||||
ns: navigator.appName == 'Netscape',
|
||||
ua: navigator.userAgent.toLowerCase(),
|
||||
version: parseFloat(navigator.appVersion.substr(21)) ||
|
||||
parseFloat(navigator.appVersion),
|
||||
win: navigator.platform == 'Win32'
|
||||
}
|
||||
/*!*
|
||||
* preserve this comment, too
|
||||
*/
|
||||
is.mac = is.ua.indexOf('mac') >= 0;
|
||||
if (is.ua.indexOf('opera') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.opera = true;
|
||||
}
|
||||
if (is.ua.indexOf('gecko') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.gecko = true;
|
||||
}
|
12
min_extras/unit_tests/_test_files/js/before.min.js
vendored
Normal file
12
min_extras/unit_tests/_test_files/js/before.min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
/* is.js
|
||||
|
||||
(c) 2001 Douglas Crockford
|
||||
2001 June 3
|
||||
*/
|
||||
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
|
||||
/**
|
||||
* preserve this comment, too
|
||||
*/
|
||||
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
|
||||
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
|
3
min_extras/unit_tests/_test_files/js/before_noComments.min.js
vendored
Normal file
3
min_extras/unit_tests/_test_files/js/before_noComments.min.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
|
||||
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
|
||||
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
|
168
min_extras/unit_tests/_test_files/minify/QueryString.js
Normal file
168
min_extras/unit_tests/_test_files/minify/QueryString.js
Normal file
@@ -0,0 +1,168 @@
|
||||
var MrClay = window.MrClay || {};
|
||||
|
||||
/**
|
||||
* Simplified access to/manipulation of the query string
|
||||
*
|
||||
* Based on: http://adamv.com/dev/javascript/files/querystring.js
|
||||
* Design pattern: http://www.litotes.demon.co.uk/js_info/private_static.html#wConst
|
||||
*/
|
||||
MrClay.QueryString = function(){
|
||||
/**
|
||||
* @static
|
||||
* @private
|
||||
*/
|
||||
var parse = function(str) {
|
||||
var assignments = str.split('&')
|
||||
,obj = {}
|
||||
,propValue;
|
||||
for (var i = 0, l = assignments.length; i < l; ++i) {
|
||||
propValue = assignments[i].split('=');
|
||||
if (propValue.length > 2
|
||||
|| -1 != propValue[0].indexOf('+')
|
||||
|| propValue[0] == ''
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (propValue.length == 1) {
|
||||
propValue[1] = propValue[0];
|
||||
}
|
||||
obj[unescape(propValue[0])] = unescape(propValue[1].replace(/\+/g, ' '));
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor (MrClay.QueryString becomes this)
|
||||
*
|
||||
* @param mixed A window object, a query string, or empty (default current window)
|
||||
*/
|
||||
function construct_(spec) {
|
||||
spec = spec || window;
|
||||
if (typeof spec == 'object') {
|
||||
// get querystring from window
|
||||
this.window = spec;
|
||||
spec = spec.location.search.substr(1);
|
||||
} else {
|
||||
this.window = window;
|
||||
}
|
||||
this.vars = parse(spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload the window
|
||||
*
|
||||
* @static
|
||||
* @public
|
||||
* @param object vars Specify querystring vars only if you wish to replace them
|
||||
* @param object window_ window to be reloaded (current window by default)
|
||||
*/
|
||||
construct_.reload = function(vars, window_) {
|
||||
window_ = window_ || window;
|
||||
vars = vars || (new MrClay.QueryString(window_)).vars;
|
||||
var l = window_.location
|
||||
,currUrl = l.href
|
||||
,s = MrClay.QueryString.toString(vars)
|
||||
,newUrl = l.protocol + '//' + l.hostname + l.pathname
|
||||
+ (s ? '?' + s : '') + l.hash;
|
||||
if (currUrl == newUrl) {
|
||||
l.reload();
|
||||
} else {
|
||||
l.assign(newUrl);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the value of a querystring var
|
||||
*
|
||||
* @static
|
||||
* @public
|
||||
* @param string key
|
||||
* @param mixed default_ value to return if key not found
|
||||
* @param object window_ window to check (current window by default)
|
||||
* @return mixed
|
||||
*/
|
||||
construct_.get = function(key, default_, window_) {
|
||||
window_ = window_ || window;
|
||||
return (new MrClay.QueryString(window_)).get(key, default_);
|
||||
};
|
||||
|
||||
/**
|
||||
* Reload the page setting one or multiple querystring vars
|
||||
*
|
||||
* @static
|
||||
* @public
|
||||
* @param mixed key object of query vars/values, or a string key for a single
|
||||
* assignment
|
||||
* @param mixed null for multiple settings, the value to assign for single
|
||||
* @param object window_ window to reload (current window by default)
|
||||
*/
|
||||
construct_.set = function(key, value, window_) {
|
||||
window_ = window_ || window;
|
||||
(new MrClay.QueryString(window_)).set(key, value).reload();
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert an object of query vars/values to a querystring
|
||||
*
|
||||
* @static
|
||||
* @public
|
||||
* @param object query vars/values
|
||||
* @return string
|
||||
*/
|
||||
construct_.toString = function(vars) {
|
||||
var pieces = [];
|
||||
for (var prop in vars) {
|
||||
pieces.push(escape(prop) + '=' + escape(vars[prop]));
|
||||
}
|
||||
return pieces.join('&');
|
||||
};
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
construct_.prototype.reload = function() {
|
||||
MrClay.QueryString.reload(this.vars, this.window);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
construct_.prototype.get = function(key, default_) {
|
||||
if (typeof default_ == 'undefined') {
|
||||
default_ = null;
|
||||
}
|
||||
return (this.vars[key] == null)
|
||||
? default_
|
||||
: this.vars[key];
|
||||
};
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
construct_.prototype.set = function(key, value) {
|
||||
var obj = {};
|
||||
if (typeof key == 'string') {
|
||||
obj[key] = value;
|
||||
} else {
|
||||
obj = key;
|
||||
}
|
||||
for (var prop in obj) {
|
||||
if (obj[prop] == null) {
|
||||
delete this.vars[prop];
|
||||
} else {
|
||||
this.vars[prop] = obj[prop];
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
construct_.prototype.toString = function() {
|
||||
return QueryString.toString(this.vars);
|
||||
};
|
||||
|
||||
return construct_;
|
||||
}(); // define and execute
|
24
min_extras/unit_tests/_test_files/minify/email.js
Normal file
24
min_extras/unit_tests/_test_files/minify/email.js
Normal file
@@ -0,0 +1,24 @@
|
||||
// http://mrclay.org/
|
||||
(function(){
|
||||
var
|
||||
reMailto = /^mailto:my_name_is_(\S+)_and_the_domain_is_(\S+)$/,
|
||||
reRemoveTitleIf = /^my name is/,
|
||||
oo = window.onload,
|
||||
fixHrefs = function() {
|
||||
var i = 0, l, m;
|
||||
while (l = document.links[i++]) {
|
||||
// require phrase in href property
|
||||
if (m = l.href.match(reMailto)) {
|
||||
l.href = 'mailto:' + m[1] + '@' + m[2];
|
||||
if (reRemoveTitleIf.test(l.title)) {
|
||||
l.title = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// end var
|
||||
window.onload = function() {
|
||||
oo && oo();
|
||||
fixHrefs();
|
||||
};
|
||||
})();
|
245
min_extras/unit_tests/_test_files/minify/lines_output.js
Normal file
245
min_extras/unit_tests/_test_files/minify/lines_output.js
Normal file
@@ -0,0 +1,245 @@
|
||||
|
||||
/* email.js */
|
||||
|
||||
/* 1 */ // http://mrclay.org/
|
||||
/* 2 */ (function(){
|
||||
/* 3 */ var
|
||||
/* 4 */ reMailto = /^mailto:my_name_is_(\S+)_and_the_domain_is_(\S+)$/,
|
||||
/* 5 */ reRemoveTitleIf = /^my name is/,
|
||||
/* 6 */ oo = window.onload,
|
||||
/* 7 */ fixHrefs = function() {
|
||||
/* 8 */ var i = 0, l, m;
|
||||
/* 9 */ while (l = document.links[i++]) {
|
||||
/* 10 */ // require phrase in href property
|
||||
/* 11 */ if (m = l.href.match(reMailto)) {
|
||||
/* 12 */ l.href = 'mailto:' + m[1] + '@' + m[2];
|
||||
/* 13 */ if (reRemoveTitleIf.test(l.title)) {
|
||||
/* 14 */ l.title = '';
|
||||
/* 15 */ }
|
||||
/* 16 */ }
|
||||
/* 17 */ }
|
||||
/* 18 */ };
|
||||
/* 19 */ // end var
|
||||
/* 20 */ window.onload = function() {
|
||||
/* 21 */ oo && oo();
|
||||
/* 22 */ fixHrefs();
|
||||
/* 23 */ };
|
||||
/* 24 */ })();
|
||||
;
|
||||
/* QueryString.js */
|
||||
|
||||
/* 1 */ var MrClay = window.MrClay || {};
|
||||
/* 2 */
|
||||
/* 3 */ /**
|
||||
/* 4 *| * Simplified access to/manipulation of the query string
|
||||
/* 5 *| *
|
||||
/* 6 *| * Based on: http://adamv.com/dev/javascript/files/querystring.js
|
||||
/* 7 *| * Design pattern: http://www.litotes.demon.co.uk/js_info/private_static.html#wConst
|
||||
/* 8 *| */
|
||||
/* 9 */ MrClay.QueryString = function(){
|
||||
/* 10 */ /**
|
||||
/* 11 *| * @static
|
||||
/* 12 *| * @private
|
||||
/* 13 *| */
|
||||
/* 14 */ var parse = function(str) {
|
||||
/* 15 */ var assignments = str.split('&')
|
||||
/* 16 */ ,obj = {}
|
||||
/* 17 */ ,propValue;
|
||||
/* 18 */ for (var i = 0, l = assignments.length; i < l; ++i) {
|
||||
/* 19 */ propValue = assignments[i].split('=');
|
||||
/* 20 */ if (propValue.length > 2
|
||||
/* 21 */ || -1 != propValue[0].indexOf('+')
|
||||
/* 22 */ || propValue[0] == ''
|
||||
/* 23 */ ) {
|
||||
/* 24 */ continue;
|
||||
/* 25 */ }
|
||||
/* 26 */ if (propValue.length == 1) {
|
||||
/* 27 */ propValue[1] = propValue[0];
|
||||
/* 28 */ }
|
||||
/* 29 */ obj[unescape(propValue[0])] = unescape(propValue[1].replace(/\+/g, ' '));
|
||||
/* 30 */ }
|
||||
/* 31 */ return obj;
|
||||
/* 32 */ };
|
||||
/* 33 */
|
||||
/* 34 */ /**
|
||||
/* 35 *| * Constructor (MrClay.QueryString becomes this)
|
||||
/* 36 *| *
|
||||
/* 37 *| * @param mixed A window object, a query string, or empty (default current window)
|
||||
/* 38 *| */
|
||||
/* 39 */ function construct_(spec) {
|
||||
/* 40 */ spec = spec || window;
|
||||
/* 41 */ if (typeof spec == 'object') {
|
||||
/* 42 */ // get querystring from window
|
||||
/* 43 */ this.window = spec;
|
||||
/* 44 */ spec = spec.location.search.substr(1);
|
||||
/* 45 */ } else {
|
||||
/* 46 */ this.window = window;
|
||||
/* 47 */ }
|
||||
/* 48 */ this.vars = parse(spec);
|
||||
/* 49 */ }
|
||||
/* 50 */
|
||||
|
||||
/* QueryString.js */
|
||||
|
||||
/* 51 */ /**
|
||||
/* 52 *| * Reload the window
|
||||
/* 53 *| *
|
||||
/* 54 *| * @static
|
||||
/* 55 *| * @public
|
||||
/* 56 *| * @param object vars Specify querystring vars only if you wish to replace them
|
||||
/* 57 *| * @param object window_ window to be reloaded (current window by default)
|
||||
/* 58 *| */
|
||||
/* 59 */ construct_.reload = function(vars, window_) {
|
||||
/* 60 */ window_ = window_ || window;
|
||||
/* 61 */ vars = vars || (new MrClay.QueryString(window_)).vars;
|
||||
/* 62 */ var l = window_.location
|
||||
/* 63 */ ,currUrl = l.href
|
||||
/* 64 */ ,s = MrClay.QueryString.toString(vars)
|
||||
/* 65 */ ,newUrl = l.protocol + '//' + l.hostname + l.pathname
|
||||
/* 66 */ + (s ? '?' + s : '') + l.hash;
|
||||
/* 67 */ if (currUrl == newUrl) {
|
||||
/* 68 */ l.reload();
|
||||
/* 69 */ } else {
|
||||
/* 70 */ l.assign(newUrl);
|
||||
/* 71 */ }
|
||||
/* 72 */ };
|
||||
/* 73 */
|
||||
/* 74 */ /**
|
||||
/* 75 *| * Get the value of a querystring var
|
||||
/* 76 *| *
|
||||
/* 77 *| * @static
|
||||
/* 78 *| * @public
|
||||
/* 79 *| * @param string key
|
||||
/* 80 *| * @param mixed default_ value to return if key not found
|
||||
/* 81 *| * @param object window_ window to check (current window by default)
|
||||
/* 82 *| * @return mixed
|
||||
/* 83 *| */
|
||||
/* 84 */ construct_.get = function(key, default_, window_) {
|
||||
/* 85 */ window_ = window_ || window;
|
||||
/* 86 */ return (new MrClay.QueryString(window_)).get(key, default_);
|
||||
/* 87 */ };
|
||||
/* 88 */
|
||||
/* 89 */ /**
|
||||
/* 90 *| * Reload the page setting one or multiple querystring vars
|
||||
/* 91 *| *
|
||||
/* 92 *| * @static
|
||||
/* 93 *| * @public
|
||||
/* 94 *| * @param mixed key object of query vars/values, or a string key for a single
|
||||
/* 95 *| * assignment
|
||||
/* 96 *| * @param mixed null for multiple settings, the value to assign for single
|
||||
/* 97 *| * @param object window_ window to reload (current window by default)
|
||||
/* 98 *| */
|
||||
/* 99 */ construct_.set = function(key, value, window_) {
|
||||
/* 100 */ window_ = window_ || window;
|
||||
|
||||
/* QueryString.js */
|
||||
|
||||
/* 101 */ (new MrClay.QueryString(window_)).set(key, value).reload();
|
||||
/* 102 */ };
|
||||
/* 103 */
|
||||
/* 104 */ /**
|
||||
/* 105 *| * Convert an object of query vars/values to a querystring
|
||||
/* 106 *| *
|
||||
/* 107 *| * @static
|
||||
/* 108 *| * @public
|
||||
/* 109 *| * @param object query vars/values
|
||||
/* 110 *| * @return string
|
||||
/* 111 *| */
|
||||
/* 112 */ construct_.toString = function(vars) {
|
||||
/* 113 */ var pieces = [];
|
||||
/* 114 */ for (var prop in vars) {
|
||||
/* 115 */ pieces.push(escape(prop) + '=' + escape(vars[prop]));
|
||||
/* 116 */ }
|
||||
/* 117 */ return pieces.join('&');
|
||||
/* 118 */ };
|
||||
/* 119 */
|
||||
/* 120 */ /**
|
||||
/* 121 *| * @public
|
||||
/* 122 *| */
|
||||
/* 123 */ construct_.prototype.reload = function() {
|
||||
/* 124 */ MrClay.QueryString.reload(this.vars, this.window);
|
||||
/* 125 */ return this;
|
||||
/* 126 */ };
|
||||
/* 127 */
|
||||
/* 128 */ /**
|
||||
/* 129 *| * @public
|
||||
/* 130 *| */
|
||||
/* 131 */ construct_.prototype.get = function(key, default_) {
|
||||
/* 132 */ if (typeof default_ == 'undefined') {
|
||||
/* 133 */ default_ = null;
|
||||
/* 134 */ }
|
||||
/* 135 */ return (this.vars[key] == null)
|
||||
/* 136 */ ? default_
|
||||
/* 137 */ : this.vars[key];
|
||||
/* 138 */ };
|
||||
/* 139 */
|
||||
/* 140 */ /**
|
||||
/* 141 *| * @public
|
||||
/* 142 *| */
|
||||
/* 143 */ construct_.prototype.set = function(key, value) {
|
||||
/* 144 */ var obj = {};
|
||||
/* 145 */ if (typeof key == 'string') {
|
||||
/* 146 */ obj[key] = value;
|
||||
/* 147 */ } else {
|
||||
/* 148 */ obj = key;
|
||||
/* 149 */ }
|
||||
/* 150 */ for (var prop in obj) {
|
||||
|
||||
/* QueryString.js */
|
||||
|
||||
/* 151 */ if (obj[prop] == null) {
|
||||
/* 152 */ delete this.vars[prop];
|
||||
/* 153 */ } else {
|
||||
/* 154 */ this.vars[prop] = obj[prop];
|
||||
/* 155 */ }
|
||||
/* 156 */ }
|
||||
/* 157 */ return this;
|
||||
/* 158 */ };
|
||||
/* 159 */
|
||||
/* 160 */ /**
|
||||
/* 161 *| * @public
|
||||
/* 162 *| */
|
||||
/* 163 */ construct_.prototype.toString = function() {
|
||||
/* 164 */ return QueryString.toString(this.vars);
|
||||
/* 165 */ };
|
||||
/* 166 */
|
||||
/* 167 */ return construct_;
|
||||
/* 168 */ }(); // define and execute
|
||||
;
|
||||
/* before.js */
|
||||
|
||||
/* 1 */ /*! is.js
|
||||
/* 2 *|
|
||||
/* 3 *| (c) 2001 Douglas Crockford
|
||||
/* 4 *| 2001 June 3
|
||||
/* 5 *| */
|
||||
/* 6 */
|
||||
/* 7 */ // is
|
||||
/* 8 */
|
||||
/* 9 */ // The -is- object is used to identify the browser. Every browser edition
|
||||
/* 10 */ // identifies itself, but there is no standard way of doing it, and some of
|
||||
/* 11 */ // the identification is deceptive. This is because the authors of web
|
||||
/* 12 */ // browsers are liars. For example, Microsoft's IE browsers claim to be
|
||||
/* 13 */ // Mozilla 4. Netscape 6 claims to be version 5.
|
||||
/* 14 */
|
||||
/* 15 */ var is = {
|
||||
/* 16 */ ie: navigator.appName == 'Microsoft Internet Explorer',
|
||||
/* 17 */ java: navigator.javaEnabled(),
|
||||
/* 18 */ ns: navigator.appName == 'Netscape',
|
||||
/* 19 */ ua: navigator.userAgent.toLowerCase(),
|
||||
/* 20 */ version: parseFloat(navigator.appVersion.substr(21)) ||
|
||||
/* 21 */ parseFloat(navigator.appVersion),
|
||||
/* 22 */ win: navigator.platform == 'Win32'
|
||||
/* 23 */ }
|
||||
/* 24 */ /*!*
|
||||
/* 25 *| * preserve this comment, too
|
||||
/* 26 *| */
|
||||
/* 27 */ is.mac = is.ua.indexOf('mac') >= 0;
|
||||
/* 28 */ if (is.ua.indexOf('opera') >= 0) {
|
||||
/* 29 */ is.ie = is.ns = false;
|
||||
/* 30 */ is.opera = true;
|
||||
/* 31 */ }
|
||||
/* 32 */ if (is.ua.indexOf('gecko') >= 0) {
|
||||
/* 33 */ is.ie = is.ns = false;
|
||||
/* 34 */ is.gecko = true;
|
||||
/* 35 */ }
|
20
min_extras/unit_tests/_test_files/minify/minified.css
Normal file
20
min_extras/unit_tests/_test_files/minify/minified.css
Normal file
@@ -0,0 +1,20 @@
|
||||
@import url(%PATH_TO_WEB_TEST%/_test_files/css/more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px
|
||||
solid #0f7}div#content
|
||||
h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}}.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input
|
||||
input{font-size:10px}.hide{display:none}.form-input
|
||||
textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table
|
||||
td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0
|
||||
10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px
|
||||
solid #FFF;border-top-width:1px;height:0px}img{border:0
|
||||
solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px
|
||||
solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px
|
||||
solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(%PATH_TO_WEB_TEST%/_test_files/css/images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px
|
||||
solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px
|
||||
solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px
|
||||
solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0
|
||||
solid;font-size:10px}.imgfolder{margin:1px
|
||||
4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody
|
||||
a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px
|
||||
solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both}
|
12
min_extras/unit_tests/_test_files/minify/minified.js
Normal file
12
min_extras/unit_tests/_test_files/minify/minified.js
Normal file
@@ -0,0 +1,12 @@
|
||||
(function(){var
|
||||
reMailto=/^mailto:my_name_is_(\S+)_and_the_domain_is_(\S+)$/,reRemoveTitleIf=/^my name is/,oo=window.onload,fixHrefs=function(){var i=0,l,m;while(l=document.links[i++]){if(m=l.href.match(reMailto)){l.href='mailto:'+m[1]+'@'+m[2];if(reRemoveTitleIf.test(l.title)){l.title='';}}}};window.onload=function(){oo&&oo();fixHrefs();};})();;var MrClay=window.MrClay||{};MrClay.QueryString=function(){var parse=function(str){var assignments=str.split('&'),obj={},propValue;for(var i=0,l=assignments.length;i<l;++i){propValue=assignments[i].split('=');if(propValue.length>2||-1!=propValue[0].indexOf('+')||propValue[0]==''){continue;}
|
||||
if(propValue.length==1){propValue[1]=propValue[0];}
|
||||
obj[unescape(propValue[0])]=unescape(propValue[1].replace(/\+/g,' '));}
|
||||
return obj;};function construct_(spec){spec=spec||window;if(typeof spec=='object'){this.window=spec;spec=spec.location.search.substr(1);}else{this.window=window;}
|
||||
this.vars=parse(spec);}
|
||||
construct_.reload=function(vars,window_){window_=window_||window;vars=vars||(new MrClay.QueryString(window_)).vars;var l=window_.location,currUrl=l.href,s=MrClay.QueryString.toString(vars),newUrl=l.protocol+'//'+l.hostname+l.pathname
|
||||
+(s?'?'+s:'')+l.hash;if(currUrl==newUrl){l.reload();}else{l.assign(newUrl);}};construct_.get=function(key,default_,window_){window_=window_||window;return(new MrClay.QueryString(window_)).get(key,default_);};construct_.set=function(key,value,window_){window_=window_||window;(new MrClay.QueryString(window_)).set(key,value).reload();};construct_.toString=function(vars){var pieces=[];for(var prop in vars){pieces.push(escape(prop)+'='+escape(vars[prop]));}
|
||||
return pieces.join('&');};construct_.prototype.reload=function(){MrClay.QueryString.reload(this.vars,this.window);return this;};construct_.prototype.get=function(key,default_){if(typeof default_=='undefined'){default_=null;}
|
||||
return(this.vars[key]==null)?default_:this.vars[key];};construct_.prototype.set=function(key,value){var obj={};if(typeof key=='string'){obj[key]=value;}else{obj=key;}
|
||||
for(var prop in obj){if(obj[prop]==null){delete this.vars[prop];}else{this.vars[prop]=obj[prop];}}
|
||||
return this;};construct_.prototype.toString=function(){return QueryString.toString(this.vars);};return construct_;}();
|
42
min_extras/unit_tests/test_CSS.php
Normal file
42
min_extras/unit_tests/test_CSS.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'Minify/CSS.php';
|
||||
|
||||
function test_CSS()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$cssPath = dirname(__FILE__) . '/_test_files/css';
|
||||
|
||||
// build test file list
|
||||
$d = dir($cssPath);
|
||||
while (false !== ($entry = $d->read())) {
|
||||
if (preg_match('/^([\w\\-]+)\.css$/', $entry, $m)) {
|
||||
$list[] = $m[1];
|
||||
}
|
||||
}
|
||||
$d->close();
|
||||
|
||||
foreach ($list as $item) {
|
||||
|
||||
$options = ($item === 'paths')
|
||||
? array('prependRelativePath' => '../')
|
||||
: array();
|
||||
|
||||
$src = file_get_contents($cssPath . "/{$item}.css");
|
||||
$minExpected = file_get_contents($cssPath . "/{$item}.min.css");
|
||||
$minOutput = Minify_CSS::minify($src, $options);
|
||||
$passed = assertTrue($minExpected === $minOutput, 'Minify_CSS : ' . $item);
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n---Output: " .strlen($minOutput). " bytes\n\n{$minOutput}\n\n";
|
||||
if (!$passed) {
|
||||
echo "---Expected: " .strlen($minExpected). " bytes\n\n{$minExpected}\n\n";
|
||||
echo "---Source: " .strlen($src). " bytes\n\n{$src}\n\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_CSS();
|
59
min_extras/unit_tests/test_HTML.php
Normal file
59
min_extras/unit_tests/test_HTML.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'Minify/HTML.php';
|
||||
require_once 'Minify/CSS.php';
|
||||
require_once 'Minify/Javascript.php';
|
||||
|
||||
function test_HTML()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$src = file_get_contents($thisDir . '/_test_files/html/before.html');
|
||||
$minExpected = file_get_contents($thisDir . '/_test_files/html/before.min.html');
|
||||
|
||||
$time = microtime(true);
|
||||
$minOutput = Minify_HTML::minify($src, array(
|
||||
'cssMinifier' => array('Minify_CSS', 'minify')
|
||||
,'jsMinifier' => array('Minify_Javascript', 'minify')
|
||||
));
|
||||
$time = microtime(true) - $time;
|
||||
|
||||
$passed = assertTrue($minExpected === $minOutput, 'Minify_HTML');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
if ($passed) {
|
||||
echo "\n---Source: ", strlen($src), " bytes\n"
|
||||
, "---Output: ", strlen($minOutput), " bytes (", round($time * 1000), " ms)\n\n{$minOutput}\n\n\n";
|
||||
} else {
|
||||
echo "\n---Output: ", strlen($minOutput), " bytes (", round($time * 1000), " ms)\n\n{$minOutput}\n\n"
|
||||
, "---Expected: ", strlen($minExpected), " bytes\n\n{$minExpected}\n\n"
|
||||
, "---Source: ", strlen($src), " bytes\n\n{$src}\n\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
$src = file_get_contents($thisDir . '/_test_files/html/before2.html');
|
||||
$minExpected = file_get_contents($thisDir . '/_test_files/html/before2.min.html');
|
||||
|
||||
$time = microtime(true);
|
||||
$minOutput = Minify_HTML::minify($src, array(
|
||||
'cssMinifier' => array('Minify_CSS', 'minify')
|
||||
,'jsMinifier' => array('Minify_Javascript', 'minify')
|
||||
));
|
||||
$time = microtime(true) - $time;
|
||||
|
||||
$passed = assertTrue($minExpected === $minOutput, 'Minify_HTML');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
if ($passed) {
|
||||
echo "\n---Source: ", strlen($src), " bytes\n"
|
||||
, "---Output: ", strlen($minOutput), " bytes (", round($time * 1000), " ms)\n\n{$minOutput}\n\n\n";
|
||||
} else {
|
||||
echo "\n---Output: ", strlen($minOutput), " bytes (", round($time * 1000), " ms)\n\n{$minOutput}\n\n"
|
||||
, "---Expected: ", strlen($minExpected), " bytes\n\n{$minExpected}\n\n"
|
||||
, "---Source: ", strlen($src), " bytes\n\n{$src}\n\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_HTML();
|
117
min_extras/unit_tests/test_HTTP_ConditionalGet.php
Normal file
117
min_extras/unit_tests/test_HTTP_ConditionalGet.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'HTTP/ConditionalGet.php';
|
||||
|
||||
function test_HTTP_ConditionalGet()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$lmTime = time() - 900;
|
||||
$gmtTime = gmdate('D, d M Y H:i:s \G\M\T', $lmTime);
|
||||
|
||||
$tests = array(
|
||||
array(
|
||||
'desc' => 'client has valid If-Modified-Since'
|
||||
,'inm' => null
|
||||
,'ims' => $gmtTime
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'_responseCode' => 'HTTP/1.0 304 Not Modified'
|
||||
,'isValid' => true
|
||||
)
|
||||
)
|
||||
,array(
|
||||
'desc' => 'client has valid If-Modified-Since with trailing semicolon'
|
||||
,'inm' => null
|
||||
,'ims' => $gmtTime . ';'
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'_responseCode' => 'HTTP/1.0 304 Not Modified'
|
||||
,'isValid' => true
|
||||
)
|
||||
)
|
||||
,array(
|
||||
'desc' => 'client has valid ETag'
|
||||
,'inm' => "\"badEtagFoo\", \"{$lmTime}pri\""
|
||||
,'ims' => null
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'_responseCode' => 'HTTP/1.0 304 Not Modified'
|
||||
,'isValid' => true
|
||||
)
|
||||
)
|
||||
,array(
|
||||
'desc' => 'no conditional get'
|
||||
,'inm' => null
|
||||
,'ims' => null
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'isValid' => false
|
||||
)
|
||||
)
|
||||
,array(
|
||||
'desc' => 'client has invalid ETag'
|
||||
,'inm' => '"' . ($lmTime - 300) . 'pri"'
|
||||
,'ims' => null
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'isValid' => false
|
||||
)
|
||||
)
|
||||
,array(
|
||||
'desc' => 'client has invalid If-Modified-Since'
|
||||
,'inm' => null
|
||||
,'ims' => gmdate('D, d M Y H:i:s \G\M\T', $lmTime - 300)
|
||||
,'exp' => array(
|
||||
'Last-Modified' => $gmtTime
|
||||
,'ETag' => "\"{$lmTime}pri\""
|
||||
,'Cache-Control' => 'max-age=0, private, must-revalidate'
|
||||
,'isValid' => false
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($tests as $test) {
|
||||
// setup env
|
||||
if (null === $test['inm']) {
|
||||
unset($_SERVER['HTTP_IF_NONE_MATCH']);
|
||||
} else {
|
||||
$_SERVER['HTTP_IF_NONE_MATCH'] = get_magic_quotes_gpc()
|
||||
? addslashes($test['inm'])
|
||||
: $test['inm'];;
|
||||
}
|
||||
if (null === $test['ims']) {
|
||||
unset($_SERVER['HTTP_IF_MODIFIED_SINCE']);
|
||||
} else {
|
||||
$_SERVER['HTTP_IF_MODIFIED_SINCE'] = $test['ims'];
|
||||
}
|
||||
$exp = $test['exp'];
|
||||
|
||||
$cg = new HTTP_ConditionalGet(array(
|
||||
'lastModifiedTime' => $lmTime
|
||||
));
|
||||
$ret = $cg->getHeaders();
|
||||
$ret['isValid'] = $cg->cacheIsValid;
|
||||
|
||||
$passed = assertTrue($exp == $ret, 'HTTP_ConditionalGet : ' . $test['desc']);
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n--- INM = {$test['inm']} / IMS = {$test['ims']}\n";
|
||||
echo "Expected = " . preg_replace('/\\s+/', ' ', var_export($exp, 1)) . "\n";
|
||||
echo "Returned = " . preg_replace('/\\s+/', ' ', var_export($ret, 1)) . "\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_HTTP_ConditionalGet();
|
224
min_extras/unit_tests/test_HTTP_Encoder.php
Normal file
224
min_extras/unit_tests/test_HTTP_Encoder.php
Normal file
@@ -0,0 +1,224 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'HTTP/Encoder.php';
|
||||
|
||||
function test_HTTP_Encoder()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$methodTests = array(
|
||||
array(
|
||||
'ua' => 'Any browser'
|
||||
,'ae' => 'compress, x-gzip'
|
||||
,'exp' => array('gzip', 'x-gzip')
|
||||
,'desc' => 'recognize "x-gzip" as gzip'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Any browser'
|
||||
,'ae' => 'compress, x-gzip;q=0.5'
|
||||
,'exp' => array('gzip', 'x-gzip')
|
||||
,'desc' => 'gzip w/ non-zero q'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Any browser'
|
||||
,'ae' => 'compress, x-gzip;q=0'
|
||||
,'exp' => array('compress', 'compress')
|
||||
,'desc' => 'gzip w/ zero q'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'
|
||||
,'ae' => 'gzip, deflate'
|
||||
,'exp' => array('', '')
|
||||
,'desc' => 'IE6 w/o "enhanced security"'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)'
|
||||
,'ae' => 'gzip, deflate'
|
||||
,'exp' => array('deflate', 'deflate')
|
||||
,'desc' => 'IE6 w/ "enhanced security"'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.01)'
|
||||
,'ae' => 'gzip, deflate'
|
||||
,'exp' => array('', '')
|
||||
,'desc' => 'IE5.5'
|
||||
)
|
||||
,array(
|
||||
'ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.25'
|
||||
,'ae' => 'gzip,deflate'
|
||||
,'exp' => array('deflate', 'deflate')
|
||||
,'desc' => 'Opera identifying as IE6'
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($methodTests as $test) {
|
||||
$_SERVER['HTTP_USER_AGENT'] = $test['ua'];
|
||||
$_SERVER['HTTP_ACCEPT_ENCODING'] = $test['ae'];
|
||||
$exp = $test['exp'];
|
||||
$ret = HTTP_Encoder::getAcceptedEncoding();
|
||||
$passed = assertTrue($exp == $ret, 'HTTP_Encoder : ' . $test['desc']);
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n--- AE | UA = {$test['ae']} | {$test['ua']}\n";
|
||||
echo "Expected = " . preg_replace('/\\s+/', ' ', var_export($exp, 1)) . "\n";
|
||||
echo "Returned = " . preg_replace('/\\s+/', ' ', var_export($ret, 1)) . "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
$variedContent = file_get_contents($thisDir . '/_test_files/html/before.html')
|
||||
. file_get_contents($thisDir . '/_test_files/css/subsilver.css')
|
||||
. file_get_contents($thisDir . '/../examples/jquery-1.2.3.js');
|
||||
$variedLength = strlen($variedContent);
|
||||
|
||||
$encodingTests = array(
|
||||
array('method' => 'deflate', 'inv' => 'gzinflate', 'exp' => 32157)
|
||||
,array('method' => 'gzip', 'inv' => '_gzdecode', 'exp' => 32175)
|
||||
,array('method' => 'compress', 'inv' => 'gzuncompress', 'exp' => 32211)
|
||||
);
|
||||
|
||||
foreach ($encodingTests as $test) {
|
||||
$e = new HTTP_Encoder(array(
|
||||
'content' => $variedContent
|
||||
,'method' => $test['method']
|
||||
));
|
||||
$e->encode(9);
|
||||
$ret = strlen($e->getContent());
|
||||
|
||||
// test uncompression
|
||||
$roundTrip = @call_user_func($test['inv'], $e->getContent());
|
||||
$desc = "HTTP_Encoder : {$test['method']} : uncompress possible";
|
||||
$passed = assertTrue($variedContent == $roundTrip, $desc);
|
||||
|
||||
// test expected compressed size
|
||||
$desc = "HTTP_Encoder : {$test['method']} : compressed to "
|
||||
. sprintf('%4.2f%% of original', $ret/$variedLength*100);
|
||||
$passed = assertTrue(abs($ret - $test['exp']) < 100, $desc);
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n--- {$test['method']}: expected bytes: "
|
||||
, "{$test['exp']}. Returned: {$ret} "
|
||||
, "(off by ". abs($ret - $test['exp']) . " bytes)\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_HTTP_Encoder();
|
||||
|
||||
function _gzdecode($data)
|
||||
{
|
||||
$filename = $error = '';
|
||||
return _phpman_gzdecode($data, $filename, $error);
|
||||
}
|
||||
|
||||
// http://www.php.net/manual/en/function.gzdecode.php#82930
|
||||
function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
||||
{
|
||||
$len = strlen($data);
|
||||
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
|
||||
$error = "Not in GZIP format.";
|
||||
return null; // Not GZIP format (See RFC 1952)
|
||||
}
|
||||
$method = ord(substr($data,2,1)); // Compression method
|
||||
$flags = ord(substr($data,3,1)); // Flags
|
||||
if ($flags & 31 != $flags) {
|
||||
$error = "Reserved bits not allowed.";
|
||||
return null;
|
||||
}
|
||||
// NOTE: $mtime may be negative (PHP integer limitations)
|
||||
$mtime = unpack("V", substr($data,4,4));
|
||||
$mtime = $mtime[1];
|
||||
$xfl = substr($data,8,1);
|
||||
$os = substr($data,8,1);
|
||||
$headerlen = 10;
|
||||
$extralen = 0;
|
||||
$extra = "";
|
||||
if ($flags & 4) {
|
||||
// 2-byte length prefixed EXTRA data in header
|
||||
if ($len - $headerlen - 2 < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$extralen = unpack("v",substr($data,8,2));
|
||||
$extralen = $extralen[1];
|
||||
if ($len - $headerlen - 2 - $extralen < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$extra = substr($data,10,$extralen);
|
||||
$headerlen += 2 + $extralen;
|
||||
}
|
||||
$filenamelen = 0;
|
||||
$filename = "";
|
||||
if ($flags & 8) {
|
||||
// C-style string
|
||||
if ($len - $headerlen - 1 < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$filenamelen = strpos(substr($data,$headerlen),chr(0));
|
||||
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$filename = substr($data,$headerlen,$filenamelen);
|
||||
$headerlen += $filenamelen + 1;
|
||||
}
|
||||
$commentlen = 0;
|
||||
$comment = "";
|
||||
if ($flags & 16) {
|
||||
// C-style string COMMENT data in header
|
||||
if ($len - $headerlen - 1 < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$commentlen = strpos(substr($data,$headerlen),chr(0));
|
||||
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
|
||||
return false; // Invalid header format
|
||||
}
|
||||
$comment = substr($data,$headerlen,$commentlen);
|
||||
$headerlen += $commentlen + 1;
|
||||
}
|
||||
$headercrc = "";
|
||||
if ($flags & 2) {
|
||||
// 2-bytes (lowest order) of CRC32 on header present
|
||||
if ($len - $headerlen - 2 < 8) {
|
||||
return false; // invalid
|
||||
}
|
||||
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
|
||||
$headercrc = unpack("v", substr($data,$headerlen,2));
|
||||
$headercrc = $headercrc[1];
|
||||
if ($headercrc != $calccrc) {
|
||||
$error = "Header checksum failed.";
|
||||
return false; // Bad header CRC
|
||||
}
|
||||
$headerlen += 2;
|
||||
}
|
||||
// GZIP FOOTER
|
||||
$datacrc = unpack("V",substr($data,-8,4));
|
||||
$datacrc = sprintf('%u',$datacrc[1] & 0xFFFFFFFF);
|
||||
$isize = unpack("V",substr($data,-4));
|
||||
$isize = $isize[1];
|
||||
// decompression:
|
||||
$bodylen = $len-$headerlen-8;
|
||||
if ($bodylen < 1) {
|
||||
// IMPLEMENTATION BUG!
|
||||
return null;
|
||||
}
|
||||
$body = substr($data,$headerlen,$bodylen);
|
||||
$data = "";
|
||||
if ($bodylen > 0) {
|
||||
switch ($method) {
|
||||
case 8:
|
||||
// Currently the only supported compression method:
|
||||
$data = gzinflate($body,$maxlength);
|
||||
break;
|
||||
default:
|
||||
$error = "Unknown compression method.";
|
||||
return false;
|
||||
}
|
||||
} // zero-byte body content is allowed
|
||||
// Verifiy CRC32
|
||||
$crc = sprintf("%u",crc32($data));
|
||||
$crcOK = $crc == $datacrc;
|
||||
$lenOK = $isize == strlen($data);
|
||||
if (!$lenOK || !$crcOK) {
|
||||
$error = ( $lenOK ? '' : 'Length check FAILED. ') . ( $crcOK ? '' : 'Checksum FAILED.');
|
||||
return false;
|
||||
}
|
||||
return $data;
|
||||
}
|
37
min_extras/unit_tests/test_Javascript.php
Normal file
37
min_extras/unit_tests/test_Javascript.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'Minify/Javascript.php';
|
||||
|
||||
function test_Javascript()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$src = file_get_contents($thisDir . '/_test_files/js/before.js');
|
||||
$minExpected = file_get_contents($thisDir . '/_test_files/js/before.min.js');
|
||||
$minOutput = Minify_Javascript::minify($src);
|
||||
|
||||
$passed = assertTrue($minExpected == $minOutput, 'Minify_Javascript');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n---Output: " .strlen($minOutput). " bytes\n\n{$minOutput}\n\n";
|
||||
echo "---Expected: " .strlen($minExpected). " bytes\n\n{$minExpected}\n\n";
|
||||
echo "---Source: " .strlen($src). " bytes\n\n{$src}\n\n\n";
|
||||
}
|
||||
|
||||
//$src = file_get_contents($thisDir . '/_test_files/js/before.js');
|
||||
$minExpected = file_get_contents($thisDir . '/_test_files/js/before_noComments.min.js');
|
||||
$minOutput = Minify_Javascript::minify($src, array(
|
||||
'preserveComments' => false
|
||||
));
|
||||
|
||||
$passed = assertTrue($minExpected == $minOutput, 'Minify_Javascript');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n---Output: " .strlen($minOutput). " bytes\n\n{$minOutput}\n\n";
|
||||
echo "---Expected: " .strlen($minExpected). " bytes\n\n{$minExpected}\n\n";
|
||||
echo "---Source: " .strlen($src). " bytes\n\n{$src}\n\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
test_Javascript();
|
33
min_extras/unit_tests/test_Lines.php
Normal file
33
min_extras/unit_tests/test_Lines.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
require_once '_inc.php';
|
||||
require_once 'Minify.php';
|
||||
|
||||
function test_Lines()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$exp = file_get_contents("{$thisDir}/_test_files/minify/lines_output.js");
|
||||
|
||||
$ret = Minify::serve('Files', array(
|
||||
'debug' => true
|
||||
,'quiet' => true
|
||||
,'encodeOutput' => false
|
||||
,'files' => array(
|
||||
"{$thisDir}/_test_files/minify/email.js"
|
||||
,"{$thisDir}/_test_files/minify/QueryString.js"
|
||||
,"{$thisDir}/_test_files/js/before.js"
|
||||
)
|
||||
));
|
||||
|
||||
$passed = assertTrue($exp === $ret['content'], 'Minify_Lines');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n---Output: " .strlen($ret['content']). " bytes\n\n{$ret['content']}\n\n";
|
||||
if (!$passed) {
|
||||
echo "---Expected: " .strlen($exp). " bytes\n\n{$exp}\n\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_Lines();
|
143
min_extras/unit_tests/test_Minify.php
Normal file
143
min_extras/unit_tests/test_Minify.php
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
// currently these only test serve() when passed the 'quiet' options
|
||||
|
||||
require_once '_inc.php';
|
||||
require_once 'Minify.php';
|
||||
|
||||
function test_Minify()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$minifyTestPath = dirname(__FILE__) . '/_test_files/minify';
|
||||
$tomorrow = $_SERVER['REQUEST_TIME'] + 86400;
|
||||
$lastModified = $_SERVER['REQUEST_TIME'] - 86400;
|
||||
|
||||
// Test 304 response
|
||||
|
||||
// simulate conditional headers
|
||||
$_SERVER['HTTP_IF_NONE_MATCH'] = "\"{$lastModified}pub\"";
|
||||
$_SERVER['HTTP_IF_MODIFIED_SINCE'] = gmdate('D, d M Y H:i:s \G\M\T', $lastModified);
|
||||
|
||||
$expected = array (
|
||||
'success' => true
|
||||
,'statusCode' => 304
|
||||
,'content' => '',
|
||||
'headers' => array(
|
||||
'Expires' => gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + 1800),
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||
'ETag' => "\"{$lastModified}pub\"",
|
||||
'Cache-Control' => 'max-age=1800, public, must-revalidate',
|
||||
'_responseCode' => 'HTTP/1.0 304 Not Modified',
|
||||
)
|
||||
);
|
||||
$output = Minify::serve('Files', array(
|
||||
'files' => $thisDir . '/_test_files/css/styles.css' // controller casts to array
|
||||
,'quiet' => true
|
||||
,'lastModifiedTime' => $lastModified
|
||||
,'encodeOutput' => false
|
||||
));
|
||||
$passed = assertTrue($expected === $output, 'Minify : 304 response');
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||
if (! $passed) {
|
||||
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
assertTrue(
|
||||
//! class_exists('Cache_Lite_File', false)
|
||||
! class_exists('HTTP_Encoder', false)
|
||||
&& ! class_exists('Minify_CSS', false)
|
||||
&& ! class_exists('Minify_Cache', false)
|
||||
,'Encoder.php, CSS.php, Cache.php not loaded'
|
||||
);
|
||||
|
||||
// Test minifying JS and serving with Expires header
|
||||
|
||||
$content = preg_replace('/\\r\\n?/', "\n", file_get_contents($minifyTestPath . '/minified.js'));
|
||||
$lastModified = filemtime($minifyTestPath . '/minified.js');
|
||||
$expected = array(
|
||||
'success' => true
|
||||
,'statusCode' => 200
|
||||
// Minify_Javascript always converts to \n line endings
|
||||
,'content' => $content
|
||||
,'headers' => array (
|
||||
'Expires' => gmdate('D, d M Y H:i:s \G\M\T', $tomorrow),
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||
'ETag' => "\"{$lastModified}pub\"",
|
||||
'Cache-Control' => 'max-age=86400, public, must-revalidate',
|
||||
'Content-Length' => strlen($content),
|
||||
'Content-Type' => 'application/x-javascript; charset=UTF-8',
|
||||
)
|
||||
);
|
||||
$output = Minify::serve('Files', array(
|
||||
'files' => array(
|
||||
$minifyTestPath . '/email.js'
|
||||
,$minifyTestPath . '/QueryString.js'
|
||||
)
|
||||
,'quiet' => true
|
||||
,'maxAge' => 86400
|
||||
,'encodeOutput' => false
|
||||
));
|
||||
$passed = assertTrue($expected === $output, 'Minify : JS and Expires');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||
if (! $passed) {
|
||||
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Test minifying CSS and responding with Etag/Last-Modified
|
||||
|
||||
// needed to expose E_STRICT warning in Cache_Lite_File
|
||||
Minify::setCache();
|
||||
|
||||
// don't allow conditional headers
|
||||
unset($_SERVER['HTTP_IF_NONE_MATCH'], $_SERVER['HTTP_IF_MODIFIED_SINCE']);
|
||||
|
||||
$pathToWebTest = str_replace(
|
||||
DIRECTORY_SEPARATOR
|
||||
,'/'
|
||||
,substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT']))
|
||||
);
|
||||
$expectedContent = str_replace(
|
||||
'%PATH_TO_WEB_TEST%'
|
||||
,$pathToWebTest
|
||||
,file_get_contents($minifyTestPath . '/minified.css')
|
||||
);
|
||||
|
||||
$expected = array(
|
||||
'success' => true
|
||||
,'statusCode' => 200
|
||||
,'content' => $expectedContent
|
||||
,'headers' => array (
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||
'ETag' => "\"{$lastModified}pub\"",
|
||||
'Cache-Control' => 'max-age=0, public, must-revalidate',
|
||||
'Content-Length' => strlen($expectedContent),
|
||||
'Content-Type' => 'text/css; charset=UTF-8',
|
||||
)
|
||||
);
|
||||
$output = Minify::serve('Files', array(
|
||||
'files' => array(
|
||||
$thisDir . '/_test_files/css/styles.css'
|
||||
,$thisDir . '/_test_files/css/subsilver.css'
|
||||
)
|
||||
,'quiet' => true
|
||||
,'lastModifiedTime' => $lastModified
|
||||
,'encodeOutput' => false
|
||||
,'maxAge' => false
|
||||
));
|
||||
|
||||
$passed = assertTrue($expected === $output, 'Minify : CSS and Etag/Last-Modified');
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||
if (! $passed) {
|
||||
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test_Minify();
|
35
min_extras/unit_tests/test_Minify_Build.php
Normal file
35
min_extras/unit_tests/test_Minify_Build.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'Minify/Build.php';
|
||||
|
||||
function test_Minify_Build()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$file1 = $thisDir . '/_test_files/css/paths.css';
|
||||
$file2 = $thisDir . '/_test_files/css/styles.css';
|
||||
$maxTime = max(filemtime($file1), filemtime($file2));
|
||||
|
||||
$b = new Minify_Build($file1);
|
||||
assertTrue($b->lastModified == filemtime($file1)
|
||||
,'Minify_Build : single file path');
|
||||
|
||||
$b = new Minify_Build(array($file1, $file2));
|
||||
assertTrue($maxTime == $b->lastModified
|
||||
,'Minify_Build : multiple file paths');
|
||||
|
||||
$b = new Minify_Build(array(
|
||||
$file1
|
||||
,new Minify_Source(array('filepath' => $file2))
|
||||
));
|
||||
|
||||
assertTrue($maxTime == $b->lastModified
|
||||
,'Minify_Build : file path and a Minify_Source');
|
||||
assertTrue($b->uri('/path') == "/path?{$maxTime}"
|
||||
,'Minify_Build : uri() with no querystring');
|
||||
assertTrue($b->uri('/path?hello') == "/path?hello&{$maxTime}"
|
||||
,'Minify_Build : uri() with existing querystring');
|
||||
}
|
||||
|
||||
test_Minify_Build();
|
47
min_extras/unit_tests/test_Minify_CSS_Linearizer.php
Normal file
47
min_extras/unit_tests/test_Minify_CSS_Linearizer.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
require_once '_inc.php';
|
||||
|
||||
require_once 'Minify/CSS/Linearizer.php';
|
||||
|
||||
function test_Minify_CSS_Linearizer()
|
||||
{
|
||||
global $thisDir;
|
||||
|
||||
$linDir = $thisDir . '/_test_files/cssLinearizer';
|
||||
|
||||
$testFilesUri = substr(
|
||||
realpath($thisDir . '/_test_files')
|
||||
,strlen(realpath($_SERVER['DOCUMENT_ROOT']))
|
||||
);
|
||||
$testFilesUri = str_replace('\\', '/', $testFilesUri);
|
||||
|
||||
$expected = str_replace(
|
||||
'%TEST_FILES_URI%'
|
||||
,$testFilesUri
|
||||
,file_get_contents($linDir . '/output.css')
|
||||
);
|
||||
|
||||
$actual = Minify_CSS_Linearizer::linearize($linDir . '/input.css');
|
||||
|
||||
$passed = assertTrue($expected === $actual, 'Minify_CSS_Linearizer');
|
||||
|
||||
if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
|
||||
echo "\n---Output: " .strlen($actual). " bytes\n\n{$actual}\n\n";
|
||||
if (!$passed) {
|
||||
echo "---Expected: " .strlen($expected). " bytes\n\n{$expected}\n\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
$expectedIncludes = array (
|
||||
realpath($linDir . '/input.css')
|
||||
,realpath($linDir . '/adjacent.css')
|
||||
,realpath($linDir . '/../css/styles.css')
|
||||
,realpath($linDir . '/1/tv.css')
|
||||
,realpath($linDir . '/1/adjacent.css')
|
||||
);
|
||||
|
||||
$passed = assertTrue($expectedIncludes === Minify_CSS_Linearizer::$filesIncluded
|
||||
, 'Minify_CSS_Linearizer : included right files in right order');
|
||||
}
|
||||
|
||||
test_Minify_CSS_Linearizer();
|
10
min_extras/unit_tests/test_all.php
Normal file
10
min_extras/unit_tests/test_all.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
require 'test_Minify.php';
|
||||
require 'test_Javascript.php';
|
||||
require 'test_CSS.php';
|
||||
require 'test_Lines.php';
|
||||
require 'test_HTML.php';
|
||||
require 'test_Minify_Build.php';
|
||||
require 'test_HTTP_Encoder.php';
|
||||
require 'test_HTTP_ConditionalGet.php';
|
Reference in New Issue
Block a user