| 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;}
 |