UNPKG

3.53 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 fs = require('fs');
10var jade = require('jade');
11var LangUtils = require('@themost/common/utils').LangUtils;
12var ArgumentError = require('@themost/common/utils').ArgumentError;
13var HttpViewEngine = require('../types').HttpViewEngine;
14var _ = require('lodash');
15var PostExecuteResultArgs = require('./../handlers/directive').PostExecuteResultArgs;
16var DirectiveEngine = require('./../handlers/directive').DirectiveEngine;
17var HttpViewContext = require('./../mvc').HttpViewContext;
18
19/**
20 * @this JadeEngine
21 * @param {string} result
22 * @param {*} data
23 * @param {Function} callback
24 */
25function postRender(result, data, callback) {
26 var directiveHandler = new DirectiveEngine();
27 var viewContext = new HttpViewContext(this.context);
28 viewContext.body = result;
29 viewContext.data = data;
30 var args = _.assign(new PostExecuteResultArgs(), {
31 "context": this.context,
32 "target": viewContext
33 });
34 directiveHandler.postExecuteResult(args, function(err) {
35 if (err) {
36 return callback(err);
37 }
38 return callback(null, viewContext.body);
39 });
40}
41/**
42 * @class
43 * @param {HttpContext=} context
44 * @constructor
45 * @augments {HttpViewEngine}
46 */
47function JadeEngine(context) {
48 JadeEngine.super_.bind(this)(context);
49}
50LangUtils.inherits(JadeEngine,HttpViewEngine);
51/**
52 * @param {string} file
53 * @param {*} data
54 * @param {Function} callback
55 */
56JadeEngine.prototype.render = function(file, data, callback) {
57 callback = callback || function () {};
58 try {
59 var self = this;
60 if (typeof file !== 'string') {
61 return callback(new ArgumentError("Jade template URI must be a string."));
62 }
63 fs.readFile(file, 'utf8', function(err, source) {
64 if (err) {
65 return callback(err);
66 }
67 //render data
68 try {
69 const fn = jade.compile(source, {
70 filename: file,
71 pretty: true
72 });
73 var html = { };
74 Object.defineProperty(html, 'context', {
75 get: function() {
76 return self.context;
77 },
78 enumerable:false, configurable:false
79 });
80 const result = fn({
81 html:html,
82 model:data
83 });
84 return postRender.bind(self)(result, data, function(err, finalResult) {
85 if (err) {
86 return callback(err);
87 }
88 return callback(null, finalResult);
89 });
90 }
91 catch (err) {
92 return callback(err);
93 }
94 });
95 } catch (err) {
96 return callback(err);
97 }
98};
99/**
100 * @static
101 * @param {HttpContext=} context
102 * @returns {JadeEngine}
103 */
104JadeEngine.createInstance = function(context) {
105 return new JadeEngine(context);
106};
107
108if (typeof exports !== 'undefined') {
109 module.exports.JadeEngine = JadeEngine;
110 /**
111 * @param {HttpContext=} context
112 * @returns {JadeEngine}
113 */
114 module.exports.createInstance = function(context) {
115 return JadeEngine.createInstance(context);
116 };
117}
\No newline at end of file