123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /**
-
- @Name : layui.laytpl 模板引擎
- @Author:贤心
- @License:MIT
-
- */
- layui.define(function(exports){
- "use strict";
- var config = {
- open: '{{',
- close: '}}'
- };
- var tool = {
- exp: function(str){
- return new RegExp(str, 'g');
- },
- //匹配满足规则内容
- query: function(type, _, __){
- var types = [
- '#([\\s\\S])+?', //js语句
- '([^{#}])*?' //普通字段
- ][type || 0];
- return exp((_||'') + config.open + types + config.close + (__||''));
- },
- escape: function(html){
- return String(html||'').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&')
- .replace(/</g, '<').replace(/>/g, '>').replace(/'/g, ''').replace(/"/g, '"');
- },
- error: function(e, tplog){
- var error = 'Laytpl Error:';
- typeof console === 'object' && console.error(error + e + '\n'+ (tplog || ''));
- return error + e;
- }
- };
- var exp = tool.exp, Tpl = function(tpl){
- this.tpl = tpl;
- };
- Tpl.pt = Tpl.prototype;
- window.errors = 0;
- //编译模版
- Tpl.pt.parse = function(tpl, data){
- var that = this, tplog = tpl;
- var jss = exp('^'+config.open+'#', ''), jsse = exp(config.close+'$', '');
-
- tpl = tpl.replace(/\s+|\r|\t|\n/g, ' ')
- .replace(exp(config.open+'#'), config.open+'# ')
- .replace(exp(config.close+'}'), '} '+config.close).replace(/\\/g, '\\\\')
-
- //不匹配指定区域的内容
- .replace(exp(config.open + '!(.+?)!' + config.close), function(str){
- str = str.replace(exp('^'+ config.open + '!'), '')
- .replace(exp('!'+ config.close), '')
- .replace(exp(config.open + '|' + config.close), function(tag){
- return tag.replace(/(.)/g, '\\$1')
- });
- return str
- })
-
- //匹配JS规则内容
- .replace(/(?="|')/g, '\\').replace(tool.query(), function(str){
- str = str.replace(jss, '').replace(jsse, '');
- return '";' + str.replace(/\\/g, '') + ';view+="';
- })
-
- //匹配普通字段
- .replace(tool.query(1), function(str){
- var start = '"+(';
- if(str.replace(/\s/g, '') === config.open+config.close){
- return '';
- }
- str = str.replace(exp(config.open+'|'+config.close), '');
- if(/^=/.test(str)){
- str = str.replace(/^=/, '');
- start = '"+_escape_(';
- }
- return start + str.replace(/\\/g, '') + ')+"';
- });
-
- tpl = '"use strict";var view = "' + tpl + '";return view;';
- try{
- that.cache = tpl = new Function('d, _escape_', tpl);
- return tpl(data, tool.escape);
- } catch(e){
- delete that.cache;
- return tool.error(e, tplog);
- }
- };
- Tpl.pt.render = function(data, callback){
- var that = this, tpl;
- if(!data) return tool.error('no data');
- tpl = that.cache ? that.cache(data, tool.escape) : that.parse(that.tpl, data);
- if(!callback) return tpl;
- callback(tpl);
- };
- var laytpl = function(tpl){
- if(typeof tpl !== 'string') return tool.error('Template not found');
- return new Tpl(tpl);
- };
- laytpl.config = function(options){
- options = options || {};
- for(var i in options){
- config[i] = options[i];
- }
- };
- laytpl.v = '1.2.0';
-
- exports('laytpl', laytpl);
- });
|