简单的Template

早上写得1个Template得简单实现。但现在只能实现变量插入,函数调用。想加入if else 判断 for循环,但是正则表达式只是半桶水。没办法做下去。如果能有人补充下去就好了。无比感谢。

 

 <script LANGUAGE="JavaScript">
  <!--	
	
	Date.prototype.format = function(format){
	  var o = {
		"M+" : this.getMonth()+1, //month
		"d+" : this.getDate(),    //day
		"h+" : this.getHours(),   //hour
		"m+" : this.getMinutes(), //minute
		"s+" : this.getSeconds(), //second
		"q+" : Math.floor((this.getMonth()+3)/3),  //quarter
		"S" : this.getMilliseconds() //millisecond
	  }
	  if(/(y+)/.test(format)) {
		format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
	  }
	  for(var k in o){
		  if(new RegExp("("+ k +")").test(format)){
			format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
		  }
	  }
	  return format;
	};

	function formatDate(date, format){
		var yr = date.substring(0,4);
		var mh = date.substring(4,6);
		var dy = date.substring(6,8);
		var d = new Date();

		d.setYear(yr);
		d.setMonth(mh-1);
		d.setDate(dy);
		
		return d.format(format);
	}

	function formatMoney(prefix, amount){
		return prefix + amount;
	}

	function add(a,b){
		return a+b;
	}

	function multiply(a,b){
		return a*b;
	}
	
	var tplText = [
		' attr1: ${attr1}\n', 
		' attr2.attr21: ${attr2.attr21}\n',
		' test date : #formatDate(${date}, \'yyyy-MM-dd\') \n', 
		' test currency: #formatMoney("Y",1000)\n',
		' test add : #add(${num1},${num2})\n',
		' test multiply : #multiply(#add(30,40), #add(2,3))\n'
	].join();

	var root = {
		attr1 : 'val1',
		attr2 : {
			'attr21' : 'val21'
		},
		date : '20080812',
		num1 : 10,
		num2 : 20
	}

	function Template(tpl){
		this.tpl = tpl;
		this.throwUndefError = false;
	}

	Template.prototype = {
		apply : function(dataModel){
			var _freg = /#[a-zA-Z0-9]+\(([^\(\)]*)\)/g;			
			var _vreg = /\$\{([a-zA-Z0-9\.]+)\}/g;

			var _root = dataModel;
			var fn;
			var _msg = [], _isMsg = this.throwUndefError;

			while(this.tpl.match(_freg)){
				this.tpl = this.tpl.replace(_freg, function(){
					fn = arguments[0];
					fn = fn.replace(_vreg, function(){
						var _value = eval('_root.'+arguments[1]);					
						if(_value){						
							if( 'string' == typeof _value ){
								return '\''+eval('_root.'+arguments[1]) +'\'';
							} else {
								return _value;
							}
						} else if(_isMsg){
							_msg.push(arguments[1]+' unexist!');
						}
					});
					fn = fn.substring(1);
					return eval(fn);
				});
			}
			
			this.tpl = this.tpl.replace(_vreg, function(){ 
				var _value = eval('_root.'+arguments[1]);
				if(_value){
					return eval('_root.'+arguments[1]);
				} else if(_isMsg){
					_msg.push(arguments[1]+' unexist!');
				}
			});

			
			if( 0 != _msg.length){
				alert('Error:\n'+_msg.join('\n'));
			}			
			return this.tpl;
		}
	}
	
	var tpl = new Template(tplText);
	alert(tpl.apply(root));

  //-->
  </script>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值