Merge github.com:web2py/web2py

This commit is contained in:
Michele Comitini committed 2012-10-10 21:21:04 +02:00
commit 8d40ec9c1d
18 files changed
+373 -195

No files matched your search

+1 -1
View File
@@ -1 +1 @@
Version 2.1.0 (2012-10-08 22:09:18) dev
Version 2.1.0 (2012-10-10 12:20:21) dev
+1 -1
View File
@@ -39,7 +39,7 @@ def deploy():
form = SQLFORM.factory(
Field('appcfg',default=GAE_APPCFG,label=T('Path to appcfg.py'),
requires=EXISTS(error_message=T('file not found'))),
Field('google_application_id',requires=IS_ALPHANUMERIC(),label=T('Google Application Id')),
Field('google_application_id',requires=IS_MATCH('[\w\-]+'),label=T('Google Application Id')),
Field('applications','list:string',
requires=IS_IN_SET(apps,multiple=True),
label=T('web2py apps to deploy')),
@@ -1,13 +0,0 @@
/* from http://code.google.com/p/zen-coding/ MIT license */
var zen_editor=(function(){var b={"variables":{"lang":"en","locale":"en-US","charset":"UTF-8","indentation":"\t","newline":"\n","nl":"\n"},"css":{"filters":"html,css","snippets":{"@i":"@import url(|);","@m":"@media print {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","!":"!important","pos":"position:|;","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;","t":"top:|;","t:a":"top:auto;","r":"right:|;","r:a":"right:auto;","b":"bottom:|;","b:a":"bottom:auto;","brad":"-webkit-border-radius: ${1:radius};\n-moz-border-radius: $1;\n-ms-border-radius: $1;\nborder-radius: $1;","bsha":"-webkit-box-shadow: ${1:hoff} ${2:voff} ${3:blur} ${4:rgba(0,0,0,0.5)};\n-moz-box-shadow: $1 $2 $3 $4;\n-ms-box-shadow: $1 $2 $3 $4;\nbox-shadow: $1 $2 $3 $4;","l":"left:|;","l:a":"left:auto;","z":"z-index:|;","z:a":"z-index:auto;","fl":"float:|;","fl:n":"float:none;","fl:l":"float:left;","fl:r":"float:right;","cl":"clear:|;","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;","d":"display:|;","d:n":"display:none;","d:b":"display:block;","d:i":"display:inline;","d:ib":"display:inline-block;","d:li":"display:list-item;","d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;","d:rb":"display:ruby;","d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;","d:rbtg":"display:ruby-text-group;","v":"visibility:|;","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;","ov":"overflow:|;","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;","ovx":"overflow-x:|;","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;","ovy":"overflow-y:|;","ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;","ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;","ovs":"overflow-style:|;","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;","zoo":"zoom:1;","cp":"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(|);","bxz":"box-sizing:|;","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;","bxsh":"box-shadow:|;","bxsh:n":"box-shadow:none;","bxsh:w":"-webkit-box-shadow:0 0 0 #000;","bxsh:m":"-moz-box-shadow:0 0 0 0 #000;","m":"margin:|;","m:a":"margin:auto;","m:0":"margin:0;","m:2":"margin:0 0;","m:3":"margin:0 0 0;","m:4":"margin:0 0 0 0;","mt":"margin-top:|;","mt:a":"margin-top:auto;","mr":"margin-right:|;","mr:a":"margin-right:auto;","mb":"margin-bottom:|;","mb:a":"margin-bottom:auto;","ml":"margin-left:|;","ml:a":"margin-left:auto;","p":"padding:|;","p:0":"padding:0;","p:2":"padding:0 0;","p:3":"padding:0 0 0;","p:4":"padding:0 0 0 0;","pt":"padding-top:|;","pr":"padding-right:|;","pb":"padding-bottom:|;","pl":"padding-left:|;","w":"width:|;","w:a":"width:auto;","h":"height:|;","h:a":"height:auto;","maw":"max-width:|;","maw:n":"max-width:none;","mah":"max-height:|;","mah:n":"max-height:none;","miw":"min-width:|;","mih":"min-height:|;","o":"outline:|;","o:n":"outline:none;","oo":"outline-offset:|;","ow":"outline-width:|;","os":"outline-style:|;","oc":"outline-color:#000;","oc:i":"outline-color:invert;","bd":"border:|;","bd+":"border:1px solid #000;","bd:n":"border:none;","bdbk":"border-break:|;","bdbk:c":"border-break:close;","bdcl":"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;","bdc":"border-color:#000;","bdi":"border-image:url(|);","bdi:n":"border-image:none;","bdi:w":"-webkit-border-image:url(|) 0 0 0 0 stretch stretch;","bdi:m":"-moz-border-image:url(|) 0 0 0 0 stretch stretch;","bdti":"border-top-image:url(|);","bdti:n":"border-top-image:none;","bdri":"border-right-image:url(|);","bdri:n":"border-right-image:none;","bdbi":"border-bottom-image:url(|);","bdbi:n":"border-bottom-image:none;","bdli":"border-left-image:url(|);","bdli:n":"border-left-image:none;","bdci":"border-corner-image:url(|);","bdci:n":"border-corner-image:none;","bdci:c":"border-corner-image:continue;","bdtli":"border-top-left-image:url(|);","bdtli:n":"border-top-left-image:none;","bdtli:c":"border-top-left-image:continue;","bdtri":"border-top-right-image:url(|);","bdtri:n":"border-top-right-image:none;","bdtri:c":"border-top-right-image:continue;","bdbri":"border-bottom-right-image:url(|);","bdbri:n":"border-bottom-right-image:none;","bdbri:c":"border-bottom-right-image:continue;","bdbli":"border-bottom-left-image:url(|);","bdbli:n":"border-bottom-left-image:none;","bdbli:c":"border-bottom-left-image:contLine truncated
var K=(function(){var ad="zen-tag",Y="zen-expando",ah="zen-reference",ab="system",af="user",X=/^<(\w+\:?[\w\-]*)((?:\s+[\w\:\-]+\s*=\s*(['"]).*?\3)*)\s*(\/?)>/,ac=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,ai={},Z={};function ae(al){return(al||"").replace(/^\s+|\s+$/g,"");}function ak(al){return al&&al.__zen_parsed__;}function S(al){al.__zen_parsed__=true;}function T(al){return al==ab?ai:Z;}function ag(ao){var an={},al=ao.split(",");for(var am=0;am<al.length;am++){an[al[am]]=true;}return an;}function U(am,ao,al){var av=T(am),aw=[],an;if(av&&ao in av){an=av[ao];if(al in an){aw.push(an[al]);}}var at;if(an&&"extends" in an){at=an;}else{if(am==af&&ao in ai&&"extends" in ai[ao]){at=ai[ao];}}if(at){if(!ak(at["extends"])){var ap=at["extends"].split(",");for(var aq=0;aq<ap.length;aq++){ap[aq]=ae(ap[aq]);}at["extends"]=ap;S(at["extends"]);}for(var aq=0;aq<at["extends"].length;aq++){var au=at["extends"][aq];if(av[au]&&av[au][al]){aw.push(av[au][al]);}}}return aw;}function V(ao,al,am){var an=U(ao,al,am);return an[0];}function aj(an,ao,am,au){var al=U(an,ao,am),av=null,aq;for(var ap=0,ar=al.length;ap<ar;ap++){aq=al[ap];if(au in aq){if(am=="abbreviations"&&!ak(aq[au])){var at=aq[au];aq[au]=e(au,at);aq[au].__ref=at;S(aq[au]);}av=aq[au];break;}}return av;}function R(am,al,an){return{type:am,key:al,value:an};}function W(al,am){return R(Y,al,am);}function aa(ap,aq,ao,an){var am={name:aq,is_empty:!!an};if(ao){var al;am.attributes=[];while(al=ac.exec(ao)){am.attributes.push({name:al[1],value:al[3]});}}return R(ad,ap,am);}function e(am,an){am=ae(am);var al;if(am.substr(-1)=="+"){return W(am,an);}else{if(al=X.exec(an)){return aa(am,al[1],al[2],al[4]=="/");}else{return R(ah,am,an);}}}return{setVocabulary:function(am,al){if(al==ab){ai=am;}else{Z=am;}},getVocabulary:T,getResource:function(al,am,an){return aj(af,al,am,an)||aj(ab,al,am,an);},getAbbreviation:function(am,al){return this.getResource(am,"abbreviations",al)||this.getResource(am,"abbreviations",al.replace(/\-/g,":"));},getSnippet:function(am,al){return this.getResource(am,"snippets",al)||this.getResource(am,"snippets",al.replace(/\-/g,":"));},getVariable:function(al){return V(af,"variables",al)||V(ab,"variables",al);},getSubset:function(al,am){return V(af,al,am)||V(ab,al,am);},isItemInCollection:function(al,an,am){return am in this.getElementsCollection(T(af)[al],an)||am in this.getElementsCollection(T(ab)[al],an);},getElementsCollection:function(an,am){if(an&&an.element_types){var al=an.element_types;if(!ak(al)){for(var ao in al){al[ao]=ag(al[ao]);}S(al);}return al[am]||{};}else{return{};}},hasSyntax:function(al){return al in T(af)||al in T(ab);}};})();try{K.setVocabulary(b,"system");K.setVocabulary(my_zen_settings,"user");}catch(N){}var F=(function(){var T=/^[\w\d\-_\$\:@!]+\+?$/i;function Y(aa){this.abbreviation="";this.parent=null;this.children=[];this.count=1;this.name=null;this.text=null;this.attributes=[];this.is_repeating=false;this.has_implict_name=false;}Y.prototype={addChild:function(aa){aa=aa||new Y;aa.parent=this;this.children.push(aa);return aa;},replace:function(ad){if(this.parent){var ac=this.parent.children;for(var ab=0,aa=ac.length;ab<aa;ab++){if(ac[ab]===this){ac[ab]=ad;this.parent=null;return;}}}},setAbbreviation:function(ad){this.abbreviation=ad;var aa=ad.match(/\*(\d+)?$/);if(aa){this.count=parseInt(aa[1]||1,10);this.is_repeating=!aa[1];ad=ad.substr(0,ad.length-aa[0].length);}if(ad){var ae=X(ad);var ac=ae[0];if(ae.length==2){this.text=ae[1];}if(ac){var ab=Z(ac);this.name=ab[0]||"div";this.has_implict_name=!ab[0];this.attributes=ab[1];}}if(this.name&&!T.test(this.name)){throw new Error("InvalidAbbreviation");}},getAbbreviation:function(){return this.expr;},toString:function(af){af=af||0;var ac="(empty)";if(this.abbreviation){ac="";if(this.name){ac=this.name;}if(this.text!==null){ac+=(ac?" ":"")+'{text: "'+this.text+'"}';}if(this.attributes.length){var ad=[];for(var ae=0,ab=this.attributes.length;ae<ab;ae++){ad.push(this.attributes[ae].name+'="'+this.attributes[ae].value+'"');}ac+=" ["+ad.join(", ")+"]";}}var aa=I.repeatString("-",af)+ac+"\n";for(var ae=0,ab=this.children.length;ae<ab;ae++){aa+=this.children[ae].toString(af+1);}return aa;},hasEmptyChildren:function(){for(var ab=0,aa=this.children.length;ab<aa;ab++){if(this.children[ab].isEmpty()){return true;}}return false;},isEmpty:function(){return !this.abbreviation;},isTextNode:function(){return !this.name&&this.text;}};function e(aa){if(typeof(aa)=="string"){aa=aa.charCodeAt(0);}return(aa&&aa>47&&aa<58);}function W(ae){for(var ad=ae.children.length-1;ad>=0;ad--){var af=ae.children[ad];if(af.isEmpty()){var ab=[ad,1];for(var aa=0,ac=af.children.length;aa<ac;aa++){ab.push(af.children[aa]);}Array.prototype.splice.apply(ae.children,ab);}}return ae;}function S(aa){return(aa||"").replace(/^\s+|\s+$/g,"");}function R(ab,ac){var aa=ac.substring(ab).match(/^[\w\-:\$]+/);return aa?aa[0]:"";}function V(ae){ae=S(ae);var ag=100,ac=/^(["'])((?:(?!\1)[^\\]|\\.)*)\1/,ai=[],af;while(ae&&ag--){var ah=R(0,ae);af=null;if(ah){aLine truncated
var aa=ae.charAt(ah.length);switch(aa){case"=":var ab=ae.charAt(ah.length+1);if(ab=='"'||ab=="'"){var ad=ae.substring(ah.length+1).match(ac);if(ad){af.value=ad[2];ae=S(ae.substring(ah.length+ad[0].length+1));}else{ae="";}}else{var ad=ae.substring(ah.length+1).match(/(.+?)(\s|$)/);if(ad){af.value=ad[1];ae=S(ae.substring(ah.length+ad[1].length+1));}else{ae="";}}break;default:ae=S(ae.substring(ah.length));break;}}else{break;}if(af){ai.push(af);}}return ai;}function Z(aj){var an=[],ab="",ai=true,af,ak={"#":"id",".":"class"};var ah=0,al=aj.length,ac;while(ah<al){var aa=aj.charAt(ah);switch(aa){case"#":ac=R(ah,aj.substring(1));an.push({name:ak[aa],value:ac});ah+=ac.length+1;ai=false;break;case".":ac=R(ah,aj.substring(1));if(!af){af={name:ak[aa],value:""};an.push(af);}af.value+=((af.value)?" ":"")+ac;ah+=ac.length+1;ai=false;break;case"[":var ad=aj.indexOf("]",ah);if(ad==-1){ah=aj.length;}else{var am=V(aj.substring(ah+1,ad));for(var ae=0,ag=am.length;ae<ag;ae++){an.push(am[ae]);}ah=ad;}ai=false;break;default:if(ai){ab+=aa;}ah++;}}return[ab,an];}function U(ac){while(ac.hasEmptyChildren()){W(ac);}for(var ab=0,aa=ac.children.length;ab<aa;ab++){U(ac.children[ab]);}return ac;}function X(ag){if(ag.indexOf("{")==-1){return[ag];}var af=0,ah=0,ac=[],ad=0,ab=ag.length,ae;while(ad<ab){ae=ag.charAt(ad);switch(ae){case"[":if(!ah){af++;}break;case"]":if(!ah){af--;}break;case"{":if(!af){ah++;ac.push(ad);}break;case"}":if(!af){ah--;var aa=ac.pop();if(ah===0){return[ag.substring(0,aa),ag.substring(aa+1,ad)];}}break;}ad++;}return[ag];}return{parse:function(ao){var ak=new Y,ac=ak.addChild(),ag=0,am=ao.length,aj=0,ad=0,ah=0,ai=[ak],ab,al,ae="";ai.last=function(){return this[this.length-1];};var an=function(){if(ae){ac.setAbbreviation(ae);}ae="";};while(ag<am){ab=ao.charAt(ag);al=ag?ao.charAt(ag-1):"";switch(ab){case"{":if(!ad){aj++;}ae+=ab;break;case"}":if(!ad){aj--;}ae+=ab;break;case"[":if(!aj){ad++;}ae+=ab;break;case"]":if(!aj){ad--;}ae+=ab;break;case"(":if(!aj&&!ad){an();if(al!="+"&&al!=">"){ac=ac.parent.addChild();}ai.push(ac);ac=ac.addChild();}else{ae+=ab;}break;case")":if(!aj&&!ad){an();ac=ai.pop();if(ag<am-1&&ao.charAt(ag+1)=="*"){var aa="",ap;for(var af=ag+2;af<am;af++){ap=ao.charAt(af);if(e(ap)){aa+=ap;}else{break;}}ag+=aa.length+1;aa=parseInt(aa||1,10);while(1<aa--){ac.parent.addChild(ac);}}}else{ae+=ab;}break;case"+":if(!aj&&!ad&&ag!=am-1){an();ac=ac.parent.addChild();}else{ae+=ab;}break;case">":if(!aj&&!ad){an();ac=ac.addChild();}else{ae+=ab;}break;default:ae+=ab;}ag++;}an();return U(ak);},TreeNode:Y,optimizeTree:U};})();var I=(function(){var R=/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,au="{%::zen-caret::%}",T="\n",ae={},aD="html",az={},V={tag_case:"lower",attr_case:"lower",attr_quotes:"double",tag_nl:"decide",place_cursor:true,indent:true,inline_break:3,self_closing_tag:"xhtml",filters:""};function ah(aE){if(typeof(aE)=="string"){aE=aE.charCodeAt(0);}return(aE&&aE>47&&aE<58);}function ax(aG){aG=String(aG);var aF=aG.charCodeAt(0),aE="#.>+*:$-_!@[]()|";return(aF>64&&aF<91)||(aF>96&&aF<123)||ah(aG)||aE.indexOf(aG)!=-1;}function ak(){return I.getNewline();}function aA(){return(typeof(au)!="string")?au():au;}function W(aI,aH){var aF=ak();var aE=(aI||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,aF).split(aF);if(aH){for(var aG=aE.length;aG>=0;aG--){if(!e(aE[aG])){aE.splice(aG,1);}}}return aE;}function e(aE){return(aE||"").replace(/^\s+|\s+$/g,"");}function ai(aF){var aE={};for(var aG in V){aE[aG]=(aG in aF)?aF[aG]:V[aG];}return aE;}function ay(aF,aE){az[aF.toLowerCase()]=ai(aE||{});}function ag(aH,aF){var aE="";for(var aG=0;aG<aF;aG++){aE+=aH;}return aE;}function Z(aK,aJ){var aI=(typeof(aJ)=="number")?ag(ab(),aJ):aJ,aE="";var aG=W(aK),aF=ak();aE+=aG[0];for(var aH=1;aH<aG.length;aH++){aE+=aF+aI+aG[aH];}return aE;}function ac(aE,aG){var aF=function(){};aF.prototype=aG.prototype;aE.prototype=new aF();aE.prototype.constructor=aE;aE.baseConstructor=aG;aE.superClass=aG.prototype;}function av(aE,aF){return ao(aF,aB(aE))?true:false;}function S(aE){return R.test(aE);}function aC(aF,aE){var aG;if(typeof aE=="function"){aG=aE;}else{if(aE){aG=function(aI,aH){return(aH in aE)?aE[aH]:aI;};}else{aG=function(aJ,aI){var aH=ap(aI);return(aH!==null&&typeof aH!="undefined")?aH:aJ;};}}return aF.replace(/\$\{([\w\-]+)\}/g,aG);}function aB(aE){return(aE||"").replace(/(.+)\!$/,"$1");}function Y(aH){for(var aF=0,aE=aH.length;aF<aE;aF++){var aG=aH.charAt(aF);if(aG=="\\"){aF++;continue;}else{if(aG=="$"&&aH.charAt(aF+1)=="#"){return true;}}}return false;}function an(aG,aF){aF=aF||"html";var aE=null;if(aG.name){aE=aq(aF,aB(aG.name));if(aE&&aE.type=="zen-reference"){aE=aq(aF,aB(aE.value));}}this.name=(aE)?aE.value.name:aG.name;this.real_name=aG.name;this.count=aG.count||1;this._abbr=aE;this.syntax=aF;this._content="";this._paste_content="";this.repeat_by_lines=aG.is_repeating;this.is_repeating=aG&&aG.count>1;this.parent=null;this.has_implicit_name=aG.has_implict_name;this.seLine truncated
if(this._abbr){this.copyAttributes(this._abbr.value);}this.copyAttributes(aG);}an.prototype={addChild:function(aE){if(!this.children){this.children=[];}aE.parent=this;this.children.push(aE);},addAttribute:function(aF,aG){if(!this.attributes){this.attributes=[];}if(!this._attr_hash){this._attr_hash={};}aG=ad(aG,"|",aA());var aE;if(aF in this._attr_hash){aE=this._attr_hash[aF];if(aF=="class"){aE.value+=((aE.value)?" ":"")+aG;}else{aE.value=aG;}}else{aE={name:aF,value:aG};this._attr_hash[aF]=aE;this.attributes.push(aE);}},copyAttributes:function(aH){if(aH&&aH.attributes){for(var aG=0,aF=aH.attributes.length;aG<aF;aG++){var aE=aH.attributes[aG];this.addAttribute(aE.name,aE.value);}}},hasTagsInContent:function(){return this.getContent()&&R.test(this.getContent());},setContent:function(aE){this._content=ad(aE||"","|",aA());},getContent:function(){return this._content||"";},setPasteContent:function(aE){this._paste_content=I.escapeText(aE);},getPasteContent:function(){return this._paste_content;},findDeepestChild:function(){if(!this.children||!this.children.length){return null;}var aE=this;while(true){aE=aE.children[aE.children.length-1];if(!aE.children||!aE.children.length){break;}}return aE;}};function U(aF,aE){this.name=aB(aF.name);this.real_name=aF.name;this.count=aF.count;this.children=[];this._content=aF.text||"";this.repeat_by_lines=aF.is_repeating;this.is_repeating=aF&&aF.count>1;this.attributes=[];this.value=ad(ao(aE,this.name),"|",aA());this.parent=null;this.syntax=aE;this.addAttribute("id",aA());this.addAttribute("class",aA());this.copyAttributes(aF);}ac(U,an);function aq(aF,aE){return K.getAbbreviation(aF,aE);}function ao(aF,aE){return K.getSnippet(aF,aE);}function ap(aE){return K.getVariable(aE);}function ab(){return ap("indentation");}function aw(aE){this.type=(aE instanceof U)?"snippet":"tag";this.name=aE.name;this.real_name=aE.real_name;this.children=[];this.counter=1;this.is_repeating=aE.is_repeating;this.repeat_by_lines=aE.repeat_by_lines;this.has_implicit_name=this.type=="tag"&&aE.has_implicit_name;this.attributes=[];if(aE.attributes){for(var aH=0,aG=aE.attributes.length;aH<aG;aH++){var aF=aE.attributes[aH];this.attributes.push({name:aF.name,value:aF.value});}}this.source=aE;this.parent=null;this.nextSibling=null;this.previousSibling=null;this.start="";this.end="";this.content=aE.getContent()||"";this.padding="";}aw.prototype={addChild:function(aE){aE.parent=this;if(aE.has_implicit_name&&this.isInline()){aE.name="span";}var aF=this.children[this.children.length-1];if(aF){aE.previousSibling=aF;aF.nextSibling=aE;}this.children.push(aE);},getAttribute:function(aF){aF=aF.toLowerCase();for(var aG=0,aE=this.attributes.length;aG<aE;aG++){if(this.attributes[aG].name.toLowerCase()==aF){return this.attributes[aG].value;}}return null;},isUnary:function(){if(this.type=="snippet"){return false;}return(this.source._abbr&&this.source._abbr.value.is_empty)||K.isItemInCollection(this.source.syntax,"empty",this.name);},isInline:function(){return this.type=="text"||K.isItemInCollection(this.source.syntax,"inline_level",this.name);},isBlock:function(){return this.type=="snippet"||!this.isInline();},hasTagsInContent:function(){return this.content&&R.test(this.content);},hasChildren:function(){return !!this.children.length;},hasBlockChildren:function(){if(this.hasTagsInContent()&&this.isBlock()){return true;}for(var aE=0;aE<this.children.length;aE++){if(this.children[aE].isBlock()){return true;}}return false;},findDeepestChild:function(){if(!this.children.length){return null;}var aE=this;while(true){aE=aE.children[aE.children.length-1];if(!aE.children.length){break;}}return aE;},toString:function(){var aG="";for(var aF=0,aE=this.children.length;aF<aE;aF++){aG+=this.children[aF].toString();}return this.start+this.content+aG+this.end;},hasOutputPlaceholder:function(){if(Y(this.content)){return true;}else{for(var aF=0,aE=this.attributes.length;aF<aE;aF++){if(Y(this.attributes[aF].value)){return true;}}}return false;},findElementsWithOutputPlaceholder:function(aE){aE=aE||[];for(var aG=0,aF=this.children.length;aG<aF;aG++){if(this.children[aG].hasOutputPlaceholder()){aE.push(this.children[aG]);}this.children[aG].findElementsWithOutputPlaceholder(aE);}return aE;},pasteContent:function(aO){var aH="$#",aE=[aH,aO],aG=function(){return aE;},aL=[];if(this.hasOutputPlaceholder()){aL.push(this);}aL=aL.concat(this.findElementsWithOutputPlaceholder());if(aL.length){for(var aK=0,aN=aL.length;aK<aN;aK++){var aP=aL[aK];aP.content=ad(aP.content,aH,aG);for(var aI=0,aJ=aP.attributes.length;aI<aJ;aI++){var aM=aP.attributes[aI];aM.value=ad(aM.value,aH,aG);}}}else{var aF=this.findDeepestChild()||this;aF.content+=aO;}}};function al(aN,aJ){aJ=aJ||new aw(aN);var aK=1,aH="";if(aN.children){for(var aG=0,aI=aN.children.length;aG<aI;aG++){var aE=aN.children[aG];aK=aE.count;if(aE.repeat_by_lines){aH=W(aE.getPasteContent(),true);aK=Math.max(aH.length,1);}else{aH=aE.getPasteContent();}for(var aF=0;aF<aK;aF++){var aM=new aw(aE);aJ.addChild(aM);aM.counLine truncated
if(aE.children&&aE.children.length){al(aE,aM);}if(aH){var aL=(typeof(aH)=="string")?aH:(aH[aF]||"");aM.pasteContent(e(aL));}}}}return aJ;}function aj(aE,aJ,aG){aJ=at(aJ);if(typeof(aG)=="string"){aG=aG.split(/[\|,]/g);}for(var aI=0,aF=aG.length;aI<aF;aI++){var aH=e(aG[aI].toLowerCase());if(aH&&aH in ae){aE=ae[aH](aE,aJ);}}return aE;}function am(aF,aE){aE=aE||"html";if(aF.isEmpty()){return null;}return av(aF.name,aE)?new U(aF,aE):new an(aF,aE);}function aa(aK,aJ,aI){var aE=am(aK,aJ);aI.addChild(aE);var aF=aI;while(aF.parent){aF=aF.parent;}aF.last=aE;if(aE.repeat_by_lines){aF.multiply_elem=aE;}for(var aG=0,aH=aK.children.length;aG<aH;aG++){aa(aK.children[aG],aJ,aE);}}function X(aI,aH){for(var aG=0,aF=aI.children.length;aG<aF;aG++){var aJ=aI.children[aG];if(!aJ.isEmpty()&&!aJ.isTextNode()&&aJ.name.indexOf("+")!=-1){var aE=aq(aH,aJ.name);if(aE){aI.children[aG]=F.parse(aE.value);}}X(aI.children[aG],aH);}}function ar(aE,aF){X(aE,aF);return F.optimizeTree(aE);}function af(aH,aG){var aF="",aE=aH.length;while(aG>aE++){aF+="0";}return aF+aH;}function ad(aJ,aF,aE){var aH=0,aM=aJ.length,aG=aF.length,aL=0;while(aH<aM){if(aJ.charAt(aH)=="\\"){aH+=aG+1;}else{if(aJ.substr(aH,aG)==aF){var aI=aG;aL++;var aN=aE;if(typeof(aE)!=="string"){var aK=aE(aJ,aF,aH,aL);if(aK){aI=aK[0].length;aN=aK[1];}else{aN=false;}}if(aN===false){aH++;continue;}aJ=aJ.substring(0,aH)+aN+aJ.substring(aH+aI);aM=aJ.length;aH+=aN.length;}else{aH++;}}}return aJ;}function at(aF){var aE=aF;if(typeof(aF)=="string"&&aF in az){aE=az[aF];}if(!aE){aE=az["plain"];}return aE;}ay("xhtml");ay("html",{self_closing_tag:false});ay("xml",{self_closing_tag:true,tag_nl:true});ay("plain",{tag_nl:false,indent:false,place_cursor:false});return{actions:{},registerAction:function(aE,aF){this.actions[aE.toLowerCase()]=aF;},runAction:function(aF,aE){if(!(aE instanceof Array)){aE=Array.prototype.slice.call(arguments,1);}aF=aF.toLowerCase();if(aF in this.actions){return this.actions[aF].apply(this,aE);}},expandAbbreviation:function(aF,aH,aG){aH=aH||"html";var aI=this.parseIntoTree(aF,aH);if(aI){var aE=al(aI);this.applyFilters(aE,aH,aG,aI.filters);return aC(aE.toString());}return"";},extractAbbreviation:function(aK){var aG=aK.length,aE=-1,aI=0,aJ=0,aF=0;while(true){aG--;if(aG<0){aE=0;break;}var aH=aK.charAt(aG);if(aH=="]"){aJ++;}else{if(aH=="["){if(!aJ){aE=aG+1;break;}aJ--;}else{if(aH=="}"){aF++;}else{if(aH=="{"){if(!aF){aE=aG+1;break;}aF--;}else{if(aH==")"){aI++;}else{if(aH=="("){if(!aI){aE=aG+1;break;}aI--;}else{if(aJ||aF){continue;}else{if(!ax(aH)||(aH==">"&&S(aK.substring(0,aG+1)))){aE=aG+1;break;}}}}}}}}}if(aE!=-1&&!aF&&!aJ&&!aI){return aK.substring(aE);}else{return"";}},parseIntoTree:function(aG,aJ){aJ=aJ||"html";var aF="";aG=aG.replace(/\|([\w\|\-]+)$/,function(aN,aM){aF=aM;return"";});try{var aI=F.parse(aG),aL=new an({},aJ);aI=ar(aI,aJ);}catch(aK){if(aK.message=="InvalidAbbreviation"){return null;}}for(var aH=0,aE=aI.children.length;aH<aE;aH++){aa(aI.children[aH],aJ,aL);}aL.filters=aF;return aL;},padString:Z,setupProfile:ay,getNewline:function(){return T;},setNewline:function(aE){T=aE;this.setVariable("newline",aE);this.setVariable("nl",aE);},wrapWithAbbreviation:function(aF,aK,aH,aG){aH=aH||"html";var aJ=this.parseIntoTree(aF,aH),aI=false;if(aJ){if(aJ.multiply_elem){aJ.multiply_elem.setPasteContent(aK);aJ.multiply_elem.repeat_by_lines=aI=true;}var aE=al(aJ);if(!aI){aE.pasteContent(aK);}this.applyFilters(aE,aH,aG,aJ.filters);return aC(aE.toString());}return null;},splitByLines:W,isInsideTag:function(aH,aG){var aF=/^<\/?\w[\w\:\-]*.*?>/;var aI=aG;while(aI>-1){if(aH.charAt(aI)=="<"){break;}aI--;}if(aI!=-1){var aE=aF.exec(aH.substring(aI));if(aE&&aG>aI&&aG<aI+aE[0].length){return true;}}return false;},getCaretPlaceholder:aA,setCaretPlaceholder:function(aE){au=aE;},rolloutTree:al,registerFilter:function(aE,aF){ae[aE]=aF;},nodeFactory:function(aF,aE){return new aw({name:aF,attributes:aE||[]});},applyFilters:function(aE,aF,aH,aI){aH=at(aH);var aG=aH.filters;if(!aG){aG=K.getSubset(aF,"filters")||aD;}if(aI){aG+="|"+((typeof(aI)=="string")?aI:aI.join("|"));}if(!aG){aG=aD;}return aj(aE,aH,aG);},runFilters:aj,repeatString:ag,getVariable:ap,setVariable:function(aF,aG){var aE=K.getVocabulary("user")||{};if(!("varaibles" in aE)){aE.variables={};}aE.variables[aF]=aG;K.setVocabulary(aE,"user");},replaceVariables:aC,escapeText:function(aE){return aE.replace(/([\$\|\\])/g,"\\$1");},unescapeText:function(aE){return aE.replace(/\\(.)/g,"$1");},replaceCounter:function(aG,aF){var aE="$";aF=String(aF);return ad(aG,aE,function(aK,aJ,aL,aH){if(aK.charAt(aL+1)=="{"||ah(aK.charAt(aL+1))){return false;}var aI=aL+1;while(aK.charAt(aI)=="$"&&aK.charAt(aI+1)!="{"){aI++;}return[aK.substring(aL,aI),af(aF,aI-aL)];});},isNumeric:ah,upgradeTabstops:function(aK,aL){var aG=0,aJ=["start","end","content"],aE=function(aM){return"\\"+aM;},aI=function(aN,aM,aO){aM=parseInt(aM);if(aM>aG){aG=aM;}if(aO){return"${"+(aM+aL)+":"+aO+"}";}else{return"$"+(aM+aL);}};for(var aH=0,aF=aJ.length;aH<aF;aH++){aK[aJ[aH]]=this.processLine truncated
}return aG;},getProfile:function(aE){return(aE in az)?az[aE]:az["plain"];},getImageSize:function(aL){var aH="\211PNG\r\n\032\n",aK="\377\330",aF="GIF8",aE=function(){return aL.charCodeAt(aJ++);};if(aL.substr(0,8)===aH){var aJ=aL.indexOf("IHDR")+4;return{width:(aE()<<24)|(aE()<<16)|(aE()<<8)|aE(),height:(aE()<<24)|(aE()<<16)|(aE()<<8)|aE()};}else{if(aL.substr(0,4)===aF){aJ=6;return{width:aE()|(aE()<<8),height:aE()|(aE()<<8)};}else{if(aL.substr(0,2)===aK){aJ=2;var aG=aL.length;while(aJ<aG){if(aE()!=255){return;}var aI=aE();if(aI==218){break;}var aM=(aE()<<8)|aE();if(aI>=192&&aI<=207&&!(aI&4)&&!(aI&8)){aJ+=1;return{height:(aE()<<8)|aE(),width:(aE()<<8)|aE()};}else{aJ+=aM-2;}}}}}},getCounterForNode:function(aF){var aE=aF.counter;if(!aF.is_repeating&&!aF.repeat_by_lines){while(aF=aF.parent){if(aF.is_repeating||aF.repeat_by_lines){return aF.counter;}}}return aE;},processTextBeforePaste:function(aQ,aO,aL){var aI=0,aN=aQ.length,aM,aH,aF=[];var aG=function(aR,aS){while(aR<aN){if(!aS(aQ.charAt(aR++))){break;}}return aR-1;};while(aI<aN){var aE=aQ.charAt(aI);if(aE=="\\"&&aI+1<aN){aF.push(aO(aQ.charAt(aI+1)));aI+=2;continue;}else{if(aE=="$"){var aK=aQ.charAt(aI+1)||"";aH=aI;if(this.isNumeric(aK)){aM=aI+1;aI=aG(aM,this.isNumeric);if(aM<aI){aF.push(aL(aH,aQ.substring(aM,aI)));continue;}}else{if(aK=="{"){var aP=1;aM=aI+2;aI=aG(aM,this.isNumeric);if(aI>aM){if(aQ.charAt(aI)=="}"){aF.push(aL(aH,aQ.substring(aM,aI)));aI++;continue;}else{if(aQ.charAt(aI)==":"){var aJ=aI+2;aI=aG(aJ,function(aR){if(aR=="{"){aP++;}else{if(aR=="}"){aP--;}}return !!aP;});aF.push(aL(aH,aQ.substring(aM,aJ-2),aQ.substring(aJ-1,aI)));aI++;continue;}}}}}aI=aH;}}aF.push(aE);aI++;}return aF.join("");}};})();function m(S){var e=S.getSelectionRange(),T=String(S.getContent());if(e.start!=e.end){return T.substring(e.start,e.end);}var R=S.getCurrentLineRange();return I.extractAbbreviation(T.substring(R.start,e.start));}function C(T,R,V){R=String(R||T.getSyntax());V=String(V||T.getProfileName());var e=T.getSelectionRange().end,S,U="";if((S=m(T))){U=I.expandAbbreviation(S,R,V);if(U){T.replaceContent(U,e-S.length,e);return true;}}return false;}function z(R,e,S){e=String(e||R.getSyntax());S=String(S||R.getProfileName());if(!C(R,e,S)){R.replaceContent(I.getVariable("indentation"),R.getCaretPos());}}function g(V,Y,S){Y=String((Y||"out").toLowerCase());S=String(S||V.getProfileName());var T=V.getSelectionRange(),ab=T.end,R=T.start,aa=T.end,X=String(V.getContent()),T=null,ac,U=I.html_matcher.last_match["opening_tag"],Z=I.html_matcher.last_match["closing_tag"];if(Y=="in"&&U&&R!=aa){if(!Z){return false;}else{if(U.start==R){if(X.charAt(U.end)=="<"){ac=I.html_matcher.find(X,U.end+1,S);if(ac[0]==U.end&&ac[1]==Z.start){T=I.html_matcher(X,U.end+1,S);}else{T=[U.end,Z.start];}}else{T=[U.end,Z.start];}}else{var e=X.substring(0,Z.start).indexOf("<",U.end);var W=e!=-1?e+1:U.end;T=I.html_matcher(X,W,S);}}}else{T=I.html_matcher(X,ab,S);}if(T!==null&&T[0]!=-1){V.createSelection(T[0],T[1]);return true;}else{return false;}}function u(T,U,e){var R=/\s|\n|\r/;function S(V){return R.test(V);}while(U<e){if(!S(T.charAt(U))){break;}U++;}while(e>U){e--;if(!S(T.charAt(e))){e++;break;}}return[U,e];}function r(V,Z,R,U){R=String(R||V.getSyntax());U=String(U||V.getProfileName());Z=Z||V.prompt("Enter abbreviation");var T=V.getSelectionRange(),X=T.start,e=T.end,W=String(V.getContent());if(!Z||typeof Z=="undefined"){return null;}Z=String(Z);if(X==e){T=I.html_matcher(W,X,U);if(!T||T[0]==-1){return null;}var S=u(W,T[0],T[1]);X=S[0];e=S[1];}var Y=I.escapeText(W.substring(X,e)),aa=I.wrapWithAbbreviation(Z,B(V,Y),R,U);if(aa){V.setCaretPos(e);V.replaceContent(aa,X,e);}}function B(e,R){return o(R,c(e));}function o(T,S){var e=I.splitByLines(T);for(var R=0;R<e.length;R++){if(e[R].search(S)==0){e[R]=e[R].substr(S.length);}}return e.join(I.getNewline());}function c(e){return Q(e.getCurrentLine());}function Q(e){return(e.match(/^(\s+)/)||[""])[0];}function h(X,T,V){T=T||1;V=V||0;var Z=X.getCaretPos()+V,Y=String(X.getContent()),S=Y.length,R=-1,U=/^\s+$/;function e(ad){return Y.charAt(ad);}function ac(ad){var af=ad;while(af>=0){var ae=e(af);if(ae=="\n"||ae=="\r"){break;}af--;}return Y.substring(af,ad);}while(Z<S&&Z>0){Z+=T;var W=e(Z),ab=e(Z+1),aa=e(Z-1);switch(W){case'"':case"'":if(ab==W&&aa=="="){R=Z+1;}break;case">":if(ab=="<"){R=Z+1;}break;case"\n":case"\r":if(U.test(ac(Z-1))){R=Z;}break;}if(R!=-1){break;}}return R;}function p(R){var e=R.getCaretPos(),S=h(R,-1);if(S==e){S=h(R,-1,-2);}if(S!=-1){R.setCaretPos(S);}}function G(e){var R=h(e,1);if(R!=-1){e.setCaretPos(R);}}function v(X){var ac=X.getCaretPos(),Y=String(X.getContent()),R=I.getNewline(),T=I.getVariable("indentation"),U=String(X.getSyntax());if(U=="html"){var V=I.html_matcher.getTags(Y,ac,String(X.getProfileName()));if(V[0]&&V[1]&&V[0].type=="tag"&&V[0].end==ac&&V[1].start==ac){X.replaceContent(R+T+I.getCaretPlaceholder()+R,ac);return true;}}else{if(U=="css"){if(ac&&Y.charAt(ac-1)=="{"){for(var W=ac,Z=Y.length,e;W<Z;W++){e=Y.charAt(W);if(e=="}"){return fLine truncated
}if(e=="{"){break;}}var ab=R+T+I.getCaretPlaceholder()+R,aa=ac<Y.length&&Y.charAt(ac)=="}";var S=I.getVariable("close_css_brace");if(S){ab+=I.replaceVariables(S);}else{if(!aa){ab+="}";}}X.replaceContent(ab,ac,ac+(aa?1:0));return true;}}}return false;}function D(W){if(!v(W)){var U=c(W),Y=String(W.getContent()),Z=W.getCaretPos(),S=Y.length,R=I.getNewline();var X=W.getCurrentLineRange(),T="";for(var V=X.end+1,e;V<S;V++){e=Y.charAt(V);if(e==" "||e=="\t"){T+=e;}else{break;}}if(T.length>U.length){W.replaceContent(R+T,Z,Z,true);}else{W.replaceContent(R,Z);}}}function a(R){var e=R.getCurrentLineRange();R.createSelection(e.start,e.end);}function j(T){var V=String(T.getContent()),R=T.getCaretPos();if(V.charAt(R)=="<"){R++;}var S=I.html_matcher.getTags(V,R,String(T.getProfileName()));if(S&&S[0]){var e=S[0],U=S[1];if(U){if(e.start<=R&&e.end>=R){T.setCaretPos(U.start);}else{if(U.start<=R&&U.end>=R){T.setCaretPos(e.start);}}}}}function s(U){var T=U.getSelectionRange();if(T.start==T.end){var W=I.html_matcher(String(U.getContent()),U.getCaretPos(),String(U.getProfileName()));if(W){T.start=W[0];T.end=W[1];}}if(T.start!=T.end){var V=String(U.getContent()).substring(T.start,T.end),e=V.length;var R=I.splitByLines(V);for(var S=1;S<R.length;S++){R[S]=R[S].replace(/^\s+/,"");}V=R.join("").replace(/\s{2,}/," ");U.replaceContent(V,T.start,T.end);U.createSelection(T.start,T.start+V.length);}}function P(S){var R=String(S.getSyntax());if(R=="css"){var e=S.getCaretPos();var T=I.html_matcher.getTags(String(S.getContent()),e);if(T&&T[0]&&T[0].type=="tag"&&T[0].start<=e&&T[0].end>=e){R="html";}}switch(R){case"css":return q(S);default:return x(S);}}function x(R){var e=R.getSelectionRange(),S=String(R.getContent());if(e.start==e.end){var T=I.html_matcher.getTags(S,R.getCaretPos(),String(R.getProfileName()));if(T&&T[0]){e.start=T[0].start;e.end=T[1]?T[1].end:T[0].end;}}return y(R,"<!--","-->",e.start,e.end);}function q(R){var e=R.getSelectionRange();if(e.start==e.end){e=R.getCurrentLineRange();var S=u(String(R.getContent()),e.start,e.end);e.start=S[0];e.end=S[1];}return y(R,"/*","*/",e.start,e.end);}function O(Z,Y,T,V){var U=T.charAt(0),e=V.charAt(0),S=-1,R=-1;function X(aa,ab){return Z.substr(ab,aa.length)==aa;}while(Y--){if(Z.charAt(Y)==U&&X(T,Y)){S=Y;break;}}if(S!=-1){Y=S;var W=Z.length;while(W>=Y++){if(Z.charAt(Y)==e&&X(V,Y)){R=Y+V.length;break;}}}return(S!=-1&&R!=-1)?[S,R]:null;}function M(R){var e=new RegExp("[.*+?|()\\[\\]{}\\\\]","g");return R.replace(e,"\\$&");}function y(T,S,R,e,Z){var V=String(T.getContent()),aa=T.getCaretPos(),X=null;function Y(ab){return ab.replace(new RegExp("^"+M(S)+"\\s*"),function(ac){aa-=ac.length;return"";}).replace(new RegExp("\\s*"+M(R)+"$"),"");}function U(ab,ac){return V.substr(ac,ab.length)==ab;}var W=O(V,aa,S,R);if(W&&W[0]<=e&&W[1]>=Z){e=W[0];Z=W[1];X=Y(V.substring(e,Z));}else{X=S+" "+V.substring(e,Z).replace(new RegExp(M(S)+"\\s*|\\s*"+M(R),"g"),"")+" "+R;aa+=S.length+1;}if(X!==null){T.setCaretPos(e);T.replaceContent(B(T,X),e,Z);T.setCaretPos(aa);return true;}return false;}function w(W,V){var ab=W.getCaretPos(),S=I.getProfile(String(V||W.getProfileName())),Y=I.getCaretPlaceholder();var T=I.html_matcher.getTags(String(W.getContent()),ab,String(W.getProfileName()));if(T&&T[0]){var aa=T[0].full_tag;if(T[1]){var Z=" /";if(S.self_closing_tag===true){Z="/";}aa=aa.replace(/\s*>$/,Z+">");if(aa.length+T[0].start<ab){aa+=Y;}else{var X=ab-T[0].start;aa=aa.substring(0,X)+Y+aa.substring(X);}W.replaceContent(aa,T[0].start,T[1].end);}else{var e=I.getNewline(),R=I.getVariable("indentation");var U=(S.tag_nl===true)?e+R+Y+e:Y;aa=aa.replace(/\s*\/>$/,">")+U+"</"+T[0].name+">";W.replaceContent(aa,T[0].start,T[0].end);}return true;}else{return false;}}function H(V,X){var e=V.length,W=0,R=e-1;for(var T=X-1;T>0;T--){var U=V.charAt(T);if(U=="\n"||U=="\r"){W=T+1;break;}}for(var S=X;S<e;S++){var U=V.charAt(S);if(U=="\n"||U=="\r"){R=S;break;}}return{start:W,end:R};}function A(U){var e=U.getCaretPos(),V=String(U.getContent());var W=I.html_matcher.getTags(V,e,String(U.getProfileName()));if(W&&W[0]){if(!W[1]){U.replaceContent(I.getCaretPlaceholder(),W[0].start,W[0].end);}else{var S=u(V,W[0].end,W[1].start),T=H(V,S[0]),X=Q(V.substring(T.start,T.end)),R=V.substring(S[0],S[1]);R=o(R,X);U.replaceContent(I.getCaretPlaceholder()+R,W[0].start,W[1].end);}return true;}else{return false;}}function i(e,R,S){S=S||0;return R.charAt(S)==e.charAt(0)&&R.substr(S,e.length)==e;}function n(T){var U=String(T.getSelection()),R=T.getCaretPos();if(!U){var V=String(T.getContent()),S,e;while(R-->=0){if(i("src=",V,R)){if(e=V.substr(R).match(/^(src=(["'])?)([^'"<>\s]+)\1?/)){U=e[3];R+=e[1].length;}break;}else{if(i("url(",V,R)){if(e=V.substr(R).match(/^(url\((['"])?)([^'"\)\s]+)\1?/)){U=e[3];R+=e[1].length;}break;}}}}if(U){if(i("data:",U)){return E(T,U,R);}else{return f(T,U,R);}}else{return false;}}function f(T,U,W){var e=T.getFilePath(),R="application/octet-stream";if(e===null){throw"You should save your file before using this action";}var V=zen_file.locLine truncated
if(V===null){throw"Can't find "+U+" file";}var S=base64.encode(String(zen_file.read(V)));if(!S){throw"Can't encode file content to base64";}S="data:"+(base64.mime_types[String(zen_file.getExt(V))]||R)+";base64,"+S;T.replaceContent("$0"+S,W,W+U.length);return true;}function E(S,T,U){var R=String(S.prompt("Enter path to file (absolute or relative)"));if(!R){return false;}var e=zen_file.createPath(S.getFilePath(),R);if(!e){throw"Can't save file";}zen_file.save(e,base64.decode(T.replace(/^data\:.+?;.+?,/,"")));S.replaceContent("$0"+R,U,U+T.length);return true;}function l(e,R){return e.toFixed(typeof R=="undefined"?2:R).replace(/\.?0+$/,"");}function L(T,S){var U=String(T.getContent()),R=U.length,e=T.getCaretPos()-1,V=e+1;while(e>=0&&S(U.charAt(e),e,U)){e--;}while(V<R&&S(U.charAt(V),V,U)){V++;}return V>e?[++e,V]:null;}function t(T,W){var V=String(T.getContent()),e=false,S=false;var U=L(T,function(X){if(I.isNumeric(X)){return true;}if(X=="."){return S?false:S=true;}if(X=="-"){return e?false:e=true;}return false;});if(U){var R=parseFloat(V.substring(U[0],U[1]));if(!isNaN(R)){R=l(R+W);T.replaceContent(R,U[0],U[1]);T.createSelection(U[0],U[0]+R.length);return true;}}return false;}function J(S){var V=String(S.getContent()),U=".+-*/\\";var T=L(S,function(e){return I.isNumeric(e)||U.indexOf(e)!=-1;});if(T){var X=V.substring(T[0],T[1]);X=X.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var R=new Function("return "+X)();R=l(R);S.replaceContent(R,T[0],T[1]);S.setCaretPos(T[0]+R.length);return true;}catch(W){}}return false;}I.registerAction("expand_abbreviation",C);I.registerAction("expand_abbreviation_with_tab",z);I.registerAction("match_pair",g);I.registerAction("match_pair_inward",function(e){g(e,"in");});I.registerAction("match_pair_outward",function(e){g(e,"out");});I.registerAction("wrap_with_abbreviation",r);I.registerAction("prev_edit_point",p);I.registerAction("next_edit_point",G);I.registerAction("insert_formatted_line_break",D);I.registerAction("insert_formatted_line_break_only",v);I.registerAction("select_line",a);I.registerAction("matching_pair",j);I.registerAction("merge_lines",s);I.registerAction("toggle_comment",P);I.registerAction("split_join_tag",w);I.registerAction("remove_tag",A);I.registerAction("encode_decode_data_url",n);I.registerAction("increment_number_by_1",function(e){return t(e,1);});I.registerAction("decrement_number_by_1",function(e){return t(e,-1);});I.registerAction("increment_number_by_10",function(e){return t(e,10);});I.registerAction("decrement_number_by_10",function(e){return t(e,-10);});I.registerAction("increment_number_by_01",function(e){return t(e,0.1);});I.registerAction("decrement_number_by_01",function(e){return t(e,-0.1);});I.registerAction("evaluate_math_expression",J);(function(){var V=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,ah=/^<\/([\w\:\-]+)[^>]*>/,ae=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;var Z=ac("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");var Y=ac("address,applet,blockquote,button,center,dd,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");var W=ac("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");var aa=ac("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");var R="xhtml";var af={opening_tag:null,closing_tag:null,start_ix:-1,end_ix:-1};function ag(e){if(!e||e!="html"){e="xhtml";}R=e;}function aj(al,e){var ak=al[1].toLowerCase();return{name:ak,full_tag:al[0],start:e,end:e+al[0].length,unary:Boolean(al[3])||(ak in Z&&R=="html"),has_close:Boolean(al[3]),type:"tag",close_self:(ak in aa&&R=="html")};}function S(ak,e){return{start:ak,end:e,type:"comment"};}function ac(am){var al={},e=am.split(",");for(var ak=0;ak<e.length;ak++){al[e[ak]]=true;}return al;}function ad(am,an,e){e=e||0;var al=-1,ak=-1;if(am&&!an){al=am.start;ak=am.end;}else{if(am&&an){if((am.start<e&&am.end>e)||(an.start<=e&&an.end>e)){al=am.start;ak=an.end;}else{al=am.end;ak=an.start;}}}return[al,ak];}function ab(al,am,e){e=e||0;af.opening_tag=al;af.closing_tag=am;var ak=ad(al,am,e);af.start_ix=ak[0];af.end_ix=ak[1];return af.start_ix!=-1?[af.start_ix,af.end_ix]:null;}function U(al,ak,e){if(e.has_close){return null;}else{}}function X(an,ak,ar,ay){ay=ay||ad;ag(ar);var aw=[],ax=[],aq=null,ao=null,at=null,am=an.length,av,al,e;aw.last=ax.last=function(){return this[this.length-1];};function aA(aC,aD){if(arguments.length==1){aD=al;}return an.substr(aD,aC.length)==aC;}function au(aC){while(aC--){if(an.charAt(aC)=="<"&&aA("<!--",aC)){break;}}return aC;}al=ak;while(al--&&al>=0){var ap=an.charAt(al);if(ap=="<"){var aB=an.substring(al,am);if((av=aB.match(ah))){e=aj(av,al);if(e.start<ak&&e.end>ak){ao=e;}else{ax.push(e);}}else{if((av=aB.match(V))){e=ajLine truncated
if(e.unary){if(e.start<ak&&e.end>ak){return ay(e,null,ak);}}else{if(ax.last()&&ax.last().name==e.name){ax.pop();}else{aq=e;break;}}}else{if(aB.indexOf("<!--")==0){var az=aB.search("-->")+al+3;if(al<ak&&az>=ak){return ay(S(al,az));}}}}}else{if(ap=="-"&&aA("-->")){al=au(al);}}}if(!aq){return ay(null);}if(!ao){for(al=ak;al<am;al++){var ap=an.charAt(al);if(ap=="<"){var aB=an.substring(al,am);if((av=aB.match(V))){e=aj(av,al);if(!e.unary){aw.push(e);}}else{if((av=aB.match(ah))){var e=aj(av,al);if(aw.last()&&aw.last().name==e.name){aw.pop();}else{ao=e;break;}}else{if(aA("<!--")){al+=aB.search("-->")+2;}}}}else{if(ap=="-"&&aA("-->")){if(!aw.last()||aw.last().type!="comment"){var az=al+3;return ay(S(au(al),az));}}}}}return ay(aq,ao,ak);}var T=function(ak,e,al){return X(ak,e,al,ab);};T.start_tag=V;T.end_tag=ah;T.find=function(ak,e,al){return X(ak,e,al);};T.getTags=function(ak,e,al){return X(ak,e,al,function(am,an){return[am,an];});};T.last_match=af;try{I.html_matcher=T;}catch(ai){}})();(function(){function e(W,V){var Y=W.getAttribute("id"),U=W.getAttribute("class"),T=I.getNewline();if(Y||U){var Z="",X=(W.parent)?W.parent.padding:"";if(Y){Z+="#"+Y;}if(U){Z+="."+U;}W.start=W.start.replace(/</,"<!-- "+Z+" -->"+T+X+"<");W.end=W.end.replace(/>/,">"+T+X+"<!-- /"+Z+" -->");var S=I.getCounterForNode(W);W.start=I.replaceCounter(W.start,S);W.end=I.replaceCounter(W.end,S);}}function R(S,V){if(V.tag_nl===false){return S;}for(var U=0,T=S.children.length;U<T;U++){var W=S.children[U];if(W.isBlock()){e(W,U);}R(W,V);}return S;}I.registerFilter("c",R);})();(function(){var e=/(.+)\!$/;function R(S,V){for(var U=0,T=S.children.length;U<T;U++){var W=S.children[U];if(W.type=="snippet"&&e.test(W.real_name)){W.start=W.start.replace(/(;?)$/," !important$1");}R(W,V);}return S;}I.registerFilter("css",R);})();(function(){var R={"<":"&lt;",">":"&gt;","&":"&amp;"};function e(T){return T.replace(/([<>&])/g,function(V,U){return R[U];});}function S(T,W,Y){for(var V=0,U=T.children.length;V<U;V++){var X=T.children[V];X.start=e(X.start);X.end=e(X.end);S(X);}return T;}I.registerFilter("e",S);})();(function(){function e(R,U){for(var T=0,S=R.children.length;T<S;T++){var V=R.children[T];if(V.type=="snippet"){V.start=V.start.replace(/([\w\-]+\s*:)(?!:)\s*/,"$1 ");}e(V,U);}return R;}I.registerFilter("fc",e);})();(function(){var V="${child}",W="%s";function S(){return I.getNewline();}function X(){return K.getVariable("indentation");}function e(ab){return(ab.parent&&ab.parent.hasBlockChildren());}function aa(ab){return ab.parent&&!ab.parent.parent&&!ab.previousSibling;}function U(ac,ab){if(!ab.inline_break){return false;}while(ac.previousSibling&&ac.previousSibling.isInline()){ac=ac.previousSibling;}if(!ac.isInline()){return false;}var ad=1;while(ac=ac.nextSibling){if(ac.type=="text"||!ac.isInline()){ad=0;}else{if(ac.isInline()){ad++;}}}return ad>=ab.inline_break;}function Y(ac,ab){return(ac.children.length&&U(ac.children[0],ab));}function Z(ai,ad,ab){var af=ai.source.value;if(!af){return T(ai,ad,ab);}ai.start=ai.end=W;var ag=(ai.parent)?ai.parent.padding:I.repeatString(X(),ab);if(!aa(ai)){ai.start=S()+ag+ai.start;}var ae=af.split(V),aj=I.splitByLines(ae[0]||""),ah=X();if(aj.length>1){var ac=aj[aj.length-1].match(/^(\s+)/);if(ac){ah=ac[1];}}ai.padding=ag+ah;return ai;}function T(ad,ac,ah){if(!ad.name){return ad;}ad.start=ad.end=W;var af=(ad.isUnary()&&!ad.children.length);if(ac.tag_nl!==false){var ae=(ad.parent)?ad.parent.padding:I.repeatString(X(),ah),ag=(ac.tag_nl===true),ab=U(ad,ac);if(ad.type!="text"){if(((ad.isBlock()||ab)&&ad.parent)||ag){if(!ad.parent||(ad.parent.type!="snippet"&&!aa(ad))){ad.start=S()+ae+ad.start;}if(ad.hasBlockChildren()||Y(ad,ac)||(ag&&!af)){ad.end=S()+ae+ad.end;}if(ad.hasTagsInContent()||(ag&&!ad.hasChildren()&&!af)){ad.start+=S()+ae+X();}}else{if(ad.isInline()&&e(ad)&&!aa(ad)){ad.start=S()+ae+ad.start;}else{if(ad.isInline()&&ad.hasBlockChildren()){ad.end=S()+ae+ad.end;}}}ad.padding=ae+X();}}return ad;}function R(ab,ae,ag){ag=ag||0;for(var ad=0,ac=ab.children.length;ad<ac;ad++){var af=ab.children[ad];af=(af.type=="tag")?T(af,ae,ag):Z(af,ae,ag);if(af.content){af.content=I.padString(af.content,af.padding);}R(af,ae,ag+1);}return ab;}I.registerFilter("_format",R);})();(function(){var e="${child}";function T(af,W){var ac="",Y=W.attr_quotes=="single"?"'":'"',ad=W.place_cursor?I.getCaretPlaceholder():"",ae,Z,ab;for(Z=0;Z<af.attributes.length;Z++){ab=af.attributes[Z];switch(ab.name.toLowerCase()){case"id":ac+="#"+(ab.value||ad);break;case"class":ac+="."+(ab.value||ad);break;}}var X=[];for(Z=0;Z<af.attributes.length;Z++){ab=af.attributes[Z];var aa=ab.name.toLowerCase();if(aa!="id"&&aa!="class"){ae=(W.attr_case=="upper")?ab.name.toUpperCase():aa;X.push(":"+ae+" => "+Y+(ab.value||ad)+Y);}}if(X.length){ac+="{"+X.join(", ")+"}";}return ac;}function R(ae,Y,W){var ac=ae.source.value;if(!ac){return V(ae,Y,W);}var ab=ac.split(e),X=ab[0]||"",aa=ab[1]||"",ad=ae.parent?ae.parent.padding:"";ae.start=ae.start.replace("%s",I.padString(X,ad));ae.end=ae.endLine truncated
var Z=function(ag,af){if(af=="id"||af=="class"){return ae.getAttribute(af);}else{return ag;}};ae.start=I.replaceVariables(ae.start,Z);ae.end=I.replaceVariables(ae.end,Z);return ae;}function S(W){return(W.parent&&W.parent.hasBlockChildren());}function V(ai,ab,W){if(!ai.name){return ai;}var ag=T(ai,ab),ad="",ah=ab.place_cursor?I.getCaretPlaceholder():"",aa="",X=(ai.isUnary()&&!ai.children.length),Y="",ac="";if(ab.self_closing_tag&&X){aa="/";}var Z="%"+((ab.tag_case=="upper")?ai.name.toUpperCase():ai.name.toLowerCase());if(Z.toLowerCase()=="%div"&&ag&&ag.indexOf("{")==-1){Z="";}ai.end="";Y=Z+ag+aa;var af="%s";var ae=ai.start.indexOf(af);ai.start=ai.start.substring(0,ae)+Y+ai.start.substring(ae+af.length);if(!ai.children.length&&!X){ai.start+=ah;}return ai;}function U(W,aa,ac){ac=ac||0;if(ac==0){W=I.runFilters(W,aa,"_format");}for(var Z=0,Y=W.children.length;Z<Y;Z++){var ab=W.children[Z];ab=(ab.type=="tag")?V(ab,aa,ac):R(ab,aa,ac);var X=I.getCounterForNode(ab);ab.start=I.unescapeText(I.replaceCounter(ab.start,X));ab.end=I.unescapeText(I.replaceCounter(ab.end,X));U(ab,aa,ac+1);}return W;}I.registerFilter("haml",U);})();(function(){var e="${child}",W=0;function U(Z,Y){switch(String(Y||"").toLowerCase()){case"lower":return Z.toLowerCase();case"upper":return Z.toUpperCase();}return Z;}function T(Y,ad){var ab="",aa=ad.attr_quotes=="single"?"'":'"',af=ad.place_cursor?I.getCaretPlaceholder():"",ae;for(var ac=0;ac<Y.attributes.length;ac++){var Z=Y.attributes[ac];ae=U(Z.name,ad.attr_case);ab+=" "+ae+"="+aa+(Z.value||af)+aa;}return ab;}function R(ag,aa,Y){var ae=ag.source.value;if(!ae){return X(ag,aa,Y);}var ad=ae.split(e),Z=ad[0]||"",ac=ad[1]||"",af=ag.parent?ag.parent.padding:"";ag.start=ag.start.replace("%s",I.padString(Z,af));ag.end=ag.end.replace("%s",I.padString(ac,af));var ab=function(ai,ah){if(ah=="id"||ah=="class"){return ag.getAttribute(ah);}else{return ai;}};ag.start=I.replaceVariables(ag.start,ab);ag.end=I.replaceVariables(ag.end,ab);return ag;}function S(Y){return(Y.parent&&Y.parent.hasBlockChildren());}function X(ak,ad,Y){if(!ak.name){return ak;}var ai=T(ak,ad),af="",aj=ad.place_cursor?I.getCaretPlaceholder():"",ac="",Z=(ak.isUnary()&&!ak.children.length),aa="",ae="";if(ad.self_closing_tag=="xhtml"){ac=" /";}else{if(ad.self_closing_tag===true){ac="/";}}if(ak.type!="text"){var ab=U(ak.name,ad.tag_case);if(Z){aa="<"+ab+ai+ac+">";ak.end="";}else{aa="<"+ab+ai+">";ae="</"+ab+">";}}var ah="%s";var ag=ak.start.indexOf(ah);ak.start=ak.start.substring(0,ag)+aa+ak.start.substring(ag+ah.length);ag=ak.end.indexOf(ah);ak.end=ak.end.substring(0,ag)+ae+ak.end.substring(ag+ah.length);if(!ak.children.length&&!Z&&ak.content.indexOf(aj)==-1){ak.start+=aj;}return ak;}function V(Y,ac,ae){ae=ae||0;if(ae==0){Y=I.runFilters(Y,ac,"_format");W=0;}for(var ab=0,aa=Y.children.length;ab<aa;ab++){var ad=Y.children[ab];ad=(ad.type=="tag")?X(ad,ac,ae):R(ad,ac,ae);var Z=I.getCounterForNode(ad);ad.start=I.unescapeText(I.replaceCounter(ad.start,Z));ad.end=I.unescapeText(I.replaceCounter(ad.end,Z));ad.content=I.unescapeText(I.replaceCounter(ad.content,Z));W+=I.upgradeTabstops(ad,W)+1;V(ad,ac,ae+1);}return Y;}I.registerFilter("html",V);})();(function(){function e(R,V,Y){for(var U=0,T=R.children.length;U<T;U++){var W=R.children[U];if(W.type=="tag"){var X=/^\s+/;W.start=W.start.replace(X,"");W.end=W.end.replace(X,"");}var S=/[\n\r]/g;W.start=W.start.replace(S,"");W.end=W.end.replace(S,"");W.content=W.content.replace(S,"");e(W);}return R;}I.registerFilter("s",e);})();(function(){function e(R,U,W){for(var T=0,S=R.children.length;T<S;T++){var V=R.children[T];if(V.content){V.content=V.content.replace(/^([\s|\u00a0])?[\d|#|\-|\*|\u2022]+\.?\s*/,"$1");}e(V);}return R;}I.registerFilter("t",e);})();(function(){var R={"xsl:variable":1,"xsl:with-param":1};function e(T){T.start=T.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");}function S(T){for(var V=0,U=T.children.length;V<U;V++){var W=T.children[V];if(W.type=="tag"&&W.name.toLowerCase() in R&&W.children.length){e(W);}S(W);}}I.registerFilter("xsl",S);})();var d=(function(){var U=!!window.opera,T=/mac\s+os/i.test(navigator.userAgent),V={"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":'"',",":"<",".":">","/":"?","\\":"|"},S={"esc":27,"escape":27,"tab":9,"space":32,"return":13,"enter":13,"backspace":8,"scrolllock":145,"scroll_lock":145,"scroll":145,"capslock":20,"caps_lock":20,"caps":20,"numlock":144,"num_lock":144,"num":144,"pause":19,"break":19,"insert":45,"home":36,"delete":46,"end":35,"pageup":33,"page_up":33,"pu":33,"pagedown":34,"page_down":34,"pd":34,"plus":187,"minus":189,"left":37,"up":38,"right":39,"down":40,"f1":112,"f2":113,"f3":114,"f4":115,"f5":116,"f6":117,"f7":118,"f8":119,"f9":120,"f10":121,"f11":122,"f12":123},R={"ctrl":"⌃","control":"⌃","meta":"⌘","shift":"⇧","alt":"⌥","enter":"⏎","tab":"⇥","left":"←","right":"→","up":"↑","down":"↓"},X={"meta":"Ctrl","control":"Ctrl","left":"←","right":"→","up":"Line truncated
function e(Y){return Y.charAt().toUpperCase()+Y.substring(1);}return{compile:function(ad){if(typeof ad!="string"){return ad;}var Y=0,ae=ad.toLowerCase().split("+"),ac,aa;for(var ab=0,Z=ae.length;ab<Z;ab++){aa=ae[ab];if(T&&U){if(aa=="ctrl"||aa=="control"){aa="meta";}else{if(aa=="meta"){aa="ctrl";}}}else{if(!T&&aa=="meta"){aa="ctrl";}}if(aa=="ctrl"||aa=="control"){Y|=W.CTRL;}else{if(aa=="shift"){Y|=W.SHIFT;}else{if(aa=="alt"){Y|=W.ALT;}else{if(aa=="meta"){Y|=W.META;}else{ac=aa;}}}}}return{mask:Y,key:ac};},test:function(aa,Z){var Y=0,ab=this.compile(aa);if(Z.ctrlKey){Y|=W.CTRL;}if(Z.shiftKey){Y|=W.SHIFT;}if(Z.altKey){Y|=W.ALT;}if(Z.metaKey){Y|=W.META;}var ac=Z.keyCode?Z.keyCode:Z.which,ad=String.fromCharCode(ac).toLowerCase();if(Y!==ab.mask){return false;}if(ab.key.length>1){return S[ab.key]==ac;}else{if(ac==188){ad=",";}if(ac==190){ad=".";}if(ac==191){ad="/";}if(ad==ab.key){return true;}if(Z.shiftKey&&V[ad]){return V[ad]==ab.key;}}return false;},format:function(ae){var ad=T?R:X,ac=T?"":"+",ab=ae.toLowerCase().split("+"),Y=[],aa;for(var Z=0;Z<ab.length;Z++){aa=ab[Z];Y.push(aa in ad?ad[aa]:e(aa));}return Y.join(ac);}};})();var k=(function(){var ab,S={balance_tag_inward:"match_pair_inward",balance_tag_outward:"match_pair_outward",previous_edit_point:"prev_edit_point",pretty_break:"insert_formatted_line_break"},X={};function Y(ac){return ab.lineContent(ab.nthLine(ac))||"";}function T(){var ac=0,ad=ab.lineNumber(ab.cursorLine())-1;while(ad>0){ac+=Y(ad).length+1;ad--;}return ac;}function e(ac){return(ac.match(/^(\s+)/)||[""])[0];}function V(af){var ae=0,ac=af.indexOf(I.getCaretPlaceholder()),ad={};if(ac!=-1){af=af.split(I.getCaretPlaceholder()).join("");}else{ac=af.length;}af=I.processTextBeforePaste(af,function(ag){return ag;},function(ah,ag,ai){if(ai){ad[ag]=ai;}if(ah<ac){ac=ah;if(ai){ae=ai.length;}}return ad[ag]||"";});return[af,ac,ac+ae];}function W(ah,ad){var af,ae,ac;for(var ag in X){if(X.hasOwnProperty(ag)){af=X[ag];if(d.test(af.compiled,ad)){ad.preventDefault();ae=S[af.action]||af.action;ac=I.runAction(ae,[k]);return(ae=="expand_abbreviation")?ac:true;}}}return false;}function Z(){}function U(ag){var af=0,ac=0;for(var ae=1,ad=ab.lineNumber(ab.lastLine());ae<=ad;ae++){ac=af+Y(ae).length;if(af<=ag&&ag<=ac){return{line:ab.nthLine(ae),character:ag-af};}af=ac+1;}return null;}function aa(ac){return ac.replace(/(^\s+|\s+$)/g,"").replace(/[\s\\\/]+/g,"_").replace(/\./g,"").toLowerCase();}function R(ae,ac,ad){X[ae.toLowerCase()]={compiled:d.compile(ae),label:ac,action:aa(ad||ac)};}R("Meta+E","Expand Abbreviation");R("Tab","Expand Abbreviation");R("Meta+D","Balance Tag Outward");R("Shift+Meta+D","Balance Tag inward");R("Shift+Meta+A","Wrap with Abbreviation");R("Ctrl+Alt+RIGHT","Next Edit Point");R("Ctrl+Alt+LEFT","Previous Edit Point");R("Meta+L","Select Line");R("Meta+Shift+M","Merge Lines");R("Meta+/","Toggle Comment");R("Meta+J","Split/Join Tag");R("Meta+K","Remove Tag");R("Meta+Y","Evaluate Math Expression");R("Ctrl+UP","Increment number by 1");R("Ctrl+DOWN","Decrement number by 1");R("Alt+UP","Increment number by 0.1");R("Alt+DOWN","Decrement number by 0.1");R("Ctrl+Alt+UP","Increment number by 10");R("Ctrl+Alt+DOWN","Decrement number by 10");R("Meta+.","Select Next Item");R("Meta+,","Select Previous Item");R("Meta+B","Reflect CSS Value");return{bind:function(ac){var ad=this;ac.grabKeys(Z,function(af,ae){if(ae.type=="keydown"){ad.setContext(ac);return W(af,ae);}});},setContext:function(ac){ab=ac;I.setVariable("indentation",I.repeatString(" ",ab.options.indentUnit));},getSelectionRange:function(){var ac=this.getCaretPos();return{start:ac,end:ac+this.getSelection().length};},createSelection:function(af,ad){var ac=U(af);if(af==ad){ab.selectLines(ac.line,ac.character);}else{var ae=U(ad);ab.selectLines(ac.line,ac.character,ae.line,ae.character);}},getCurrentLineRange:function(){var ac=this.getCurrentLine().length,ad=T();return{start:ad,end:ad+ac};},getCaretPos:function(){return ab.cursorPosition().character+T();},setCaretPos:function(ac){this.createSelection(ac,ac);},getCurrentLine:function(){return ab.lineContent(ab.cursorLine())||"";},replaceContent:function(ae,ah,ad){var ac=this.getCaretPos(),ah=typeof(ah)!=="undefined"?ah:0,ad=typeof(ad)!=="undefined"?ad:this.getContent().length;ae=I.padString(ae,e(this.getCurrentLine()));if(ab.win.asEditorLines){ae=ab.win.asEditorLines(ae).join(I.getNewline());}var ag=V(ae);ae=ag[0];ah=ah||0;if(ag[1]!==-1){ag[1]+=ah;ag[2]+=ah;}else{ag[1]=ag[2]=ae.length+ah;}try{this.createSelection(ah,ad);ab.editor.replaceSelection(ae);this.createSelection(ag[1],ag[2]);}catch(af){}},getContent:function(){return ab.getCode();},getSyntax:function(){var ad=ab.options.syntax||"",ac=this.getCaretPos();if(!K.hasSyntax(ad)){ad="html";}if(ad=="html"){var ae=I.html_matcher.getTags(this.getContent(),ac);if(ae&&ae[0]&&ae[0].type=="tag"&&ae[0].name.toLowerCase()=="style"){if(ae[0].end<=ac&&ae[1].start>=ac){ad="css";}}}return ad;},getProfileName:function(){if(ab.options.profile){return ab.options.profile;}Line truncated
case"html":var ac=I.getVariable("profile");if(!ac){ac=this.getContent().search(/<!DOCTYPE[^>]+XHTML/)!=-1?"xhtml":"html";}return ac;}return"xhtml";},prompt:function(ac){return prompt(ac);},getSelection:function(){return ab.selection()||"";},getFilePath:function(){return location.href;},shortcut:R,unbindShortcut:function(ac){ac=ac.toLowerCase();if(ac in X){delete X[ac];}},getShortcuts:function(){var ac=[],ad;for(var ae in X){if(X.hasOwnProperty(ae)){ad=ae.toLowerCase();if(ad=="tab"||ad=="enter"){continue;}ac.push({keystroke:d.format(ae),compiled:X[ae].compiled,label:X[ae].label,action:X[ae].action});}}return ac;},getInfo:function(){var ae="This CodeMirror editor is powered by Zen Coding project: "+"a set of tools for fast HTML coding.\n\n"+"Available shortcuts:\n";var ad=this.getShortcuts(),af=[];for(var ac=0;ac<ad.length;ac++){af.push(ad[ac].keystroke+" — "+ad[ac].label);}ae+=af.join("\n")+"\n\n";ae+="More info on http://code.google.com/p/zen-coding/";return ae;},showInfo:function(){alert(this.getInfo());},getCore:function(){return I;},getResourceManager:function(){return K;}};})();return k;})();
@@ -0,0 +1,2 @@
/*! jQuery Mobile vGit Build: SHA1: c2d61e2e592c67519d9a9ed0ba796fa44787e136 <> Date: Tue Sep 25 10:38:12 2012 -0700 jquerymobile.com | jquery.org/license !*/
.ui-bar-a{border:1px solid #333;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from( #3c3c3c ),to( #111 ));background-image:-webkit-linear-gradient( #3c3c3c,#111 );background-image:-moz-linear-gradient( #3c3c3c,#111 );background-image:-ms-linear-gradient( #3c3c3c,#111 );background-image:-o-linear-gradient( #3c3c3c,#111 );background-image:linear-gradient( #3c3c3c,#111 )}.ui-bar-a,.ui-bar-a input,.ui-bar-a select,.ui-bar-a textarea,.ui-bar-a button{font-family:Helvetica,Arial,sans-serif}.ui-bar-a .ui-link-inherit{color:#fff}.ui-bar-a a.ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-a a.ui-link:visited{color:#2489ce}.ui-bar-a a.ui-link:hover{color:#2489ce}.ui-bar-a a.ui-link:active{color:#2489ce}.ui-body-a,.ui-overlay-a{border:1px solid #444;background:#222;color:#fff;text-shadow:0 1px 1px #111;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from( #444 ),to( #222 ));background-image:-webkit-linear-gradient( #444,#222 );background-image:-moz-linear-gradient( #444,#222 );background-image:-ms-linear-gradient( #444,#222 );background-image:-o-linear-gradient( #444,#222 );background-image:linear-gradient( #444,#222 )}.ui-overlay-a{background-image:none;border-width:0}.ui-body-a,.ui-body-a input,.ui-body-a select,.ui-body-a textarea,.ui-body-a button{font-family:Helvetica,Arial,sans-serif}.ui-body-a .ui-link-inherit{color:#fff}.ui-body-a .ui-link{color:#2489ce;font-weight:bold}.ui-body-a .ui-link:visited{color:#2489ce}.ui-body-a .ui-link:hover{color:#2489ce}.ui-body-a .ui-link:active{color:#2489ce}.ui-btn-up-a{border:1px solid #111;background:#333;font-weight:bold;color:#fff;text-shadow:0 1px 1px #111;background-image:-webkit-gradient(linear,left top,left bottom,from( #444 ),to( #2d2d2d ));background-image:-webkit-linear-gradient( #444,#2d2d2d );background-image:-moz-linear-gradient( #444,#2d2d2d );background-image:-ms-linear-gradient( #444,#2d2d2d );background-image:-o-linear-gradient( #444,#2d2d2d );background-image:linear-gradient( #444,#2d2d2d )}.ui-btn-up-a:visited,.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 1px 1px #111;background-image:-webkit-gradient(linear,left top,left bottom,from( #555 ),to( #383838 ));background-image:-webkit-linear-gradient( #555,#383838 );background-image:-moz-linear-gradient( #555,#383838 );background-image:-ms-linear-gradient( #555,#383838 );background-image:-o-linear-gradient( #555,#383838 );background-image:linear-gradient( #555,#383838 )}.ui-btn-hover-a:visited,.ui-btn-hover-a:hover,.ui-btn-hover-a a.ui-link-inherit{color:#fff}.ui-btn-down-a{border:1px solid #000;background:#222;font-weight:bold;color:#fff;text-shadow:0 1px 1px #111;background-image:-webkit-gradient(linear,left top,left bottom,from( #202020 ),to( #2c2c2c ));background-image:-webkit-linear-gradient( #202020,#2c2c2c );background-image:-moz-linear-gradient( #202020,#2c2c2c );background-image:-ms-linear-gradient( #202020,#2c2c2c );background-image:-o-linear-gradient( #202020,#2c2c2c );background-image:linear-gradient( #202020,#2c2c2c )}.ui-btn-down-a:visited,.ui-btn-down-a:hover,.ui-btn-down-a a.ui-link-inherit{color:#fff}.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 1px 1px #3e6790;background-image:-webkit-gradient(linear,left top,left bottom,from( #6facd5 ),to( #497bae ));background-image:-webkit-linear-gradient( #6facd5,#497bae );background-image:-moz-linear-gradient( #6facd5,#497bae );background-image:-ms-linear-gradient( #6facd5,#497bae );background-image:-o-linear-gradient( #6facd5,#497bae );background-image:linear-gradient( #6facd5,#497bae )}.ui-bar-b,.ui-bar-b input,.ui-bar-b select,.ui-bar-b textarea,.ui-bar-b button{font-family:Helvetica,Arial,sans-serif}.ui-bar-b .ui-link-inherit{color:#fff}.ui-bar-b a.ui-link{color:#ddf0f8;font-weight:bold}.ui-bar-b a.ui-link:visited{color:#ddf0f8}.ui-bar-b a.ui-link:hover{color:#ddf0f8}.ui-bar-b a.ui-link:active{color:#ddf0f8}.ui-body-b,.ui-overlay-b{border:1px solid #999;background:#f3f3f3;color:#222;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from( #ddd ),to( #ccc ));background-image:-webkit-linear-gradient( #ddd,#ccc );background-image:-moz-linear-gradient( #ddd,#ccc );background-image:-ms-linear-gradient( #ddd,#ccc );background-image:-o-linear-gradient( #ddd,#ccc );background-image:linear-gradient( #ddd,#ccc )}.ui-overlay-b{background-image:none;border-width:0}.ui-body-b,.ui-body-b input,.ui-body-b select,.ui-body-b textarea,.ui-body-b button{font-family:Helvetica,Arial,sans-serif}.ui-body-b .ui-link-inherit{color:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-body-b .ui-link:visited{color:#2489ce}.ui-body-b .ui-link:hover{color:#24Line truncated
@@ -0,0 +1,2 @@
/*! jQuery Mobile vGit Build: SHA1: c2d61e2e592c67519d9a9ed0ba796fa44787e136 <> Date: Tue Sep 25 10:38:12 2012 -0700 jquerymobile.com | jquery.org/license !*/
(function(a,b,c){typeof define=="function"&&define.amd?define(["jquery"],function(d){return c(d,a,b),d.mobile}):c(a.jQuery,a,b)})(this,document,function(a,b,c,d){(function(a,b,d){var e={};a.mobile=a.extend({},{version:"1.2.0",ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",focusClass:"ui-focus",ajaxEnabled:!0,hashListeningEnabled:!0,linkBindingEnabled:!0,defaultPageTransition:"fade",maxTransitionWidth:!1,minScrollBack:250,touchOverflowEnabled:!1,defaultDialogTransition:"pop",pageLoadErrorMessage:"Error Loading Page",pageLoadErrorMessageTheme:"e",phonegapNavigationEnabled:!1,autoInitializePage:!0,pushStateEnabled:!0,ignoreContentEnabled:!1,orientationChangeEnabled:!0,buttonMarkup:{hoverDelay:200},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},silentScroll:function(d){a.type(d)!=="number"&&(d=a.mobile.defaultHomeScroll),a.event.special.scrollstart.enabled=!1,setTimeout(function(){b.scrollTo(0,d),a(c).trigger("silentscroll",{x:0,y:d})},20),setTimeout(function(){a.event.special.scrollstart.enabled=!0},150)},nsNormalizeDict:e,nsNormalize:function(b){if(!b)return;return e[b]||(e[b]=a.camelCase(a.mobile.ns+b))},getInheritedTheme:function(a,b){var c=a[0],d="",e=/ui-(bar|body|overlay)-([a-z])\b/,f,g;while(c){f=c.className||"";if(f&&(g=e.exec(f))&&(d=g[2]))break;c=c.parentNode}return d||b||"a"},closestPageData:function(a){return a.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("page")},enhanceable:function(a){return this.haveParents(a,"enhance")},hijackable:function(a){return this.haveParents(a,"ajax")},haveParents:function(b,c){if(!a.mobile.ignoreContentEnabled)return b;var d=b.length,e=a(),f,g,h;for(var i=0;i<d;i++){g=b.eq(i),h=!1,f=b[i];while(f){var j=f.getAttribute?f.getAttribute("data-"+a.mobile.ns+c):"";if(j==="false"){h=!0;break}f=f.parentNode}h||(e=e.add(g))}return e},getScreenHeight:function(){return b.innerHeight||a(b).height()}},a.mobile),a.fn.jqmData=function(b,c){var e;return typeof b!="undefined"&&(b&&(b=a.mobile.nsNormalize(b)),arguments.length<2||c===d?e=this.data(b):e=this.data(b,c)),e},a.jqmData=function(b,c,d){var e;return typeof c!="undefined"&&(e=a.data(b,c?a.mobile.nsNormalize(c):c,d)),e},a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))},a.jqmRemoveData=function(b,c){return a.removeData(b,a.mobile.nsNormalize(c))},a.fn.removeWithDependents=function(){a.removeWithDependents(this)},a.removeWithDependents=function(b){var c=a(b);(c.jqmData("dependents")||a()).remove(),c.remove()},a.fn.addDependents=function(b){a.addDependents(a(this),b)},a.addDependents=function(b,c){var d=a(b).jqmData("dependents")||a();a(b).jqmData("dependents",a.merge(d,c))},a.fn.getEncodedText=function(){return a("<div/>").text(a(this).text()).html()},a.fn.jqmEnhanceable=function(){return a.mobile.enhanceable(this)},a.fn.jqmHijackable=function(){return a.mobile.hijackable(this)};var f=a.find,g=/:jqmData\(([^)]*)\)/g;a.find=function(b,c,d,e){return b=b.replace(g,"[data-"+(a.mobile.ns||"")+"$1]"),f.call(this,b,c,d,e)},a.extend(a.find,f),a.find.matches=function(b,c){return a.find(b,null,null,c)},a.find.matchesSelector=function(b,c){return a.find(c,null,null,[b]).length>0}})(a,this),function(a,b){var c=0,d=Array.prototype.slice,e=a.cleanData;a.cleanData=function(b){for(var c=0,d;(d=b[c])!=null;c++)try{a(d).triggerHandler("remove")}catch(f){}e(b)},a.widget=function(b,c,d){var e,f,g,h,i=b.split(".")[0];b=b.split(".")[1],e=i+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][e]=function(b){return!!a.data(b,e)},a[i]=a[i]||{},f=a[i][b],g=a[i][b]=function(a,b){if(!this._createWidget)return new g(a,b);arguments.length&&this._createWidget(a,b)},a.extend(g,f,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),h=new c,h.options=a.widget.extend({},h.options),a.each(d,function(b,e){a.isFunction(e)&&(d[b]=function(){var a=function(){return c.prototype[b].apply(this,arguments)},d=function(a){return c.prototype[b].apply(this,a)};return function(){var b=this._super,c=this._superApply,f;return this._super=a,this._superApply=d,f=e.apply(this,arguments),this._super=b,this._superApply=c,f}}())}),g.prototype=a.widget.extend(h,{widgetEventPrefix:b},d,{constructor:g,namespace:i,widgetName:b,widgetBaseClass:e,widgetFullName:e}),f?(a.each(f._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,g,c._proto)}),delete f._childConstructors):c._childConstructors.push(g),a.widget.bridge(b,g)},a.widget.extend=function(c){var e=d.call(arguments,1),f=0,g=e.length,h,i;for(;f<g;f++)for(h in e[f])i=e[f][h],e[f].hasOwnProperty(h)&&i!==b&&(c[h]=a.isPlainObject(i)?a.widget.extend({},c[h],i):i);return c},a.widget.bridge=fuLine truncated
+81 -111
View File
@@ -11,7 +11,7 @@ Basic caching classes and methods
- Cache - The generic caching object interfacing with the others
- CacheInRam - providing caching in ram
- CacheInDisk - provides caches on disk
- CacheOnDisk - provides caches on disk
Memcache is also available via a different module (see gluon.contrib.memcache)
@@ -130,22 +130,27 @@ class CacheInRam(CacheAbstract):
meta_storage = {}
def __init__(self, request=None):
self.locker.acquire()
self.initialized = False
self.request = request
def initialize(self):
if self.initialized: return
else: self.initialized = True
self.locker.acquire()
request = self.request
if request:
app = request.application
else:
app = ''
if not app in self.meta_storage:
self.storage = self.meta_storage[app] = {CacheAbstract.cache_stats_name: {
'hit_total': 0,
'misses': 0,
}}
self.storage = self.meta_storage[app] = {
CacheAbstract.cache_stats_name: {'hit_total': 0, 'misses': 0}}
else:
self.storage = self.meta_storage[app]
self.locker.release()
def clear(self, regex=None):
self.initialize()
self.locker.acquire()
storage = self.storage
if regex is None:
@@ -154,10 +159,7 @@ class CacheInRam(CacheAbstract):
self._clear(storage, regex)
if not CacheAbstract.cache_stats_name in storage.keys():
storage[CacheAbstract.cache_stats_name] = {
'hit_total': 0,
'misses': 0,
}
storage[CacheAbstract.cache_stats_name] = {'hit_total': 0,'misses': 0}
self.locker.release()
@@ -172,6 +174,7 @@ class CacheInRam(CacheAbstract):
3) would work unless we deepcopy no storage and retrival which would make things slow.
Anyway. You can deepcopy explicitly in the function generating the value to be cached.
"""
self.initialize()
dt = time_expire
now = time.time()
@@ -200,6 +203,7 @@ class CacheInRam(CacheAbstract):
return value
def increment(self, key, value=1):
self.initialize()
self.locker.acquire()
try:
if key in self.storage:
@@ -226,58 +230,65 @@ class CacheOnDisk(CacheAbstract):
Values stored in disk cache must be pickable.
"""
speedup_checks = set()
def _close_shelve_and_unlock(self):
try:
if self.storage:
self.storage.close()
finally:
if self.locker and self.locked:
portalocker.unlock(self.locker)
self.locker.close()
self.locked = False
def _open_shelf_with_lock(self):
def _open_shelve_and_lock(self):
"""Open and return a shelf object, obtaining an exclusive lock
on self.locker first. Replaces the close method of the
returned shelf instance with one that releases the lock upon
closing."""
def _close(self):
try:
shelve.Shelf.close(self)
finally:
portalocker.unlock(self.locker)
self.locker.close()
storage, locker, locker_locked = None, None, False
storage = None
locker = None
locked = False
try:
locker = open(self.locker_name, 'a')
locker = locker = open(self.locker_name, 'a')
portalocker.lock(locker, portalocker.LOCK_EX)
locker_locked = True
storage = shelve.open(self.shelve_name)
storage.close = _close.__get__(storage, shelve.Shelf)
storage.locker = locker
except Exception:
logger.error('corrupted cache file %s, will try to delete and recreate it!' % (self.shelve_name))
locked = True
try:
storage = shelve.open(self.shelve_name)
except:
logger.error('corrupted cache file %s, will try rebuild it' \
% (self.shelve_name))
storage = None
if not storage and os.path.exists(self.shelve_name):
os.unlink(self.shelve_name)
storage = shelve.open(self.shelve_name)
if not CacheAbstract.cache_stats_name in storage.keys():
storage[CacheAbstract.cache_stats_name] = {'hit_total':0, 'misses': 0}
storage.sync()
except Exception, e:
if storage:
storage.close()
storage = None
try:
os.unlink(self.shelve_name)
storage = shelve.open(self.shelve_name)
storage.close = _close.__get__(storage, shelve.Shelf)
storage.locker = locker
if not CacheAbstract.cache_stats_name in storage.keys():
storage[CacheAbstract.cache_stats_name] = {
'hit_total': 0,
'misses': 0,
}
storage.sync()
except (IOError, OSError):
logger.warn('unable to delete and recreate cache file %s' % self.shelve_name)
if storage:
storage.close()
storage = None
if locker_locked:
portalocker.unlock(locker)
if locker:
locker.close()
if locked:
portalocker.unlock(locker)
locker.close()
locked = False
raise RuntimeError, 'unable to create/re-create cache file %s' % self.shelve_name
self.locker = locker
self.locked = locked
self.storage = storage
return storage
def __init__(self, request, folder=None):
def __init__(self, request=None, folder=None):
self.initialized = False
self.request = request
self.folder = folder
def initialize(self):
if self.initialized: return
else: self.initialized = True
folder = self.folder
request = self.request
# Lets test if the cache folder exists, if not
# we are going to create it
@@ -291,93 +302,54 @@ class CacheOnDisk(CacheAbstract):
self.locker_name = os.path.join(folder,'cache.lock')
self.shelve_name = os.path.join(folder,'cache.shelve')
speedup_key = (folder,CacheAbstract.cache_stats_name)
if not speedup_key in self.speedup_checks or \
not os.path.exists(self.shelve_name):
try:
storage = self._open_shelf_with_lock()
try:
if not CacheAbstract.cache_stats_name in storage:
storage[CacheAbstract.cache_stats_name] = {
'hit_total': 0,
'misses': 0,
}
storage.sync()
finally:
storage.close()
self.speedup_checks.add(speedup_key)
except ImportError:
pass # no module _bsddb, ignoring exception now so it makes a ticket only if used
def clear(self, regex=None):
storage = self._open_shelf_with_lock()
self.initialize()
storage = self._open_shelve_and_lock()
try:
if regex is None:
storage.clear()
else:
self._clear(storage, regex)
if not CacheAbstract.cache_stats_name in storage.keys():
storage[CacheAbstract.cache_stats_name] = {
'hit_total': 0,
'misses': 0,
}
storage.sync()
finally:
storage.close()
self._close_shelve_and_unlock()
def __call__(self, key, f,
time_expire = DEFAULT_TIME_EXPIRE):
self.initialize()
dt = time_expire
storage = self._open_shelf_with_lock()
storage = self._open_shelve_and_lock()
try:
item = storage.get(key, None)
storage[CacheAbstract.cache_stats_name]['hit_total'] += 1
if item and f is None:
del storage[key]
storage[CacheAbstract.cache_stats_name] = {
'hit_total': storage[CacheAbstract.cache_stats_name]['hit_total'] + 1,
'misses': storage[CacheAbstract.cache_stats_name]['misses']
}
storage.sync()
storage.sync()
now = time.time()
if f is None:
value = None
elif item and (dt is None or item[0] > now - dt):
value = item[1]
else:
value = f()
storage[key] = (now, value)
storage[CacheAbstract.cache_stats_name]['misses']+=1
storage.sync()
finally:
if storage:
storage.close()
now = time.time()
if f is None:
return None
if item and (dt is None or item[0] > now - dt):
return item[1]
value = f()
storage = self._open_shelf_with_lock()
try:
storage[key] = (now, value)
storage[CacheAbstract.cache_stats_name] = {
'hit_total': storage[CacheAbstract.cache_stats_name]['hit_total'],
'misses': storage[CacheAbstract.cache_stats_name]['misses'] + 1
}
storage.sync()
finally:
if storage:
storage.close()
self._close_shelve_and_unlock()
return value
def increment(self, key, value=1):
storage = self._open_shelf_with_lock()
self.initialize()
storage = self._open_shelve_and_lock()
try:
if key in storage:
value = storage[key][1] + value
storage[key] = (time.time(), value)
storage.sync()
finally:
if storage:
storage.close()
self._close_shelve_and_unlock()
return value
class CacheAction(object):
@@ -423,10 +395,9 @@ class Cache(object):
the global request object
"""
# GAE will have a special caching
if have_settings and settings.global_settings.web2py_runtime_gae:
from contrib.gae_memcache import MemcacheClient
self.ram=self.disk=MemcacheClient(request)
self.ram = self.disk = MemcacheClient(request)
else:
# Otherwise use ram (and try also disk)
self.ram = CacheInRam(request)
@@ -489,7 +460,6 @@ class Cache(object):
cache_model(prefix + key, f, time_expire)
def lazy_cache(key=None,time_expire=None,cache_model='ram'):
"""
can be used to cache any function including in modules,
+1
View File
@@ -387,6 +387,7 @@ def build_environment(request, response, session, store_current=True):
t = environment['T'] = translator(request)
c = environment['cache'] = Cache(request)
if store_current:
current.globalenv = environment
current.request = request
+1 -1
View File
@@ -44,7 +44,7 @@ class MemcacheClient(Client):
obj = self.get(key)
if obj:
value = obj[1] + value
self.set((time.time(), value))
self.set(key, (time.time(), value))
return value
def clear(self, key = None):
+198
View File
@@ -0,0 +1,198 @@
"""
Developed by niphlod@gmail.com
"""
import redis
from redis.exceptions import ConnectionError
from gluon import current
from gluon.storage import Storage
import cPickle as pickle
import time
import re
import logging
import thread
logger = logging.getLogger("web2py.session.redis")
locker = thread.allocate_lock()
def RedisSession(*args, **vars):
"""
Usage example: put in models
sessiondb = RedisSession('localhost:6379',db=0, debug=True)
session.connect(request, response, db = sessiondb)
Simple slip-in storage for session
"""
locker.acquire()
try:
if not hasattr(RedisSession, 'redis_instance'):
RedisSession.redis_instance = RedisClient(*args, **vars)
finally:
locker.release()
return RedisSession.redis_instance
class RedisClient(object):
meta_storage = {}
MAX_RETRIES = 5
RETRIES = 0
def __init__(self, server='localhost:6379', db=None, debug=False, session_expiry=False):
"""session_expiry can be an integer, in seconds, to set the default expiration
of sessions. The corresponding record will be deleted from the redis instance,
and there's virtually no need to run sessions2trash.py
"""
self.server = server
self.db = db or 0
host,port = (self.server.split(':')+['6379'])[:2]
port = int(port)
self.debug = debug
if current and current.request:
self.app = current.request.application
else:
self.app = ''
self.r_server = redis.Redis(host=host, port=port, db=self.db)
self.tablename = None
self.session_expiry = session_expiry
def get(self, what, default):
return self.tablename
def Field(self, fieldname, type='string', length=None, default=None,
required=False,requires=None):
return None
def define_table(self,tablename,*fields,**args):
if not self.tablename:
self.tablename = MockTable(self, self.r_server, tablename, self.session_expiry)
return self.tablename
def __getitem__(self, key):
return self.tablename
def __call__(self, where=''):
q = self.tablename.query
return q
def commit(self):
#this is only called by session2trash.py
pass
class MockTable(object):
def __init__(self, db, r_server, tablename, session_expiry):
self.db = db
self.r_server = r_server
self.tablename = tablename
#set the namespace for sessions of this app
self.keyprefix = 'w2p:sess:%s' % tablename.replace('web2py_session_', '')
#fast auto-increment id (needed for session handling)
self.serial = "%s:serial" % self.keyprefix
#index of all the session keys of this app
self.id_idx = "%s:id_idx" % self.keyprefix
#remember the session_expiry setting
self.session_expiry = session_expiry
def getserial(self):
#return an auto-increment id
return "%s" % self.r_server.incr(self.serial, 1)
def __getattr__(self, key):
if key == 'id':
#return a fake query. We need to query it just by id for normal operations
self.query = MockQuery(field='id', db=self.r_server, prefix=self.keyprefix, session_expiry=self.session_expiry)
return self.query
elif key == '_db':
#needed because of the calls in sessions2trash.py and globals.py
return self.db
def insert(self, **kwargs):
#usually kwargs would be a Storage with several keys:
#'locked', 'client_ip','created_datetime','modified_datetime'
#'unique_key', 'session_data'
#retrieve a new key
newid = self.getserial()
key = "%s:%s" % (self.keyprefix, newid)
#add it to the index
self.r_server.sadd(self.id_idx, key)
#set a hash key with the Storage
self.r_server.hmset(key, kwargs)
if self.session_expiry:
self.r_server.expire(key, self.session_expiry)
return newid
class MockQuery(object):
"""a fake Query object that supports querying by id
and listing all keys. No other operation is supported
"""
def __init__(self, field=None, db=None, prefix=None, session_expiry=False):
self.field = field
self.value = None
self.db = db
self.keyprefix = prefix
self.op = None
self.session_expiry = session_expiry
def __eq__(self, value, op='eq'):
self.value = value
self.op = op
def __gt__(self, value, op='ge'):
self.value = value
self.op = op
def select(self):
if self.op == 'eq' and self.field == 'id' and self.value:
#means that someone wants to retrieve the key self.value
rtn = self.db.hgetall("%s:%s" % (self.keyprefix, self.value))
if rtn == dict():
#return an empty resultset for non existing key
return []
else:
return [Storage(rtn)]
elif self.op == 'ge' and self.field == 'id' and self.value == 0:
#means that someone wants the complete list
rtn = []
id_idx = "%s:id_idx" % self.keyprefix
#find all session keys of this app
allkeys = self.db.smembers(id_idx)
for sess in allkeys:
val = self.db.hgetall(sess)
if val == dict():
if self.session_expiry:
#clean up the idx, because the key expired
self.db.srem(id_idx, sess)
continue
else:
continue
val = Storage(val)
#add a delete_record method (necessary for sessions2trash.py)
val.delete_record = RecordDeleter(self.db, sess, self.keyprefix)
rtn.append(val)
return rtn
else:
raise Exception("Operation not supported")
def update(self, **kwargs):
#means that the session has been found and needs an update
if self.op == 'eq' and self.field == 'id' and self.value:
return self.db.hmset("%s:%s" % (self.keyprefix, self.value), kwargs)
class RecordDeleter(object):
"""Dumb record deleter to support sessions2trash.py"""
def __init__(self, db, key, keyprefix):
self.db, self.key, self.keyprefix = db, key, keyprefix
def __call__(self):
id_idx = "%s:id_idx" % self.keyprefix
#remove from the index
self.db.srem(id_idx, self.key)
#remove the key itself
self.db.delete(self.key)
+3 -3
View File
@@ -3981,8 +3981,8 @@ class DatabaseStoredFile:
self.data += data
def close_connection(self):
self.db.executesql("DELETE FROM web2py_filesystem WHERE path='%s'" \
% self.filename)
self.db.executesql(
"DELETE FROM web2py_filesystem WHERE path='%s'" % self.filename)
query = "INSERT INTO web2py_filesystem(path,content) VALUES ('%s','%s')"\
% (self.filename, self.data.replace("'","''"))
self.db.executesql(query)
@@ -4007,7 +4007,7 @@ class UseDatabaseStoredFile:
return DatabaseStoredFile(self.db,filename,mode)
def file_close(self, fileobj):
fileobj.close()
fileobj.close_connection()
def file_delete(self,filename):
query = "DELETE FROM web2py_filesystem WHERE path='%s'" % filename
+9 -7
View File
@@ -417,7 +417,7 @@ class Response(Storage):
return handler(request, self, methods)
def toolbar(self):
from html import DIV, SCRIPT, BEAUTIFY, TAG, URL
from html import DIV, SCRIPT, BEAUTIFY, TAG, URL, A
BUTTON = TAG.button
admin = URL("admin","default","design",
args=current.request.application)
@@ -438,19 +438,21 @@ class Response(Storage):
dbstats = [] # if no db or on GAE
dbtables = {}
u = web2py_uuid()
backtotop = A('Back to top', _href="#totop-%s" % u)
return DIV(
BUTTON('design',_onclick="document.location='%s'" % admin),
BUTTON('request',_onclick="jQuery('#request-%s').slideToggle()"%u),
DIV(BEAUTIFY(current.request),_class="hidden",_id="request-%s"%u),
BUTTON('session',_onclick="jQuery('#session-%s').slideToggle()"%u),
DIV(BEAUTIFY(current.session),_class="hidden",_id="session-%s"%u),
BUTTON('response',_onclick="jQuery('#response-%s').slideToggle()"%u),
DIV(BEAUTIFY(current.response),_class="hidden",_id="response-%s"%u),
BUTTON('session',_onclick="jQuery('#session-%s').slideToggle()"%u),
BUTTON('db tables',_onclick="jQuery('#db-tables-%s').slideToggle()"%u),
DIV(BEAUTIFY(dbtables),_class="hidden",_id="db-tables-%s"%u),
BUTTON('db stats',_onclick="jQuery('#db-stats-%s').slideToggle()"%u),
DIV(BEAUTIFY(dbstats),_class="hidden",_id="db-stats-%s"%u),
DIV(BEAUTIFY(current.request), backtotop,_class="hidden",_id="request-%s"%u),
DIV(BEAUTIFY(current.session), backtotop, _class="hidden",_id="session-%s"%u),
DIV(BEAUTIFY(current.response), backtotop, _class="hidden",_id="response-%s"%u),
DIV(BEAUTIFY(dbtables), backtotop, _class="hidden",_id="db-tables-%s"%u),
DIV(BEAUTIFY(dbstats), backtotop, _class="hidden",_id="db-stats-%s"%u),
SCRIPT("jQuery('.hidden').hide()")
,_id="totop-%s" % u
)
class Session(Storage):
+26 -22
View File
@@ -88,7 +88,7 @@ from contenttype import contenttype
from dal import BaseAdapter
from settings import global_settings
from validators import CRYPT
from cache import Cache
from cache import CacheInRam
from html import URL, xmlescape
from utils import is_valid_ip_address
from rewrite import load, url_in, thread as rwthread, \
@@ -148,7 +148,7 @@ def get_client(env):
def copystream_progress(request, chunk_size= 10**5):
"""
copies request.env.wsgi_input into request.body
and stores progress upload status in cache.ram
and stores progress upload status in cache_ram
X-Progress-ID:length and X-Progress-ID:uploaded
"""
env = request.env
@@ -164,16 +164,16 @@ def copystream_progress(request, chunk_size= 10**5):
copystream(source, dest, size, chunk_size)
return dest
cache_key = 'X-Progress-ID:'+request.vars['X-Progress-ID']
cache = Cache(request)
cache.ram(cache_key+':length', lambda: size, 0)
cache.ram(cache_key+':uploaded', lambda: 0, 0)
cache_ram = CacheInRam(request) # same as cache.ram because meta_storage
cache_ram(cache_key+':length', lambda: size, 0)
cache_ram(cache_key+':uploaded', lambda: 0, 0)
while size > 0:
if size < chunk_size:
data = source.read(size)
cache.ram.increment(cache_key+':uploaded', size)
cache_ram.increment(cache_key+':uploaded', size)
else:
data = source.read(chunk_size)
cache.ram.increment(cache_key+':uploaded', chunk_size)
cache_ram.increment(cache_key+':uploaded', chunk_size)
length = len(data)
if length > size:
(data, length) = (data[:size], size)
@@ -184,8 +184,8 @@ def copystream_progress(request, chunk_size= 10**5):
if length < chunk_size:
break
dest.seek(0)
cache.ram(cache_key+':length', None)
cache.ram(cache_key+':uploaded', None)
cache_ram(cache_key+':length', None)
cache_ram(cache_key+':uploaded', None)
return dest
@@ -425,19 +425,23 @@ def wsgibase(environ, responder):
# ##################################################
app = request.application ## must go after url_in!
http_host = env.http_host.split(':',1)[0]
local_hosts = [http_host,'::1','127.0.0.1',
'::ffff:127.0.0.1']
if not global_settings.web2py_runtime_gae:
try:
local_hosts.append(socket.gethostname())
except TypeError:
pass
try:
local_hosts.append(
socket.gethostbyname(http_host))
except (socket.gaierror,TypeError):
pass
if not global_settings.local_hosts:
local_hosts = ['127.0.0.1','::ffff:127.0.0.1']
if not global_settings.web2py_runtime_gae:
try:
local_hosts.append(socket.gethostname())
except TypeError:
pass
try:
if env.server_name:
local_hosts += [
env.server_name,
socket.gethostbyname(env.server_name)]
except (socket.gaierror,TypeError):
pass
global_settings.local_hosts = local_hosts
else:
local_hosts = global_settings.local_hosts
client = get_client(env)
x_req_with = str(env.http_x_requested_with).lower()
+1 -1
View File
@@ -1466,7 +1466,7 @@ class Worker(Thread):
except UnicodeDecodeError:
self.err_log.warning('Invalid request header: '+repr(l))
if l.strip() == '':
if l.strip().replace('\0','') == '':
break
elif l[0] in ' \t' and lname:
# Some headers take more than one line
+1 -1
View File
@@ -6,6 +6,7 @@ License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html)
import os
import sys
import socket
import platform
from storage import Storage
@@ -37,4 +38,3 @@ global_settings.is_jython = \
str(sys.copyright).find('Jython') > 0
+1 -1
View File
@@ -1059,7 +1059,7 @@ class SQLFORM(FORM):
xfields.append((row_id,label,inp,comment))
self.custom.dspval[fieldname] = dspval or nbsp
self.custom.inpval[fieldname] = inpval or ''
self.custom.inpval[fieldname] = inpval if not inpval is None else ''
self.custom.widget[fieldname] = inp
# if a record is provided and found, as is linkto
+29 -1
View File
@@ -4576,6 +4576,7 @@ class Wiki(object):
self.env['component'] = Wiki.component
if render == 'markmin': render=self.markmin_render
elif render == 'html': render=self.html_render
self.render = render
self.auth = auth
if self.auth.user:
self.force_prefix = force_prefix % self.auth.user
@@ -4702,6 +4703,8 @@ class Wiki(object):
)
elif zero=='_cloud':
return self.cloud()
elif zero == '_preview':
return self.preview(self.render)
def first_paragraph(self,page):
if not self.can_read(page):
@@ -4782,7 +4785,29 @@ class Wiki(object):
elif form.accepted:
current.session.flash = 'page created'
redirect(URL(args=slug))
return dict(content=form)
script = """
$(function() {
if (!$('#wiki_page_body').length) return;
var pagecontent = $('#wiki_page_body');
var prevbutton = $('<button class="btn nopreview">Preview</button>');
var preview = $('<div id="preview"></div>').hide();
var table = $('form');
prevbutton.insertBefore(table);
prevbutton.on('click', function(e) {
e.preventDefault();
if (prevbutton.hasClass('nopreview')) {
prevbutton.addClass('preview').removeClass('nopreview').html('Edit Source');
preview.insertBefore(table);
web2py_ajax_page('post', '%(url)s', {body : $('#wiki_page_body').val()}, 'preview');
table.fadeOut('medium', function() {preview.fadeIn()});
} else {
prevbutton.addClass('nopreview').removeClass('preview').html('Preview');
preview.fadeOut('medium', function() {table.fadeIn()});
}
})
})
""" % dict(url=URL(args=('_preview')))
return dict(content=TAG[''](form, SCRIPT(script)))
def editmedia(self,slug):
auth = self.auth
@@ -4977,6 +5002,9 @@ class Wiki(object):
vars=dict(q=item.wiki_tag.name))))
items.append(' ')
return dict(content = DIV(_class='w2p_cloud',*items))
def preview(self, render):
request = current.request
return render(request.post_vars)
if __name__ == '__main__':
import doctest
-25
View File
@@ -1,25 +0,0 @@
import os
import sys
paths = [sys.argv[1]]
paths1 = []
paths2 = []
while paths:
path = paths.pop()
for filename in os.listdir(path):
fullname = os.path.join(path,filename)
if os.path.isdir(fullname):
paths.append(fullname)
else:
extension = filename.split('.')[-1]
if extension.lower() in ('png','gif','jpg','jpeg','js','css'):
paths1.append((filename,fullname))
if extension.lower() in ('css','js','py','html'):
paths2.append(fullname)
for filename,fullname in paths1:
for otherfullname in paths2:
if open(otherfullname).read().find(filename)>=0:
break
else:
print fullname
# os.system('hg rm '+fullname)
# os.system('rm '+fullname)
+16 -7
View File
@@ -94,11 +94,11 @@ class SessionSetDb(SessionSet):
"""Return list of SessionDb instances for existing sessions."""
sessions = []
tablename = 'web2py_session'
if request.application:
tablename = 'web2py_session_' + request.application
if tablename in db:
for row in db(db[tablename].id > 0).select():
sessions.append(SessionDb(row))
from gluon import current
(record_id_name, table, record_id, unique_key) = \
current.response._dbtable_and_field
for row in table._db(table.id > 0).select():
sessions.append(SessionDb(row))
return sessions
@@ -121,8 +121,11 @@ class SessionDb(object):
self.row = row
def delete(self):
from gluon import current
(record_id_name, table, record_id, unique_key) = \
current.response._dbtable_and_field
self.row.delete_record()
db.commit()
table._db.commit()
def get(self):
session = Storage()
@@ -130,7 +133,13 @@ class SessionDb(object):
return session
def last_visit_default(self):
return self.row.modified_datetime
if isinstance(self.row.modified_datetime, datetime.datetime):
return self.row.modified_datetime
else:
try:
return datetime.datetime.strptime(self.row.modified_datetime, '%Y-%m-%d %H:%M:%S.%f')
except:
print 'failed to retrieve last modified time (value: %s)' % self.row.modified_datetime
def __str__(self):
return self.row.unique_key