@themost/web
Version:
MOST Web Framework 2.0 - Web Server Module
117 lines (115 loc) • 3.53 kB
JavaScript
/**
* @license
* MOST Web Framework 2.0 Codename Blueshift
* Copyright (c) 2017, THEMOST LP All rights reserved
*
* Use of this source code is governed by an BSD-3-Clause license that can be
* found in the LICENSE file at https://themost.io/license
*/
var fs = require('fs');
var jade = require('jade');
var LangUtils = require('@themost/common/utils').LangUtils;
var ArgumentError = require('@themost/common/utils').ArgumentError;
var HttpViewEngine = require('../types').HttpViewEngine;
var _ = require('lodash');
var PostExecuteResultArgs = require('./../handlers/directive').PostExecuteResultArgs;
var DirectiveEngine = require('./../handlers/directive').DirectiveEngine;
var HttpViewContext = require('./../mvc').HttpViewContext;
/**
* @this JadeEngine
* @param {string} result
* @param {*} data
* @param {Function} callback
*/
function postRender(result, data, callback) {
var directiveHandler = new DirectiveEngine();
var viewContext = new HttpViewContext(this.context);
viewContext.body = result;
viewContext.data = data;
var args = _.assign(new PostExecuteResultArgs(), {
"context": this.context,
"target": viewContext
});
directiveHandler.postExecuteResult(args, function(err) {
if (err) {
return callback(err);
}
return callback(null, viewContext.body);
});
}
/**
* @class
* @param {HttpContext=} context
* @constructor
* @augments {HttpViewEngine}
*/
function JadeEngine(context) {
JadeEngine.super_.bind(this)(context);
}
LangUtils.inherits(JadeEngine,HttpViewEngine);
/**
* @param {string} file
* @param {*} data
* @param {Function} callback
*/
JadeEngine.prototype.render = function(file, data, callback) {
callback = callback || function () {};
try {
var self = this;
if (typeof file !== 'string') {
return callback(new ArgumentError("Jade template URI must be a string."));
}
fs.readFile(file, 'utf8', function(err, source) {
if (err) {
return callback(err);
}
//render data
try {
const fn = jade.compile(source, {
filename: file,
pretty: true
});
var html = { };
Object.defineProperty(html, 'context', {
get: function() {
return self.context;
},
enumerable:false, configurable:false
});
const result = fn({
html:html,
model:data
});
return postRender.bind(self)(result, data, function(err, finalResult) {
if (err) {
return callback(err);
}
return callback(null, finalResult);
});
}
catch (err) {
return callback(err);
}
});
} catch (err) {
return callback(err);
}
};
/**
* @static
* @param {HttpContext=} context
* @returns {JadeEngine}
*/
JadeEngine.createInstance = function(context) {
return new JadeEngine(context);
};
if (typeof exports !== 'undefined') {
module.exports.JadeEngine = JadeEngine;
/**
* @param {HttpContext=} context
* @returns {JadeEngine}
*/
module.exports.createInstance = function(context) {
return JadeEngine.createInstance(context);
};
}