Coverage

100%
80
80
0

d:/workspace/thinkjs-behavior-ejs/lib/EjsBehavior.js

100%
80
80
0
LineHitsSource
11'use strict';
2
31module.exports = Behavior(function() {
41 var fs = require('fs');
51 var ejs = require('ejs');
61 var thinkEjs = thinkRequire('ejs');
7
81 var filterRe = ['^('];
91 for (var n in ejs.filters) {
1023 if (filterRe.length > 1) {
1122 filterRe.push('|');
12 }
1323 filterRe.push(n);
14 }
151 filterRe.push(')$');
161 filterRe = new RegExp(filterRe.join(''));
17
181 return {
19 options: {
20 'ejs_behavior_actions': []
21 },
22
23 init: function(http) {
2413 this.http = http;
2513 for (var name in this.options) {
2613 if (C(name) !== undefined) {
2713 this.options[name] = C(name);
28 }
29 }
3013 if (isArray(this.options.ejs_behavior_actions)) {
311 this.includeActions = this.options.ejs_behavior_actions;
3212 } else if (this.options.ejs_behavior_actions) {
3311 this.includeActions = [this.options.ejs_behavior_actions];
34 } else {
351 this.includeActions = [];
36 }
3713 this.templatePath = [VIEW_PATH, '/', this.http.group, '/', 'tpl', '/'].join('');
38 },
39
40 checkAction: function() {
415 var action = (this.http.group + '/' + this.http.controller + '/' + this.http.action).toLowerCase();
425 var includeActions = this.includeActions;
435 var isInclude = false;
445 for (var i = 0, len = includeActions.length; i < len; i++) {
455 if ((isRegexp(includeActions[i]) && includeActions[i].test(action)) || (includeActions[i] == action)) {
463 isInclude = true;
473 break;
48 }
49 }
505 return isInclude;
51 },
52
53 listIncludeTemplate: function() {
545 var self = this;
555 var deferred = getDefer();
565 var includeRe = new RegExp(['^', self.http.controller, C('tpl_file_depr'), self.http.action, C('tpl_file_depr'), '(.+)', C('tpl_file_suffix'), '$'].join('').toLowerCase());
575 fs.readdir(self.templatePath, function(err, files) {
585 if (err) {
591 deferred.reject(err);
60 } else {
614 var includeTemplateFiles = [];
624 files.forEach(function(file) {
6312 var matches = file.match(includeRe);
6412 if (matches && matches[0]) {
656 includeTemplateFiles.push([matches[1], file]);
66 }
67 });
684 deferred.resolve(includeTemplateFiles);
69 }
70 })
715 return deferred.promise;
72 },
73
74 fetchTemplate: function(templateFile) {
755 var self = this;
765 var deferred = getDefer();
775 fs.readFile(self.templatePath + templateFile[1], { encoding: C('encoding') }, function(err, content) {
785 if (err) {
791 deferred.reject(err);
80 } else {
814 deferred.resolve([templateFile[0], content]);
82 }
83 })
845 return deferred.promise;
85 },
86
87 buildFilters: function() {
882 var filters = thinkEjs.filters;
892 var exFilters = [];
902 var ret = [];
912 for (var n in filters) {
9248 if (!filterRe.test(n)) {
932 exFilters.push([n, filters[n].toString()]);
94 }
95 }
962 if (exFilters.length > 0) {
972 ret.push('<script>');
982 ret.push('(function() {');
992 exFilters.forEach(function(f) {
1002 ret.push('ejs.filters.' + f[0] + ' = ' + f[1] + ';');
101 });
1022 ret.push('}());');
1032 ret.push('</script>');
104 }
1052 return ret;
106 },
107
108 run: function(data) {
1093 var self = this;
1103 if (self.checkAction()) {
1112 var outTpls = [].concat(self.buildFilters());
1122 return self.listIncludeTemplate().then(function(includeTemplateFiles) {
1132 var includeTemplates = [];
1142 includeTemplateFiles.forEach(function(file) {
1153 includeTemplates.push(self.fetchTemplate(file));
116 });
1172 return Promise.all(includeTemplates).then(function(contents) {
1182 contents.forEach(function(content) {
1193 outTpls.push('<script id="_ejs_tpl_' + (self.http.controller + '_' + self.http.action + '_' + content[0]).toLowerCase() + '" type="text/template">');
1203 outTpls.push(content[1]);
1213 outTpls.push('</script>');
122 });
1232 data.var._ejs_templates = outTpls.join('\n');
1242 return data;
125 });
126 });
127 } else {
1281 return data;
129 }
130 }
131 }
132});
133