dotnode
Version:
.NET-like MVC framework for Node.js
143 lines (98 loc) • 3.44 kB
JavaScript
var fs = require('fs'),
path = require('path'),
extend = require('xtend'),
Bliss = require('bliss'),
HtmlHelper = require('../html/htmlHelper');
var ViewEngine = function (appContext) {
this._baseViewsPath = 'views';
this._viewExtension = 'js.html';
this._renderers = {};
this._configureBliss();
};
// #region public methods
ViewEngine.prototype.setBasePath = function (basePath) {
this._baseViewsPath = basePath;
return this;
};
ViewEngine.prototype.render = function (options) {
var viewName = options.viewName,
model = options.model,
controllerName = options.controllerName,
areaName = options.areaName,
controllerContext = options.controllerContext,
viewOptions = options.viewOptions || {},
viewPath = options.viewPath,
request = options.request,
response = options.response;
if (typeof viewOptions.writeToResponse == 'undefined') {
viewOptions.writeToResponse = true;
}
if (typeof viewOptions.renderLayout == 'undefined') {
viewOptions.renderLayout = true;
}
var appDirectory = './';
var filePath = this._baseViewsPath + '/' + (viewPath || controllerName + '/' + viewName);
if (typeof areaName == 'string') {
filePath = areaName + '/' + filePath;
}
filePath = appDirectory + '' + filePath + '.' + this._viewExtension;
var sections = {},
url = controllerContext.url,
pageOptions = controllerContext.pageOptions,
viewBag = controllerContext.viewBag;
var viewContext = {
viewBag: viewBag,
pageOptions: pageOptions,
url: url,
sections: sections,
controllerContext: controllerContext
};
var htmlHelper = new HtmlHelper(viewContext);
viewContext.html = htmlHelper;
var viewTemplate = this._renderer.compileFile(filePath, {
context: viewContext
});
var viewString = viewTemplate(model);
var result = viewString;
if (viewOptions.renderLayout) {
var layoutRelativePath = controllerContext.layoutPath || '/shared/layout.js.html';
var layoutPath = appDirectory + '/' + this._baseViewsPath + layoutRelativePath;
var layoutViewContext = extend({}, viewContext, {
body: viewString
})
var layoutTemplate = this._renderer.compileFile(layoutPath, {
context: layoutViewContext
});
result = layoutTemplate();
}
if (viewOptions.writeToResponse) {
response.writeHead(200, { "Content-Type": "text/html" });
response.end(result);
}
return result;
};
// #endregion
// #region private methods
ViewEngine.prototype._configureBliss = function () {
this._renderer = new Bliss({
ext: '.js.html',
cacheEnabled: false,
context: {
html: {},
url: {},
viewBag: {},
viewData: {}
}
});
};
ViewEngine.prototype._processFileContents = function (response, err, content) {
var statusCode = 200;
if (err) {
statusCode = 500;
throw err;
}
response.writeHead(statusCode, { "Content-Type": "text/html" });
response.end(content);
};
// #endregion
module.exports = ViewEngine;