javascript 视图模板

任务原因,下周要实现一个模块,为了能提高效率,我做了一个通用工具类,其实也是在原基础上改的

以前的版本支持${..}这种样子的替换 比如
<div style="display:${display}">...
替换为
<div style="display:none">...

有些比如时间格式化和判断之类就必须在代码处理好了之后在将值传给模板,但格式化和判断逻辑基本都是一致的,于是我想这些直接通过视图模板就处理好些问题

$date:时间格式化
<span>$date{day,YY MM DD}</span>
替换为
<span>11 11 11</span>

$pick:三目运算
<span>$pick{age,25,好年轻,好老啊}</span>
替换为(age = 24)
<span>好年轻</span>

模板如果想处理更灵活,需要对嵌套的情况做下处理 比如:

<span>$pick{age,${age2},${msg1},${msg2}}</span>
替换为(age = 24,age2 = 25 , msg1 = 好年轻 ,msg2 = 好老啊)
<span>好年轻</span>

有时候模板需要过滤掉${..},可能真正输出就是这种格式,怎么办?加上"\\"
<span>$pick{age,${age2},\\${msg1},${msg2}}</span>
替换为(age = 24,age2 = 25 , msg1 = 好年轻 ,msg2 = 好老啊)
<span>${msg1}</span>



function extends(objOld,objNew){
for(var n in objNew){
if(objNew.hasOwnProperty(n)){
objOld[n] = objNew[n];
}
}
}

Template = function(){
this.initialize(arguments[0]);
};
Template.prototype = {
initialize: function (template,opt) {
this.template = template + '';
//对\\进行过滤
this.filter = "\\\\";
//format:arguments[3],arguments[4]
//pic:arguments[5],arguments[6],arguments[7],arguments[8]
//defalut:arguments[9]
//获取参数
this.regPattern = /(^|[\s\S])(\$date\{([^,]*?),([^}]*?)\}|\$pick\{([^,]*?),([^,]*?),([^,]*?),([^}]*?)\}|\$\{([^}]*?)\})/g;
//是否嵌套
this.isNesting = /(?:^|[\s\S])\$[^{]*?\{[^}]*?(?=\$[^{]*?\{[^}]*?\})/g;
extends(this,opt);
},
evaluate: function (obj) {
var _template = "";
if (typeof obj == "object") {
var _this = this;

_template = this.template.replace(this.regPattern, function (s, v1, v2) {
if(_this.isNesting.test(s)){
for(var i = arguments.callee.length ; i < arguments.length - 2 ;i ++){
if(arguments[i]){
arguments[i] = arguments[i].replace(_this.regPattern, arguments.callee);
}
}
}

if(new RegExp("^" + _this.filter,"").test(v1)){
return v1 + v2;
}else{
if(/^\$\{/.test(v2)){
return v1 + (obj[arguments[9]] || "");
}
if(/^\$date\{/.test(v2)){
//2011-08-26 16:10:06
return v1 + (obj[arguments[3]] ? _this._date_format(obj[arguments[3]],arguments[4]) : "");
}
if(/^\$pick\{/.test(v2)){
return v1 + (obj[arguments[5]] ? (obj[arguments[5]] == arguments[6] ? arguments[7] : arguments[8]) : "");
}
}
});
}
return _template;
},
//YY/YYYY MM DD hh mm ss
_date_format : function(datestr,reg){
var tmp = datestr.split(" ");
var ymd = tmp[0];
var hms = tmp[1];
tmp = ymd.split("-");
var Y = tmp[0];
var M = tmp[1];
var D = tmp[2];
tmp = hms.split(":");
var h = tmp[0];
var m = tmp[1];
var s = tmp[2];

reg = reg || "hh:mm:ss";

/\bss\b/.test(reg) && (reg = reg.replace(/\bss\b/,s));
/\bmm\b/.test(reg) && (reg = reg.replace(/\bmm\b/,m));
/\bhh\b/.test(reg) && (reg = reg.replace(/\bhh\b/,h));
/\bMM\b/.test(reg) && (reg = reg.replace(/\bMM\b/,M));
/\bDD\b/.test(reg) && (reg = reg.replace(/\bDD\b/,D));
/\bYYYY\b/.test(reg) && (reg = reg.replace(/\bYYYY\b/,Y));
/\bYY\b/.test(reg) && (reg = reg.replace(/\bYYYY\b/,Y.substring(2)));

return reg;
}
};

var str2 = '$date{ddd,mm:ss}asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $${display} $pick{vid,${vid},11,22}';


var t = new Template(str2);
var respance = t.evaluate({vid:"123123123",ddd:"2011-08-26 16:10:06",display:"true"});
alert(respance);

//更改前:
//$date{ddd,mm:ss}asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $${display} $pick{vid,${vid},11,22}
//更改后:
//10:06asdfjakjsdlkfjkl<<><{}werwesdf$ {} sdfer $true 11



需要修改过滤字符new Template(str2,{filter:"$"})

this.regPattern可以分为三段来看
\$\{([^}]*?)\}
处理最普通的情况${...}
\$pick\{([^,]*?),([^,]*?),([^,]*?),([^}]*?)\}
处理三目运算,里面获取4个参数
\$date\{([^,]*?),([^}]*?)\}
处理时间格式化,获取里面2个参数
(^|[\s\S])
[\s\S] 匹配任意字符,包含\r,\t ,还包括开头

这正则干了这么两件事:
1)获取$前面的一个字符,如果是开头则不取,用来判断是否过滤
2)获取普通,时间格式化,三目运算的参数

扩展:
添加对应正则,添加对应的处理策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值