diff --git a/README.md b/README.md index 80c2895..f7fb03f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ * Scrubbed interpolation: `{{%unsafe_value}}` * Name-spaced variables: `{{=User.address.city}}` * If/else blocks: `{{value}} <> {{:value}} <> {{/value}}` + * If/else blocks: `{{value=='x'}} <> {{:value=='x'}} <> {{/value=='x'}}` ( === == > < >= <= != ) * If not blocks: `{{!value}} <> {{/!value}}` * Object/Array iteration: `{{@object_value}} {{=_key}}:{{=_val}} {{/@object_value}}` * Multi-line templates (no removal of newlines required to render) diff --git a/t.js b/t.js index add6913..79fbe64 100644 --- a/t.js +++ b/t.js @@ -19,7 +19,8 @@ (function() { var blockregex = /\{\{(([@!]?)(.+?))\}\}(([\s\S]+?)(\{\{:\1\}\}([\s\S]+?))?)\{\{\/\1\}\}/g, - valregex = /\{\{([=%])(.+?)\}\}/g; + valregex = /\{\{([=%])(.+?)\}\}/g, + conregex = /([^=><]+?)([!=>< ]+)(.+)$/; function t(template) { this.t = template; @@ -39,6 +40,21 @@ } return vars; } + + function get_value_con(vars, key){ + var v = null; + if(key.charAt(0) == "'" || key.charAt(0) == '"'){ + v = key.substr(1); + if(v.charAt(v.length - 1) == "'" || v.charAt(v.length - 1) == '"') { + v = v.substr(0,v.length -1); + } + }else if(!isNaN(key.charAt(0))){ + v = Number(key); + }else{ + v = get_value(vars, key); + } + return v; + } function render(fragment, vars) { return fragment @@ -51,6 +67,42 @@ // handle if not if (meta == '!') { return render(inner, vars); + }else{ + var consp = conregex.exec(key); + if(consp){ + var l = get_value_con(vars,consp[1]); + var r = get_value_con(vars,consp[3]); + var op = consp[2].replace(/\s/g,''); + var conV = false; + switch(op){ //do not use the eval(), it is not safe + case '==': + conV = (l == r); + break; + case '===': + conV = (l === r); + break; + case '>': + conV = (l > r); + break; + case '<': + conV = (l < r); + break; + case '>=': + conV = (l >= r); + break; + case '<=': + conV = (l <= r); + case '!=': + conV = (l != r); + break; + } + + if(conV){ + return render(inner, vars); + }else{ + //not support + } + } } // check for else if (has_else) { diff --git a/t.min.js b/t.min.js index 4152667..824dc5a 100644 --- a/t.min.js +++ b/t.min.js @@ -1,2 +1 @@ -(function(){function c(a){this.t=a}function l(a,b){for(var e=b.split(".");e.length;){if(!(e[0]in a))return!1;a=a[e.shift()]}return a}function d(a,b){return a.replace(h,function(e,a,i,f,c,h,k,m){var f=l(b,f),j="",g;if(!f)return"!"==i?d(c,b):k?d(m,b):"";if(!i)return d(h,b);if("@"==i){e=b._key;a=b._val;for(g in f)f.hasOwnProperty(g)&&(b._key=g,b._val=f[g],j+=d(c,b));b._key=e;b._val=a;return j}}).replace(k,function(a,c,d){return(a=l(b,d))||0===a?"%"==c?(new Option(a)).innerHTML.replace(/"/g,"""): -a:""})}var h=/\{\{(([@!]?)(.+?))\}\}(([\s\S]+?)(\{\{:\1\}\}([\s\S]+?))?)\{\{\/\1\}\}/g,k=/\{\{([=%])(.+?)\}\}/g;c.prototype.render=function(a){return d(this.t,a)};window.t=c})(); \ No newline at end of file +(function(){var blockregex=/\{\{(([@!]?)(.+?))\}\}(([\s\S]+?)(\{\{:\1\}\}([\s\S]+?))?)\{\{\/\1\}\}/g,valregex=/\{\{([=%])(.+?)\}\}/g,conregex=/([^=><]+?)([!=>< ]+)(.+)$/;function t(template){this.t=template}function scrub(val){return new Option(val).innerHTML.replace(/"/g,""")}function get_value(vars,key){var parts=key.split(".");while(parts.length){if(!(parts[0] in vars)){return false}vars=vars[parts.shift()]}return vars}function get_value_con(vars,key){var v=null;if(key.charAt(0)=="'"||key.charAt(0)=='"'){v=key.substr(1);if(v.charAt(v.length-1)=="'"||v.charAt(v.length-1)=='"'){v=v.substr(0,v.length-1)}}else{if(!isNaN(key.charAt(0))){v=Number(key)}else{v=get_value(vars,key)}}return v}function render(fragment,vars){return fragment.replace(blockregex,function(_,__,meta,key,inner,if_true,has_else,if_false){var val=get_value(vars,key),temp="",i;if(!val){if(meta=="!"){return render(inner,vars)}else{var consp=conregex.exec(key);if(consp){var l=get_value_con(vars,consp[1]);var r=get_value_con(vars,consp[3]);var op=consp[2].replace(/\s/g,"");var conV=false;switch(op){case"==":conV=(l==r);break;case"===":conV=(l===r);break;case">":conV=(l>r);break;case"<":conV=(l=":conV=(l>=r);break;case"<=":conV=(l<=r);case"!=":conV=(l!=r);break}if(conV){return render(inner,vars)}else{}}}if(has_else){return render(if_false,vars)}return""}if(!meta){return render(if_true,vars)}if(meta=="@"){_=vars._key;__=vars._val;for(i in val){if(val.hasOwnProperty(i)){vars._key=i;vars._val=val[i];temp+=render(inner,vars)}}vars._key=_;vars._val=__;return temp}}).replace(valregex,function(_,meta,key){var val=get_value(vars,key);if(val||val===0){return meta=="%"?scrub(val):val}return""})}t.prototype.render=function(vars){return render(this.t,vars)};window.t=t})(); \ No newline at end of file diff --git a/t_test.html b/t_test.html index f410c54..21b3b71 100644 --- a/t_test.html +++ b/t_test.html @@ -21,6 +21,18 @@

{{=greeting}}

{{=user.display_name}}

+ {{user.display_name=='Jason'}} +

display_name equal Jason

+ {{/user.display_name=='Jason'}} + + {{'Jason'==user.display_name}} +

Jason equal display_name

+ {{/'Jason'==user.display_name}} + + {{'David'!=user.display_name}} +

David not equal display_name

+ {{/'David'!=user.display_name}} + {{user.address}}
{{%user.address}}
{{/user.address}}