| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | 
							- var fs = require('fs');
 
- var path = require('path');
 
- module.exports = function (template) {
 
- 	var cacheStore = template.cache;
 
- 	var defaults = template.defaults;
 
- 	var rExtname;
 
- 	// 提供新的配置字段
 
- 	defaults.base = '';
 
- 	defaults.extname = '.html';
 
- 	defaults.encoding = 'utf-8';
 
- 	function compileFromFS(filename) {
 
- 		// 加载模板并编译
 
- 		var source = readTemplate(filename);
 
- 		if (typeof source === 'string') {
 
- 			return template.compile(source, {
 
- 				filename: filename
 
- 			});
 
- 		}
 
- 	}
 
- 	// 重写引擎编译结果获取方法
 
- 	template.get = function (filename) {
 
- 		
 
- 	    var fn;
 
- 	    if (cacheStore.hasOwnProperty(filename)) {
 
- 	        // 使用内存缓存
 
- 	        fn = cacheStore[filename];
 
- 	    } else {
 
- 			fn = compileFromFS(filename);
 
- 	    }
 
- 	    return fn;
 
- 	};
 
- 	
 
- 	function readTemplate (id) {
 
- 	    id = path.join(defaults.base, id + defaults.extname);
 
- 	    
 
- 	    if (id.indexOf(defaults.base) !== 0) {
 
- 	        // 安全限制:禁止超出模板目录之外调用文件
 
- 	        throw new Error('"' + id + '" is not in the template directory');
 
- 	    } else {
 
- 	        try {
 
- 	            return fs.readFileSync(id, defaults.encoding);
 
- 	        } catch (e) {}
 
- 	    }
 
- 	}
 
- 	// 重写模板`include``语句实现方法,转换模板为绝对路径
 
- 	template.utils.$include = function (filename, data, from) {
 
- 	    
 
- 	    from = path.dirname(from);
 
- 	    filename = path.join(from, filename);
 
- 	    
 
- 	    return template.renderFile(filename, data);
 
- 	}
 
- 	// express support
 
- 	template.__express = function (file, options, fn) {
 
- 	    if (typeof options === 'function') {
 
- 	        fn = options;
 
- 	        options = {};
 
- 	    }
 
- 		if (!rExtname) {
 
- 			// 去掉 express 传入的路径
 
- 			rExtname = new RegExp((defaults.extname + '$').replace(/\./g, '\\.'));
 
- 		}
 
- 	    file = file.replace(rExtname, '');
 
- 	    options.filename = file;
 
- 	    fn(null, template.renderFile(file, options));
 
- 	};
 
- 	return template;
 
- }
 
 
  |