UNPKG

3.96 kBJavaScriptView Raw
1/**
2 * @license
3 * MOST Web Framework 2.0 Codename Blueshift
4 * Copyright (c) 2017, THEMOST LP All rights reserved
5 *
6 * Use of this source code is governed by an BSD-3-Clause license that can be
7 * found in the LICENSE file at https://themost.io/license
8 */
9var LangUtils = require('@themost/common/utils').LangUtils;
10var HttpViewEngine = require('../types').HttpViewEngine;
11var Symbol = require('symbol');
12var vash = require('vash');
13var path = require('path');
14var fs = require('fs');
15var contextProperty = Symbol('context');
16var _ = require('lodash');
17var PostExecuteResultArgs = require('./../handlers/directive').PostExecuteResultArgs;
18var DirectiveEngine = require('./../handlers/directive').DirectiveEngine;
19var HttpViewContext = require('./../mvc').HttpViewContext;
20
21/**
22 * @this VashEngine
23 * @param {string} result
24 * @param {*} data
25 * @param {Function} callback
26 */
27function postRender(result, data, callback) {
28 var directiveHandler = new DirectiveEngine();
29 var viewContext = new HttpViewContext(this.context);
30 viewContext.body = result;
31 viewContext.data = data;
32 var args = _.assign(new PostExecuteResultArgs(), {
33 "context": this.context,
34 "target": viewContext
35 });
36 directiveHandler.postExecuteResult(args, function(err) {
37 if (err) {
38 return callback(err);
39 }
40 return callback(null, viewContext.body);
41 });
42}
43
44/**
45 *
46 * @param model
47 * @returns {HttpContext}
48 */
49vash.helpers.context = function(model) {
50 return model[contextProperty];
51};
52
53/**
54 * @name compile
55 * @type {Function}
56 * @memberOf vash
57 *
58 * @name helpers
59 * @type {*}
60 * @memberOf vash
61 */
62
63/**
64 * @class
65 * @constructor
66 * @param {HttpContext=} context
67 * @augments {HttpViewEngine}
68 */
69function VashEngine(context) {
70 VashEngine.super_.bind(this)(context);
71}
72LangUtils.inherits(VashEngine, HttpViewEngine);
73
74/**
75 *
76 * @param {string} filename
77 * @param {*=} data
78 * @param {Function} callback
79 */
80VashEngine.prototype.render = function(filename, data, callback) {
81 callback = callback || function() {};
82 const self = this;
83 try {
84 fs.readFile(filename, 'utf8', function(err, source) {
85 if (err) {
86 return callback(err);
87 }
88 //render data
89 try {
90 vash.config.settings = vash.config.settings || {};
91 _.assign(vash.config.settings, {
92 views: path.resolve(self.getContext().getApplication().getExecutionPath(), "views")
93 });
94 var tpl = vash.compile(source);
95 data = data || { };
96 data[contextProperty] = self.context;
97 tpl(data, function(err, ctx) {
98 if (err) {
99 return callback(err);
100 }
101 try {
102 var result = ctx.finishLayout();
103 return postRender.bind(self)(result, data, function(err, finalResult) {
104 if (err) {
105 return callback(err);
106 }
107 return callback(null, finalResult);
108 });
109 }
110 catch(err) {
111 return callback(err);
112 }
113
114 });
115 }
116 catch (err) {
117 return callback(err);
118 }
119 });
120 }
121 catch(e) {
122 return callback(e);
123 }
124};
125/**
126 * @param {HttpContext=} context
127 * @returns {VashEngine}
128 */
129VashEngine.createInstance = function(context) {
130 return new VashEngine(context);
131};
132
133
134if (typeof exports !== 'undefined') {
135 module.exports.VashEngine = VashEngine;
136 /**
137 * @param {HttpContext=} context
138 * @returns {VashEngine}
139 */
140 module.exports.createInstance = function(context) {
141 return VashEngine.createInstance(context);
142 };
143}