UNPKG

3.97 kBJavaScriptView Raw
1var async = require('async');
2var engine = new TemplateEngine();
3var fs = require('fs');
4var minify = require('html-minifier').minify;
5var path = require('path');
6
7function TemplateEngine() {
8
9 var self = this;
10
11 function readAsync(file, callback) {
12 if (file)
13 fs.readFile(file, 'utf8', callback);
14 }
15
16 self.source = {
17 hash: function (raw, base) {
18 var source = {contents: raw, templates: []};
19 var parts = source.contents.split(/(?=templateUrl)/g);
20
21 parts.forEach(function (element, index) {
22
23 var match = (element.match(/(?!,)templateUrl(.*)$/gm));
24
25 if (match) {
26 var templateUrl = match[0].split(':')[1].split(',')[0].replace(/"/g, '').replace(/'/g, '').trim()
27 var relative = path.resolve(__dirname + base, '../' + templateUrl);
28 source.templates.push(relative);
29 }
30 });
31
32 return source;
33 },
34 read: function (target) {
35 var deferred = new Promise(function (resolve, reject) {
36 fs.readFile(__dirname + target, 'utf8', function (err, data) {
37 resolve(data);
38 });
39 });
40
41 return deferred;
42 }
43 }
44
45 self.templates = {
46 get: function (source) {
47 var deferred = new Promise(function (resolve, reject) {
48 async.map(source.templates, readAsync, function (err, results) {
49
50 results.forEach(function (element, index, arr) {
51 source.templates[index] = minify(element, {collapseWhitespace: true, removeComments: true}) // minify the markup
52 });
53
54 resolve(source);
55 });
56 });
57
58 return deferred;
59 },
60 set: function (transformed) {
61 var deferred = new Promise(function (resolve, reject) {
62
63 var parts = transformed.contents.split(/(?=templateUrl)(?!,)/g);
64
65 parts.forEach(function (element, index, arr) {
66
67 var match = (element.match(/(?!,)templateUrl(.*)$/gm));
68
69 if (match)
70 arr[index] = arr[index].replace(/(?!,)templateUrl(.*),$/gm, 'template: \'' + transformed.templates.shift().replace(/'/g, "\\'") + '\',')
71 });
72
73 resolve(parts.join(''));
74 });
75
76 return deferred;
77 }
78 }
79}
80
81// TODO - solve pathing weirdness
82// TODO - refine poor regex check
83// TODO - identify passed options, likely relayed to html-minifier
84// TODO - identify failure points and return error through callbacks
85// TODO - recurse templating for ng-include support
86// TODO - travis ci
87// TODO - README
88
89function TemplateManager() {
90
91 var self = this;
92
93 self.inline = function (input, options, done) { // -- in
94
95 if (options.gulp) {
96
97 var base = '/' + path.dirname(path.relative(__dirname, options.target));
98 var source = engine.source.hash(input, base);
99
100 engine.templates.get(source).then(function (transformed) {
101 engine.templates.set(transformed).then(function (output) {
102 done(output); // -- out
103 });
104 });
105
106 } else {
107 engine.source.read(input).then(function (data) {
108
109 var base = path.dirname(input);
110 var source = engine.source.hash(data, base);
111
112 engine.templates.get(source).then(function (transformed) {
113 engine.templates.set(transformed).then(function (output) {
114 done(output); // -- out
115 });
116 });
117 });
118 }
119 }
120}
121
122module.exports = new TemplateManager();
123module.exports.engine = engine;
\No newline at end of file