thinknode
Version:
A fast, flexible and all-in-one web framework for node.js.
135 lines (104 loc) • 5.28 kB
JavaScript
'use strict';
exports.__esModule = true;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* 定位并渲染模板中间件
* @author richen
* @copyright Copyright (c) 2015 - <richenlin(at)gmail.com>
* @license MIT
* @version 15/11/19
*/
var _class = function (_THINK$Middleware) {
(0, _inherits3.default)(_class, _THINK$Middleware);
function _class() {
(0, _classCallCheck3.default)(this, _class);
return (0, _possibleConstructorReturn3.default)(this, _THINK$Middleware.apply(this, arguments));
}
_class.prototype.init = function init(http) {
this.http = http;
this.options = THINK.config('tpl_engine_config');
var key = THINK.hash((0, _stringify2.default)(this.options));
if (!(key in THINK_CACHES.INSTANCES.CACHE)) {
//get tpl pase engine instance
var engine = THINK.config('tpl_engine_type');
var clsEngine = THINK.adapter(THINK.ucFirst(engine) + 'Template');
THINK_CACHES.INSTANCES.CACHE[key] = new clsEngine(this.options);
}
this.handle = THINK_CACHES.INSTANCES.CACHE[key];
};
_class.prototype.run = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(data) {
var tplFile;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
tplFile = this.locateTpl(data.file);
if (!(!tplFile || !THINK.isFile(tplFile))) {
_context.next = 5;
break;
}
return _context.abrupt('return', THINK.statusAction(this.http, 404, 'can\'t find template file ' + (tplFile || '')));
case 5:
//将模版文件路径写入到http对象上,供writehtmlcache里使用
this.http._tplfile = tplFile;
//使用await兼容不同模板引擎解析的同步或异步操作
_context.next = 8;
return this.handle.fetch(tplFile, data.var);
case 8:
return _context.abrupt('return', _context.sent);
case 9:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function run(_x) {
return _ref.apply(this, arguments);
}
return run;
}();
/**
* 定位模板文件
* @param templateFile
* @return {Promise.<T>}
*/
_class.prototype.locateTpl = function locateTpl(templateFile) {
try {
var controller = this.http.controller ? this.http.controller.toLowerCase() : '';
var action = this.http.action ? this.http.action.toLowerCase() : '';
if (THINK.isEmpty(templateFile)) {
//根据group, controller, action自动生成
templateFile = [THINK.APP_PATH, THINK.sep, this.http.group, THINK.sep, 'View', THINK.sep, THINK.config('tpl_default_theme') || 'default', THINK.sep, controller, THINK.config('tpl_file_depr'), action, THINK.config('tpl_file_suffix')].join('');
} else {
if (!THINK.isFile(templateFile)) {
//模块式访问 group/controller/view
templateFile = templateFile.toString();
var tplPath = templateFile.split('/');
action = tplPath.pop().toLowerCase() || action;
controller = tplPath.pop().toLowerCase() || controller;
var group = THINK.ucFirst(tplPath.pop() || this.http.group);
templateFile = [THINK.APP_PATH, THINK.sep, group, THINK.sep, 'View', THINK.sep, THINK.config('tpl_default_theme') || 'default', THINK.sep, controller, THINK.config('tpl_file_depr'), action, THINK.config('tpl_file_suffix')].join('');
}
}
return templateFile;
} catch (e) {
return false;
}
};
return _class;
}(THINK.Middleware);
exports.default = _class;