UNPKG

kiwi

Version:

Simple, modular, fast and lightweight template engine, based on jQuery templates syntax.

3 lines 38.6 kB
/*! Coolony's Kiwi | Copyright ©2012 Pierre Matri <pierre.matri@coolony.com> | MIT Licensed */ (function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');if(!mod.exports){mod.exports={};mod.call(mod.exports,mod,mod.exports,require.relative(path))}return mod.exports}require.modules={};require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&&reg||require.modules[index]&&index||orig};require.register=function(path,fn){require.modules[path]=fn};require.relative=function(parent){return function(p){if("."!=p.charAt(0))return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i<segs.length;i++){var seg=segs[i];if(".."==seg)path.pop();else if("."!=seg)path.push(seg)}return require(path.join("/"))}};require.register("cache.js",function(module,exports,require){function Cache(){this._cache={}}Cache.prototype.cache=function(key,value){if(_.isUndefined(value))return;this._cache[key]=value};Cache.prototype.get=function(key){return this._cache[key]};module.exports=Cache});require.register("compiler.js",function(module,exports,require){var token=require("./token");var utils=require("./utils");var TAG_OPENING_DELIMITER="{{";var TAG_CLOSING_DELIMITER="}}";var TAG_OPENING_DELIMITER_LENGTH=TAG_OPENING_DELIMITER.length;var TAG_NAME_MATCH=/^(\/)?\s*([^\s\}\(]*)/;var Compiler=module.exports=function(template){this.template=template;this.source=template.template;this.options=template.options;this.helpers={};this.__compilationEnd=[]};Compiler.prototype.compile=function(callback){var _this=this;function onProcessed(err,processed){if(err)return callback(err);_this._tokenize(processed,onTokenized)}function onTokenized(err,tokenized){if(err)return callback(err);tokenized.compile(_this,onCompiled)}function onCompiled(err,compiled){if(err)return callback(err);var func;try{func=new Function("$template","$tools","_","$data","$helpers","$callback",compiled)}catch(err){return callback(err)}func.$helpers=_this.helpers;callback(null,func)}utils.applyAll(this.source,token.tagBeforeProcessors,[this],onProcessed)};Compiler.prototype._tokenize=function(source,callback){var workingSource=source;var currentToken=new token.RootToken;var rootToken=currentToken;var inToken=false;var currentPart;while(true){var nextInflexion=workingSource.search(inToken?TAG_CLOSING_DELIMITER:TAG_OPENING_DELIMITER);if(nextInflexion===-1){this._pushLiteralToken(rootToken,currentToken,workingSource);break}else{if(inToken)nextInflexion=nextInflexion+TAG_OPENING_DELIMITER_LENGTH;currentPart=workingSource.slice(0,nextInflexion);workingSource=workingSource.slice(nextInflexion);if(!inToken){this._pushLiteralToken(rootToken,currentToken,currentPart)}else{currentPart=currentPart.slice(2,-2);try{currentToken=this._pushToken(rootToken,currentToken,currentPart)}catch(err){return callback(err)}}inToken=!inToken}}if(rootToken!==currentToken){return callback(new Error("Tokenization error: unexpected end of file, "+"expected `"+currentToken.tag.tagName+"`."))}callback(null,rootToken)};Compiler.prototype._pushLiteralToken=function(root,parent,literal){if(!literal.length)return;parent.children.push(new token.LiteralToken(literal,root))};Compiler.prototype._pushToken=function(root,current,tag){var match=tag.match(TAG_NAME_MATCH);var tagName=match[2];var openingTag=match[1]!=="/";var tagType=current.lookupTag(tagName);var newToken;if(!tagType){throw new Error("Tokenization error: Unknown tag `"+tagName+"`.")}if(tagType.isIntermediate){if(current.tagType.isIntermediate)current=current.parent;newToken=new token.IntermediateToken(tag,tagType,root,current,[],this.options);current.intermediate.push(newToken);return newToken}else if(tagType.isBlock){if(openingTag){newToken=new token.BlockToken(tag,tagType,root,current,[],this.options);current.children.push(newToken);return newToken}else{if(!current.parent){throw new Error("Tokenization error: unexpected `"+tagName+"` tag at root level.")}if(current.tagType.isIntermediate){current=current.parent}if(current.tagType.tagName!==tagName){throw new Error("Tokenization error: unexpected `"+tagName+"` tag, expected `"+current.tag.tagName+"`.")}return current.parent}}else{if(!openingTag){throw new Error("Tokenization error: `"+tagName+"` is not a block tag.")}newToken=new token.LeafToken(tag,tagType,root,current,this.options);current.children.push(newToken);return current}};Compiler.prototype.registerTemplateHelper=function(name,helper){this.helpers[name]=helper}});require.register("filter.js",function(module,exports,require){function filter(input,filters){var unknownFilter;filters.forEach(function(filterName){var filterArgs=[];if(_.isArray(filterName)){filterArgs=filterName.slice(1);filterName=filterName[0]}var filterFunction=module.exports.filters[filterName];if(!filterFunction){unknownFilter=filterName;return false}input=filterFunction.apply(this,[input].concat(filterArgs))});if(unknownFilter){throw new Error("Rendering error: Unknown filter `"+unknownFilter+"`.")}return input}module.exports=filter;var filters=module.exports.filters={};function loadFilters(loadedFiles){loadedFiles=loadedFiles||frame.files.requireDir(__dirname+"/filters/");for(var file in loadedFiles){var fileFilters=loadedFiles[file];for(var filter in fileFilters){filters[filter]=fileFilters[filter]}}}var files=["base","datetime"];var acc={};_.each(files,function(file){acc[file]=require("./filters/"+file)});loadFilters(acc)});require.register("filters/base.js",function(module,exports,require){var tools=require("../tools");var utils=require("../utils");exports.escape=function(input){if(input===null||input===undefined)return"";if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.escape(value)});return acc}return tools.escape(input)};exports.escapeIfUnsafe=function(input){if(input===null||input===undefined)return"";if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.escapeIfUnsafe(value)});return acc}return tools.escapeIfUnsafe(input)};exports.capitalize=function(input){if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.capitalize(value)});return acc}input=input.toString();return input.charAt(0).toUpperCase()+input.slice(1)};exports.upper=function(input){if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.upper(value)});return acc}return input.toString().toUpperCase()};exports.lower=function(input){if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.lower(value)});return acc}return input.toString().toLowerCase()};exports.json=function(input){return JSON.stringify(input)};exports.add=function(input,operand){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.add(value,operand)});return acc}return parseFloat(input)+parseFloat(operand)};exports.subtract=function(input,operand){return exports.add(input,-parseInt(operand,10))};exports.mul=function(input,operand){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.mul(value,operand)});return acc}return parseFloat(input)*parseFloat(operand)};exports.div=function(input,operand){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.div(value,operand)});return acc}return parseFloat(input)/parseFloat(operand)};exports.incr=function(input,operand){return exports.add(input,1)};exports.decr=function(input,operand){return exports.add(input,-1)};exports.round=function(input){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.round(value)});return acc}return Math.round(input)};exports.floor=function(input){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.floor(value)});return acc}return Math.floor(input)};exports.ceil=function(input){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.ceil(value)});return acc}return Math.ceil(input)};exports.cut=function(input,needle){if(typeof input==="object"){var acc={};_.each(input,function(value,key){acc[key]=exports.cut(value,needle)});return acc}return input.toString().replace(needle,"")};exports.addslashes=function(input){if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.capitalize(value)});return acc}return input.toString().replace(/\\/g,"\\\\").replace(/\'/g,"\\'").replace(/\"/g,'\\"').replace(/\0/g,"\\0")};exports.stripslashes=function(input){if(utils.isIterable(input)){var acc={};_.each(input,function(value,key){acc[key]=exports.capitalize(value)});return acc}return input.toString().replace(/\\'/g,"'").replace(/\\"/g,'"').replace(/\\0/g,"\0").replace(/\\\\/g,"\\")};exports.first=function(input){if(typeof input==="object"&&!_.isArray(input))return"";if(_.isString(input))return input.substr(0,1);return _.first(input)};exports.last=function(input){if(typeof input==="object"&&!_.isArray(input))return"";if(_.isString(input))return input.slice(-1);return _.last(input)};exports.length=function(input){if(typeof input==="object")return _.keys(input).length;return input.length};exports.reverse=function(input){if(_.isArray(input))return input.reverse();return input};exports.join=function(input,separator){if(_.isArray(input))return input.join(separator);if(typeof input==="object"){var acc=[];_.each(input,function(value,key){acc.push(value)});return acc.join(separator)}return input};exports.urlencode=function(input){return encodeURIComponent(input)};exports.urldecode=function(input){return decodeURIComponent(input)};exports.replace=function(input,search,replacement,flags){return input.replace(new RegExp(search,flags),replacement)};module.exports=exports});require.register("filters/datetime.js",function(module,exports,require){exports.timeago=function(input){return moment(input).fromNow()};exports.relativedate=function(input){return moment(input).calendar()};exports.date=function(input,pattern){return moment(input).format(pattern)};module.exports=exports});require.register("kiwi.js",function(module,exports,require){var Template=exports.Template=require("./template");exports.tools=require("./tools");exports.version="0.2.2";module.exports=exports});require.register("tags/as.js",function(module,exports,require){var AS_PARSE_RE=/^as\s+([^\s]+)$/;module.exports.tags={};var asTag=module.exports.tags.as={};asTag.isBlock=true;asTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(AS_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var name=parsed[1];var compiled="(function(parentAcc) {"+"var __acc = [];"+compiledContents+'var __joined = __acc.join("");'+'$data["'+name+'"] = $tools.tools.safe(__joined);'+"})(__acc);";callback(null,compiled)}});require.register("tags/block.js",function(module,exports,require){var BLOCK_PARSE_RE=/^block\s+([^\s]+)(?:\s+(append|prepend))?$/;module.exports.tags={};var blockTag=module.exports.tags.block={};var parentTag=module.exports.tags.parent={};blockTag.isBlock=true;blockTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(BLOCK_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var name=parsed[1];var mode=parsed[2];var compiled="(function(__parentAcc) {"+"var __acc = [];"+compiledContents+'var __currentBlock = __acc.join("");'+'if(!_.isUndefined(__blocks["'+name+'"])) {'+'__tmp = new String(__blocks["'+name+'"].replace('+"/\\{\\{parent\\}\\}/g, __currentBlock"+"));"+'if(__blocks["'+name+'"].mode) {'+'__tmp.mode = __blocks["'+name+'"].mode;'+"}"+'__blocks["'+name+'"] = __tmp;'+"}"+"var __acc = [];"+'if(_.isUndefined(__blocks["'+name+'"]) ||'+'__blocks["'+name+'"].mode) {'+'if(__blocks["'+name+'"] &&'+'__blocks["'+name+'"].mode == "prepend") {'+'__acc.push(__blocks["'+name+'"]);'+"}"+"__acc.push(__currentBlock);"+'if(__blocks["'+name+'"] &&'+'__blocks["'+name+'"].mode == "append") {'+'__acc.push(__blocks["'+name+'"]);'+"}"+"} else {"+'__acc.push(__blocks["'+name+'"]);'+"}"+'var __joined = new String(__acc.join(""));'+(mode?'__joined.mode = "'+mode+'";':"")+"__parentAcc.push(__joined);"+'__blocks["'+name+'"] = __joined;'+"})(__acc);";callback(null,compiled)};parentTag.compile=function(token,compiledContents,compiler,callback){if(!token.parent.tagType||token.parent.tagType.tagName!=="block"){return callback(new Error("Compilation error: `parent` must be immediate child of a `block` tag."))}token.parent.hasParentTag=true;callback(null,'__acc.push("{{parent}}");')}});require.register("tags/comment.js",function(module,exports,require){var COMMENT_RE=/\{\{\s*comment\s*\}\}((.|\n)*?)\{\{\s*\/\s*comment\s*\}\}/g;module.exports.tags={};var commentTag=module.exports.tags["#"]={};commentTag.isBlock=false;commentTag.compile=function(token,compiledContents,compiler,callback){callback(null,"")};commentTag.beforeProcessor=function(source,compiler,callback){source=source.replace(COMMENT_RE,"");callback(null,source)}});require.register("tags/each.js",function(module,exports,require){var EACH_PARSE_RE=/^each(?:\(([^\)\s]+)\s*\,\s*([^\)\s]+)\s*\))?\s+(.*)$/;module.exports.tags={};var eachTag=module.exports.tags.each={};var intermediateTags=eachTag.intermediateTags={};var emptyTag=intermediateTags.empty={};eachTag.isBlock=true;eachTag.headDeclarations="var $each = undefined;";eachTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(EACH_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var elementVariable=parsed[1]||"$value";var indexVariable=parsed[2]||"$index";var collection=parsed[3];var ifEmpty;if(compiledIntermediate.length){if(compiledIntermediate.length>1){return callback(new Error("Compilation Error: Too many intermediate "+"tags for `each`."))}if(token.intermediate[0].tag!=="empty"){return callback(new Error("Compilation Error: Unexpected tag `"+token.intermediate[0].tag+"`."))}ifEmpty=compiledIntermediate[0]}var compiled="(function(__parentEachLoop) {";if(!token.options.strict){compiled+="try {"+"__tmp = "+collection+"} catch(__err) {"+"if(__err instanceof ReferenceError) {"+"__tmp = [];"+"} else {"+"throw __err;"+"}"+"}"}else{compiled+="__tmp = "+collection+";"}compiled+="var __eachLoopLength = _.size(__tmp);"+"var _eachLoop, $each;";if(ifEmpty)compiled+="if(__eachLoopLength) {";if(token.options.eachCounters){compiled+="var __eachLoopCounter = 0;"+"_.each(__tmp, "+"function("+elementVariable+","+indexVariable+"){"+"$each = _eachLoop = {"+"size: __eachLoopLength,"+"counter0: __eachLoopCounter,"+"counter: __eachLoopCounter + 1,"+"revcounter0: __eachLoopLength - __eachLoopCounter - 1,"+"revcounter: __eachLoopLength - __eachLoopCounter,"+"first: __eachLoopCounter === 0,"+"last: __eachLoopCounter + 1 === __eachLoopLength,"+"parentLoop: __parentEachLoop,"+"parent: __parentEachLoop,"+"_index: "+indexVariable+","+"_value: "+elementVariable+"};"+"if(__parentEachLoop) {"+"$each.parentIndex = __parentEachLoop._index;"+"$each.parentValue = __parentEachLoop._value;"+"}"+compiledContents+"__eachLoopCounter++;"+"});"}else{compiled+="_.each(__tmp, "+"function("+elementVariable+","+indexVariable+") {"+compiledContents+"});"}if(ifEmpty){compiled+="} else {"+ifEmpty+"}"}compiled+="})($each);";callback(null,compiled)}});require.register("tags/extend.js",function(module,exports,require){var utils=require("../utils");var EXTEND_PARSE_RE=/^extend\s+(.+)$/;var EXTEND_ARGS_SPLIT_RE=/\s+(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g;module.exports.tags={};var extendTag=module.exports.tags.extend={};var helpers=module.exports.helpers={};extendTag.isBlock=false;extendTag.compile=function(token,compiledContents,compiler,callback){if(token.root.children[0]!==token){return callback(new Error("Compilation error: Extend tag must be defined "+"at the very beginning of the template."))}var parsed=token.tag.match(EXTEND_PARSE_RE);var parsedArgs=parsed?parsed[1].split(EXTEND_ARGS_SPLIT_RE):null;if(!parsed||!parsedArgs){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var name=parsedArgs[0];var compiledInclude=parsedArgs[1]?"_.extend($data, "+parsedArgs.splice(1).join(" ")+")":"$data";var compiled="var __originalCallback = $callback;"+"$callback = function(err, compiled) {"+"$helpers.extend("+name+", __compiled, $template,"+compiledInclude+", __originalCallback);"+"};";callback(null,compiled)};helpers.extend=function(name,compiled,template,data,callback){function onRendered(err,rendered){if(err)return callback(err);callback(null,rendered)}template._renderRelative(name,data,compiled,onRendered)}});require.register("tags/filter.js",function(module,exports,require){var utils=require("../utils");var FILTER_PARSE_RE=/^filter\s+(.+)$/;module.exports.tags={};var filterTag=module.exports.tags.filter={};filterTag.isBlock=true;filterTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(FILTER_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var filters;try{filters=utils.parseFilters(parsed[1])}catch(err){return callback(err)}var name=parsed[1];var compiled="(function(__parentAcc) {"+"var __acc = [];"+compiledContents+"__parentAcc.push("+"$tools.filter("+'__acc.join(""),'+"["+filters.join(",")+"]"+")"+");"+"})(__acc);";callback(null,compiled)}});require.register("tags/if.js",function(module,exports,require){var IF_PARSE_RE=/^if\s+(.*)$/;var ELSE_PARSE_RE=/^else(?:\s+(.*))?$/;module.exports.tags={};var ifTag=module.exports.tags["if"]={};var intermediateTags=ifTag.intermediateTags={};var elseTag=intermediateTags["else"]={};function createIfCondition(condition,strict){var compiled;if(strict){compiled="if("+condition+")"}else{compiled="try {"+"__tmp = "+condition+"} catch(__err) {"+"if(__err instanceof ReferenceError) {"+"__tmp = false;"+"} else {"+"throw __err;"+"}"+"}"+"if(__tmp)"}return compiled}ifTag.isBlock=true;ifTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(IF_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var condition=parsed[1];var appendEnd=["}"];var compiled=createIfCondition(condition,token.options.strict);compiled+="{"+compiledContents;var err;_.each(token.intermediate,function(intermediate,index){var intermediateTag=intermediate.tag;var compiledIntermediateTag=compiledIntermediate[index];var parsed=intermediateTag.match(ELSE_PARSE_RE);if(!parsed){err=new Error("Compilation error: Unable to parse tag `"+token.tag+"`.");return}var condition=parsed[1];if(!condition){compiled+="} else {"}else{appendEnd.push("}");compiled+="} else {"+createIfCondition(condition,token.options.strict)+"{"}compiled+=compiledIntermediate[index]});if(err)return callback(err);compiled+=appendEnd.join("");callback(null,compiled)}});require.register("tags/ifblock.js",function(module,exports,require){var IFBLOCK_PARSE_RE=/^ifblock\s+([^\s]+)$/;module.exports.tags={};var ifBlockTag=module.exports.tags.ifblock={};ifBlockTag.isBlock=true;ifBlockTag.compile=function(token,compiledContents,compiledIntermediate,compiler,callback){var parsed=token.tag.match(IFBLOCK_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var name=parsed[1];var compiled='if(!_.isUndefined(__blocks["'+name+'"])) {'+compiledContents+"}";callback(null,compiled)}});require.register("tags/include.js",function(module,exports,require){var utils=require("../utils");var INCLUDE_PARSE_RE=/^include\s+(.+)?$/;var INCLUDE_ARGS_SPLIT_RE=/\s+(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g;module.exports.tags={};var includeTag=module.exports.tags.include={};var helpers=module.exports.helpers={};includeTag.isBlock=false;includeTag.compile=function(token,compiledContents,compiler,callback){var parsed=token.tag.match(INCLUDE_PARSE_RE);var parsedArgs=parsed?parsed[1].split(INCLUDE_ARGS_SPLIT_RE):null;if(!parsed||!parsedArgs){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var name=parsedArgs[0];var compiledInclude=parsedArgs[1]?"_.extend($data, "+parsedArgs.splice(1).join(" ")+")":"$data";compiler.__compilationEnd.unshift("});");var compiled="$helpers.include("+name+", $template,"+compiledInclude+", "+"function(err, rendered) {"+"__acc.push(rendered);";callback(null,compiled)};helpers.include=function(name,template,data,callback){function onRendered(err,rendered){if(err)return callback(err);callback(null,rendered)}template._renderRelative(name,data,null,onRendered)}});require.register("tags/print.js",function(module,exports,require){var filter=require("../filter");var utils=require("../utils");var TAG_REPLACE_RE=/\$\{([^\}]*)\}/g;var TAG_PARSE_RE=/^(?:=|html)\s+(?:\:(\d+)\s+)?([^|]+)(?:\|(.*))?$/;var DEFAULT_VARIABLE_FILTERS=["escapeIfUnsafe"].map(JSON.stringify);var DEFAULT_HTML_FILTERS=[];module.exports.tags={};var variableTag=module.exports.tags["="]={};var htmlTag=module.exports.tags["html"]={};variableTag.isBlock=false;htmlTag.isBlock=false;variableTag.beforeProcessor=function(source,compiler,callback){compiler.__print=[];source=source.replace(TAG_REPLACE_RE,function(all,contents){compiler.__print.push(all);return"{{= :"+compiler.__print.length+" "+contents+"}}"});callback(null,source)};variableTag.compile=createPrintTagCompiler(DEFAULT_VARIABLE_FILTERS);htmlTag.compile=createPrintTagCompiler(DEFAULT_HTML_FILTERS);function createPrintTagCompiler(defaultFilters){var compiler=function(token,compiledContents,compiler,callback){var parsed=token.tag.match(TAG_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}if(parsed[1]){var key=parseInt(parsed[1],10)-1;token.__originalTag=compiler.__print[key]}var contents=parsed[2];var filters;try{filters=parsed[3]?utils.parseFilters(parsed[3],defaultFilters):defaultFilters}catch(err){return callback(err)}contents="$tools.filter("+contents+", "+"["+filters.join(",")+"]"+")";var ret;if(!token.options.strict){ret="try {"+"var __tmp = "+contents+";"+"} catch(__err) {"+"if(__err instanceof ReferenceError) {"+'__tmp = "";'+"} else {"+"throw __err;"+"}"+"}"+"__acc.push(__tmp);"}else{ret="__acc.push("+contents+");"}callback(null,ret)};compiler.untokenize=function(token,compiler){return token.__originalTag?token.__originalTag:"{{"+token.tag+"}}"};return compiler}});require.register("tags/raw.js",function(module,exports,require){var utils=require("../utils");var VERBATIM_RE=new RegExp("\\{\\{\\s*verbatim\\s*\\}\\}((?:.|\\n)*?)"+"\\{\\{\\s*\\/\\s*verbatim\\s*\\}\\}|"+"{\\{\\s*raw\\s*\\}\\}((?:.|\\n)*?)\\{\\{\\s*\\/\\s*raw\\s*\\}\\}","g");module.exports.tags={};var verbatimTag=module.exports.tags.verbatim={};verbatimTag.isBlock=false;verbatimTag.compile=function(token,compiledContents,compiler,callback){var key=parseInt(token.tag.split(" ")[1],10)-1;callback(null,'__acc.push("'+utils.escapeCompiledString(compiler.__verbatim[key])+'");')};verbatimTag.beforeProcessorPrepend=true;verbatimTag.beforeProcessor=function(source,compiler,callback){compiler.__verbatim=[];source=source.replace(VERBATIM_RE,function onMatch(all,content1,content2){compiler.__verbatim.push(content1||content2);return"{{verbatim "+compiler.__verbatim.length+"}}"});callback(null,source)}});require.register("tags/tmpl.js",function(module,exports,require){var utils=require("../utils");var TAG_PARSE_RE=/^tmpl\s+(.*)$/;module.exports.tags={};var tmplTag=module.exports.tags.tmpl={};tmplTag.isBlock=false;tmplTag.compile=function(token,compiledContents,compiler,callback){var parsed=token.tag.match(TAG_PARSE_RE);if(!parsed){return callback(new Error("Compilation error: Unable to parse tag `"+token.tag+"`."))}var nested=parsed[1];compiler.__compilationEnd.unshift("});");callback(null,"$template._nest("+nested+", $data, "+"function(err, rendered){"+"__acc.push(rendered);")}});require.register("template.js",function(module,exports,require){var Cache=require("./cache");var CappedCache=Cache;var utils=require("./utils");var token=require("./token");var tools=require("./tools");var Compiler=require("./compiler");var filter=require("./filter");var DEFAULTS={lookup:utils.lookupTemplate,load:utils.loadTemplate,path:null,cache:true,cacheHandler:Cache,cacheOptions:[],lookupPaths:[],cacheTmplHandler:CappedCache,cacheTmplOptions:[1e3],useIsolatedTmplCache:true,cacheContext:null,strict:true,eachCounters:true,_parent:null,_cacheAttachment:"_cache",_cacheTmplAttachment:"_nestCache"};var TEMPLATE_EXPORTS={filter:filter,utils:utils,tools:tools};function Template(str,options){if(_.isObject(str)&&!options){options=str;str=null}options=options?_.clone(options):{};options=_.defaults(options,DEFAULTS);options.cacheContext=options.cacheContext||Template;this.template=str;this.options=options;this._compiled=null;if(options.cache&&!(this._getCache()instanceof options.cacheHandler)){var cacheOptions=[options.cacheHandler].concat(options.cacheOptions);options.cacheContext[options._cacheProp]=typeof window!=="undefined"?new options.cacheHandler:construct.apply(this,cacheOptions)}}Template.prototype._getCache=function(){return this.options.cacheContext[this.options._cacheProp]};Template.prototype.loadFile=function(filePath,callback){callback(new Error("Client mode does not support reading from file."))};Template.prototype.render=function(data,callback){if(_.isFunction(data)&&!callback){callback=data;data=null}data=data?_.clone(data):data;var cacheKey="template::"+this._cacheKey();if(!this.compiled&&this.options.cache){this._compiled=this._getCache().get(cacheKey)}if(this._compiled)return this._renderCompiled(data,callback);var _this=this;this._compile(function(err){if(err)return callback(err);_this._renderCompiled(data,callback)})};Template.prototype.loadAndRender=function(filePath,data,callback){callback(new Error("Client mode does not support reading from file."))};Template.prototype._renderCompiled=function onRendered(data,callback){try{this._compiled.call(this._compiled,this,TEMPLATE_EXPORTS,_,data,token.helpers,callback)}catch(err){callback(err)}};Template.prototype._compile=function(callback){var _this=this;if(!_.isString(this.template)){return callback(new Error("Template contents not set"))}new Compiler(this).compile(function(err,compiled){if(err)return callback(err);_this._compiled=compiled;var cacheKey="template::"+_this._cacheKey();if(_this.options.cache){_this._getCache().cache(cacheKey,compiled)}callback(null,compiled)})};Template.prototype._nest=function(nested,data,callback){var options=_.clone(this.options);if(options.useIsolatedTmplCache){options._cacheAttachment=options._cacheTmplAttachment;options.cacheHandler=options.cacheTmplHandler;options.cacheOptions=options.cacheTmplOptions}new Template(nested,options).render(data,function onDone(err,rendered){if(err)return callback(err);callback(null,rendered)})};Template.prototype._renderRelative=function(name,data,rendered,callback){var _this=this;var cacheKey;var cachedPath;var template;function onTemplateLocated(err,filePath){if(err)return callback(err);if(_this.options.cache){_this._getCache().cache(cacheKey,filePath)}template.loadFile(filePath,onTemplateLoaded)}function onTemplateLoaded(err,source){if(err)return callback(err);template.render(data,onTemplateRendered)}function onTemplateRendered(err,result){if(err)return callback(err);callback(null,result)}if(name instanceof Template){template=name;template.options._parent=rendered;template.render(data,onTemplateRendered)}else{var options=_.clone(this.options);options._parent=rendered;template=new Template(options);cacheKey="path::"+this._cacheKey()+"::"+name;if(this.options.cache){cachedPath=this._getCache().get(cacheKey)}if(cachedPath){template.loadFile(cachedPath,onTemplateLoaded)}else{this.options.lookup(name,this,onTemplateLocated)}}};Template.prototype._cacheKey=function(){return this.options.path||this.template||null};module.exports=Template});require.register("token.js",function(module,exports,require){var frame;var utils=require("./utils");var inherits=frame?frame.classes.extend:utils.inherits;var headDeclarations=[];var footDeclarations=[];var tags={};var tagBeforeProcessors=[];var helpers={};function BaseToken(root,parent,options){this.parent=parent;this.children=[];this.tag=null;this.tagType=null;this.options=options;this.root=root}BaseToken.prototype.compile=function(compiler,callback){callback(new Error("Stub method BaseToken#compile must be overloaded"))};BaseToken.prototype.lookupTag=function(tag){if(tags[tag])return tags[tag];if(this.tagType&&this.tagType.intermediateTags&&this.tagType.intermediateTags[tag]){this.tagType.intermediateTags[tag].isIntermediate=true;return this.tagType.intermediateTags[tag]}};function LiteralToken(literal,root,parent,options){LiteralToken._superclass.call(this,root,parent,options);this.literal=literal}inherits(LiteralToken,BaseToken);LiteralToken.prototype.compile=function(compiler,callback){this._compiled='__acc.push("'+utils.escapeCompiledString(this.literal)+'");';callback(null,this._compiled)};function RootToken(children,options){RootToken._superclass.call(this,this,null,options);if(!children)children=[];this.head=[];this.children=children}inherits(RootToken,BaseToken);RootToken.prototype.compile=function(compiler,callback){var _this=this;function onCompiled(err,compiled){if(err)return callback(err);compiled="var __this = this;"+"var __acc = [];"+"var __blocks = {};"+"if($template.options && $template.options._parent) {"+"__blocks = $template.options._parent.blocks;"+"}"+"var __tmp;"+"var __err;"+"$data = $data || {};"+headDeclarations.join("")+"with($data) {"+compiled+footDeclarations.join("")+'var __compiled = new String(__acc.join(""));'+"__compiled.blocks = __blocks;"+"$callback(null, __compiled);"+compiler.__compilationEnd.join("")+"}";_this._compiled=compiled;callback(null,compiled)}utils.compileTokens(this.children,compiler,onCompiled)};function BlockToken(tag,tagType,root,parent,children,options){BlockToken._superclass.call(this,root,parent,options);this.tag=tag;this.tagType=tagType;if(!children)children=[];this.children=children;this.intermediate=[]}inherits(BlockToken,BaseToken);BlockToken.prototype.compile=function(compiler,callback){var _this=this;var compiledContents;var compiledIntermediate;var compile=this.tagType.compile;var compilationFunction=compile.joinCompilationResult!==false?"compileTokens":"compileTokenArray";function onContentsCompiled(err,compiled){if(err)return callback(err);compiledContents=compiled;utils.compileTokenArray(_this.intermediate,compiler,onIntermediateCompiled)}function onIntermediateCompiled(err,compiled){if(err)return callback(err);compiledIntermediate=compiled;compile(_this,compiledContents,compiledIntermediate,compiler,onCompiled)}function onCompiled(err,compiled){if(err)return callback(err);_this._compiled=compiled;callback(null,compiled)}utils[compilationFunction](this.children,compiler,onContentsCompiled)};function LeafToken(tag,tagType,root,parent,options){LeafToken._superclass.call(this,root,parent,options);this.tag=tag;this.tagType=tagType}inherits(LeafToken,BaseToken);LeafToken.prototype.compile=function(compiler,callback){var _this=this;function onCompiled(err,compiled){if(err)return callback(err);_this._compiled=compiled;callback(null,compiled)}var compiled=this.tagType.compile(this,null,compiler,onCompiled)};LeafToken.prototype.untokenize=function(compiler){return this.tagType.compile.untokenize?this.tagType.compile.untokenize(this,compiler):"{{"+this.tag+"}}"};function IntermediateToken(tag,tagType,root,parent,children,options){IntermediateToken._superclass.call(this,tag,tagType,root,parent,children,options)}inherits(IntermediateToken,BlockToken);IntermediateToken.prototype.compile=function(compiler,callback){var _this=this;function onContentsCompiled(err,compiledContents){if(err)return callback(err); callback(null,compiledContents)}utils.compileTokens(this.children,compiler,onContentsCompiled)};IntermediateToken.prototype.lookupTag=function(tag){return this.parent.lookupTag(tag)};function registerTag(name,tag){if(tag.beforeProcessor){if(tag.beforeProcessorPrepend){tagBeforeProcessors.unshift(tag.beforeProcessor)}else{tagBeforeProcessors.push(tag.beforeProcessor)}}if(tag.headDeclarations){headDeclarations.push(tag.headDeclarations)}if(tag.footDeclarations){footDeclarations.push(tag.footDeclarations)}if(tag.helpers){for(var helperName in tag.helpers){registerHelper(helperName,tag.helpers[helperName])}}tags[name]=tag;tag.tagName=name}function registerHelper(name,helper){helpers[name]=helper}module.exports={BaseToken:BaseToken,RootToken:RootToken,BlockToken:BlockToken,IntermediateToken:IntermediateToken,LeafToken:LeafToken,LiteralToken:LiteralToken,headDeclarations:headDeclarations,footDeclarations:footDeclarations,tags:tags,tagBeforeProcessors:tagBeforeProcessors,helpers:helpers,registerTag:registerTag,registerHelper:registerHelper};function loadTags(loadedFiles){loadedFiles=loadedFiles||frame.files.requireDir(__dirname+"/tags/");for(var file in loadedFiles){var fileTags=loadedFiles[file].tags;var fileHelpers=loadedFiles[file].helpers;for(var tag in fileTags){registerTag(tag,fileTags[tag])}if(fileHelpers){for(var helperName in fileHelpers){registerHelper(helperName,fileHelpers[helperName])}}}}var files=["block","comment","each","if","print","raw","tmpl","ifblock","as","include","extend"];var acc={};_.each(files,function(file){acc[file]=require("./tags/"+file)});loadTags(acc)});require.register("tools.js",function(module,exports,require){var token=require("./token");var filter=require("./filter");var utils=require("./utils");var ARGS_SPLIT_RE=/\s+(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g;var FILTER_NAME_RE=/^\w+$/;var TAG_NAME_RE=FILTER_NAME_RE;exports.createSimpleTag=function createSimpleTag(name,fn){if(!name.match(TAG_NAME_RE)){throw new Error("Error:`"+name+"` is not a valid tag name.")}token.helpers[name]=fn;token.tags[name]={compile:function(token,compiledContents,compiler,callback){var splitted=token.tag.split(ARGS_SPLIT_RE);splitted[0]="$data";var args=splitted.join(",");var compiled="__acc.push($tools.tools.escapeIfUnsafe("+'$helpers["'+name+'"]('+args+")"+"));";callback(null,compiled)}}};exports.createFilter=function createFilter(name,fn){if(!name.match(FILTER_NAME_RE)){throw new Error("Error:`"+name+"` is not a valid filter name.")}filter.filters[name]=fn};var escape=exports.escape=function(str){return str.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#146;")};var SafeString=exports.SafeString=String;exports.safe=function(str){if(!(str instanceof SafeString))str=new SafeString(str);return str};exports.escapeIfUnsafe=function(str){return str instanceof SafeString?str:escape(str)};exports.registerTag=token.registerTag;exports.registerHelper=token.registerHelpers;exports.escapeCompiledString=utils.escapeCompiledString;exports.applyAll=utils.applyAll;exports.safeString=String;module.exports=exports});require.register("utils.js",function(module,exports,require){var frame;var DEFAULT_FILE_EXTENSION=".kiwi";var FILTER_SPLIT_RE=/\|(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g;var FILTER_SPLIT_ARGS_RE=/\,(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g;var FILTER_MATCH_RE=/^(\w+)\s*(?:\((.*)\))?$/i;function tmpAsyncForEach(array,fn,args,callback){if(typeof args==="function"&&!callback){callback=args;args=null}if(!args)args=[];array=array.slice(0);function handleProcessedCallback(err){if(err)return callback(err);if(array.length>0){setTimeout(processOne,0)}else{callback()}}function processOne(){var item=array.shift();fn.apply(this,[item].concat(args).concat([handleProcessedCallback]))}if(array.length>0){setTimeout(processOne,0)}else{callback()}}var asyncForEach=frame?frame.asyncForEach:tmpAsyncForEach;var apply=exports.apply=function(input,processor,args,callback){if(typeof args==="function"&&!callback){callback=args;args=null}function done(err,result){if(err)return callback(err);callback(null,result)}processor.apply(this,[input].concat(args||[]).concat([done]))};exports.applyAll=function(input,processors,args,callback){function applyOne(processor,next){apply(input,processor,args||[],function onApplied(err,result){if(err)return next(err);input=result;next()})}function done(err){if(err)return callback(err);callback(null,input)}if(typeof args==="function"&&!callback){callback=args;args=null}asyncForEach(processors,applyOne,done)};function compileTokenArray(tokens,compiler,callback){var acc=[];var index=0;function compileOne(token,next){token.compile(compiler,function onCompiled(err,compiled){if(err)return next(err);acc.push(compiled);next(null,compiled)});index++}function done(err){if(err)return callback(err);callback(null,acc)}asyncForEach(tokens,compileOne,done)}exports.compileTokenArray=compileTokenArray;exports.compileTokens=function(tokens,compiler,callback){compileTokenArray(tokens,compiler,function(err,compiled){if(err)return callback(err);callback(null,compiled.join(""))})};exports.escapeCompiledString=function(str){return str.replace(/([\\"])/g,"\\$1").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")};exports.isIterable=function(input){return typeof input==="object"&&!(input instanceof String)};exports.parseFilters=function(filters,defaults){var raw=false;defaults=defaults||[];var splittedFilters=filters.split(FILTER_SPLIT_RE);if(!splittedFilters){throw new Error("Compilation error: Unable to parse filters `"+filters+"`.")}var parsedFilters=splittedFilters.filter(function filterOne(filter){if(filter==="raw"){raw=true;return false}return true}).map(function mapOne(filter){var parsedFilter=filter.match(FILTER_MATCH_RE);if(!parsedFilter){throw new Error("Compilation error: Unable to parse filter `"+filter+"`.")}parsedFilter[1]=parsedFilter[1].replace('"','"');if(!parsedFilter[2]){return'"'+parsedFilter[1]+'"'}var splittedArgs=parsedFilter[2].split(FILTER_SPLIT_ARGS_RE);return'["'+parsedFilter[1]+'", '+splittedArgs.join(",")+"]"});if(!raw)parsedFilters=parsedFilters.concat(defaults);return _.uniq(parsedFilters)};exports.inherits=function(subclass,superclass){function Dummy(){}Dummy.prototype=superclass.prototype;subclass.prototype=new Dummy;subclass.prototype.constructor=subclass;subclass._superclass=superclass;subclass._superproto=superclass.prototype};module.exports=exports});window.kiwi=require("kiwi")})();