UNPKG

dotnode

Version:

.NET-like MVC framework for Node.js

143 lines (98 loc) 3.44 kB
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;