📄 zptemplate.js
字号:
/* * * Copyright (c) 2004-2005 by Zapatec, Inc. * http://www.zapatec.com * 1700 MLK Way, Berkeley, California, * 94709, U.S.A. * All rights reserved. * * */Zapatec.Template=function(oArg){Zapatec.Template.SUPERconstructor.call(this,oArg);};Zapatec.inherit(Zapatec.Template,Zapatec.Widget);Zapatec.Template.prototype.init=function(oArg){Zapatec.Template.SUPERclass.init.call(this,oArg);this.loadData();};Zapatec.Template.prototype.configure=function(oArg){var oTemplate=Zapatec.Template;this.defineConfigOption('theme','');this.defineConfigOption('tagLeftDelimiter','#{');this.defineConfigOption('tagRightDelimiter','}');this.defineConfigOption('varLeftDelimiter','@');this.defineConfigOption('varRightDelimiter','');this.defineConfigOption('loopIndex','@@');this.defineConfigOption('syntax',{'':{parser:oTemplate.parseExprOut},'expr':{parser:oTemplate.parseExpr},'expression':{parser:oTemplate.parseExpr},'if':{parser:oTemplate.parseCond},'for':{parser:oTemplate.parseLoop},'rem':{parser:oTemplate.parseComment}});Zapatec.Template.SUPERclass.configure.call(this,oArg);this.tagRegexp=/^\s*([a-zA-Z]*)\s*(.*)\s*$/;var fEsc=Zapatec.Utils.escapeRegExp;var oConf=this.config;this.varRegexp=new RegExp([fEsc(oConf.varLeftDelimiter),'(\\w+)',fEsc(oConf.varRightDelimiter)].join(''),'g');this.loopIndexRegexp=new RegExp(fEsc(oConf.loopIndex),'g');this.vars={};this.templates=[];this.tags=[];};Zapatec.Template.prototype.loadDataHtml=function(oSource){if(oSource.tagName.toLowerCase()=='textarea'){this.loadDataHtmlText(oSource.value);}else{this.loadDataHtmlText(oSource.innerHTML);}};Zapatec.Template.prototype.loadDataHtmlText=function(sSrc){Zapatec.Template.parse.call(this,sSrc);};Zapatec.Template.parse=function(sTxt){var oConf=this.config;var sLeftDelim=oConf.tagLeftDelimiter;var iLeftDelimLen=sLeftDelim.length;var sRightDelim=oConf.tagRightDelimiter;var iRightDelimLen=sRightDelim.length;var oTagRegexp=this.tagRegexp;var oVarRegexp=this.varRegexp;var oLoopIndexRegexp=this.loopIndexRegexp;var oSyntax=oConf.syntax;var aTokens=[];var fParseTag=Zapatec.Template.parseTag;var sTail,iPos1,iPos2;while(sTxt){iPos1=sTxt.indexOf(sLeftDelim);if(iPos1!=-1){sTail=sTxt.substring(iPos1+iLeftDelimLen);iPos2=sTail.indexOf(sRightDelim);if(iPos2!=-1){aTokens.push(sTxt.substring(0,iPos1));aTokens.push(fParseTag(sTail.substring(0,iPos2),oTagRegexp,oVarRegexp,oLoopIndexRegexp));sTxt=sTail.substring(iPos2+iRightDelimLen);}else{aTokens.push(sTxt);break;}}else{aTokens.push(sTxt);break;}}var aTemplates=this.templates=[];var aTags=this.tags=[];var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTokens=aTokens.length;var oToken,oRule;for(var iToken=0;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){oRule=oSyntax[oToken.tag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}};Zapatec.Template.parseTag=function(sTag,oTagRegexp,oVarRegexp,oLoopIndexRegexp){var aM=sTag.match(oTagRegexp);if(aM){return{tag:aM[1],args:aM[2].replace(oVarRegexp,'zpTemplateVars.$1').replace(oLoopIndexRegexp,'zpTemplateIndex')};}return{tag:'',args:''};};Zapatec.Template.parseExprOut=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex',['var zpTemplateVars=this.vars;return ',aTokens[iToken].args].join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseExpr=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex',['var zpTemplateVars=this.vars;',aTokens[iToken].args,';return ""'].join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseCond=function(aOutTpl,aOutTags,aTokens,iToken){var aTemplates=this.templates;var aTags=this.tags;var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTemplate=aTemplates.length-1;var oSyntax=this.config.syntax;var aFunc=['var zpTemplateVars=this.vars;if(',aTokens[iToken].args,'){return this.compileTemplate(',iTemplate.toString(),',zpTemplateIndex)'];var iTokens=aTokens.length;var oToken,sTag,oRule;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){sTag=oToken.tag;if(sTag=='else'){aNewTemplate=[];aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);iTemplate=aTemplates.length-1;aFunc.push('}else{return this.compileTemplate(');aFunc.push(iTemplate.toString());aFunc.push(',zpTemplateIndex)');}else if(sTag=='elseif'){aNewTemplate=[];aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);iTemplate=aTemplates.length-1;aFunc.push('}else if(');aFunc.push(oToken.args);aFunc.push('){return this.compileTemplate(');aFunc.push(iTemplate.toString());aFunc.push(',zpTemplateIndex)');}else if(sTag=='endif'){break;}else{oRule=oSyntax[sTag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}aFunc.push('}');aOutTags.push(new Function('zpTemplateIndex',aFunc.join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseLoop=function(aOutTpl,aOutTags,aTokens,iToken){var aTemplates=this.templates;var aTags=this.tags;var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTemplate=aTemplates.length-1;var oSyntax=this.config.syntax;var aFunc=['var zpTemplateVars=this.vars;var zpTemplateIndex=0;var zpTemplateArray=(',aTokens[iToken].args,');if(!(zpTemplateArray instanceof Array)){return ""};var zpTemplateArrayLen=zpTemplateArray.length;var zpTemplateTpl=[];for(;zpTemplateIndex<zpTemplateArrayLen;zpTemplateIndex++){zpTemplateTpl.push(this.compileTemplate(',iTemplate.toString(),',zpTemplateIndex))};return zpTemplateTpl.join("")'];var iTokens=aTokens.length;var oToken,sTag,oRule;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){sTag=oToken.tag;if(sTag=='endfor'){break;}else{oRule=oSyntax[sTag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}aOutTags.push(new Function(aFunc.join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseComment=function(aOutTpl,aOutTags,aTokens,iToken){var iTokens=aTokens.length;var oToken;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){if(oToken.tag=='endrem'){break;}}}return iToken;};Zapatec.Template.prototype.assign=function(sVar,sVal){this.vars[sVar]=sVal;};Zapatec.Template.prototype.assignVars=function(oArg){var oVars=this.vars;var sVar;for(sVar in oArg){oVars[sVar]=oArg[sVar];}};Zapatec.Template.prototype.reassignVars=function(oArg){this.vars={};this.assignVars(oArg);};Zapatec.Template.prototype.compileTemplate=function(iTpl,iLoopIndex){var aTpl=this.templates[iTpl];var aTags=this.tags[iTpl];var iTags=aTags.length;var iTag,fTag;try{for(iTag=0;iTag<iTags;iTag++){fTag=aTags[iTag];if(typeof fTag=='function'){aTpl[iTag]=fTag.call(this,iLoopIndex);}}}catch(oExpn){var oConf=this.config;alert(oExpn.message.replace(/zpTemplateVars\.(\w+)/g,[oConf.varLeftDelimiter,'$1',oConf.varRightDelimiter].join('')).replace(/zpTemplateIndex/g,oConf.loopIndex));}return aTpl.join('');};Zapatec.Template.prototype.compile=function(oArg){if(oArg){this.assignVars(oArg);}return this.compileTemplate(0);};Zapatec.Utils.addEvent(window, 'load', Zapatec.Utils.checkActivation);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -