UNPKG

thinknode

Version:

A fast, flexible and all-in-one web framework for node.js.

135 lines (104 loc) 5.28 kB
'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;