UNPKG

5.11 kBJavaScriptView Raw
1(function() {
2 var block_end_regex, block_start_regex, clear_blocks, eco, findit, fs, generate, get_name, http, include_regex, load_templates, mongoose, name_regex, parent_regex, parse_includes, parse_parents, read_blocks, replace_blocks, res;
3 eco = require('eco');
4 mongoose = require('mongoose');
5 fs = require('fs');
6 findit = require('findit');
7 name_regex = /"(\w|\d|_|\/)+"/;
8 block_start_regex = /<% ?block "(\w|\d|_)+" ?%>/g;
9 block_end_regex = /<% ?endblock ?%>/g;
10 parent_regex = /^<% ?parent "(\w|\d|_|\/)+" ?%>/g;
11 include_regex = /<% ?include "(\w|\d|_|\/)+" ?%>/g;
12 get_name = function(tag) {
13 return name_regex.exec(tag)[0].replace('"', '').replace('"', '');
14 };
15 parse_includes = function(src, templates) {
16 var tags;
17 tags = src.match(include_regex);
18 while (tags != null) {
19 tags.each(function(tag) {
20 var include_src, name;
21 name = get_name(tag);
22 if (templates[name] != null) {
23 include_src = templates[name];
24 } else {
25 include_src = "<p>Error: Template <b>" + name + "</b> not found.</p>";
26 }
27 return src = src.replace(tag, include_src);
28 });
29 tags = src.match(include_regex);
30 }
31 return src;
32 };
33 read_blocks = function(src) {
34 var blocks, tags;
35 blocks = {};
36 tags = src.match(block_start_regex);
37 if (tags) {
38 tags.each(function(tag) {
39 var content, end, name, start;
40 name = get_name(tag);
41 start = src.search(tag);
42 end = start + src.substring(start).search(block_end_regex);
43 content = src.substring(start, end).replace(tag, '');
44 return blocks[name] = content;
45 });
46 }
47 return blocks;
48 };
49 replace_blocks = function(src, blocks) {
50 var tags;
51 tags = src.match(block_start_regex);
52 if (tags) {
53 tags.each(function(tag) {
54 var content, end, name, start;
55 name = get_name(tag);
56 start = src.search(tag);
57 end = start + src.substring(start).search(block_end_regex);
58 content = src.substring(start, end).replace(tag, '');
59 if (blocks[name] != null) {
60 return src = src.replace(content, blocks[name]);
61 }
62 });
63 }
64 return src;
65 };
66 clear_blocks = function(src) {
67 return src.replace(block_start_regex, '').replace(block_end_regex, '');
68 };
69 parse_parents = function(src, templates) {
70 var blocks, name, parent_blocks, parent_src, tags;
71 blocks = read_blocks(src);
72 tags = src.match(parent_regex);
73 while (tags != null) {
74 name = get_name(tags.first());
75 if (templates[name] != null) {
76 parent_src = templates[name];
77 } else {
78 parent_src = "<p>Error: Template <b>" + name + "</b> not found.</p>";
79 }
80 parent_blocks = read_blocks(parent_src);
81 blocks = Object.merge(parent_blocks, blocks);
82 tags = parent_src.match(parent_regex);
83 }
84 if (parent_src != null) {
85 src = parent_src;
86 }
87 src = replace_blocks(src, blocks);
88 return src = clear_blocks(src);
89 };
90 generate = function(name, templates) {
91 var src;
92 src = templates[name];
93 src = parse_parents(src, templates);
94 return src = parse_includes(src, templates);
95 };
96 app.get('/js/templates.js', function(req, res) {
97 var funcs, src;
98 funcs = [];
99 Object.each(app.templates, function(name, src) {
100 var f;
101 if (name.has('/_') || name.startsWith('_')) {
102 try {
103 f = eco.compile(src);
104 } catch (err) {
105 f = function() {
106 return console.log("Eco template '" + name + "' has compilation problem: " + err);
107 };
108 }
109 return funcs.push("'" + name + "': " + (f.toString()));
110 }
111 });
112 src = "var __templates = { " + (funcs.join(", ")) + " };\nvar render = function(name, context){\n if (context == null) { context = {}; }\n context.conf = " + (JSON.stringify(app.conf)) + ";\n if (__templates[name] == null) { return 'Template <b>' + name + '</b> not found.'; }\n return __templates[name](context);\n}";
113 res.contentType('application/javascript');
114 return res.send(src);
115 });
116 load_templates = function() {
117 var templates;
118 templates = {};
119 findit.sync(app.conf.templates_path, function(f) {
120 var name, src;
121 if (f.endsWith('.html')) {
122 name = f.remove(app.conf.templates_path + '/').remove('.html');
123 src = fs.readFileSync(f, 'utf-8');
124 return templates[name] = src;
125 }
126 });
127 return templates;
128 };
129 module.exports = load_templates();
130 http = require('http');
131 res = http.ServerResponse.prototype;
132 res.render = function(name, context) {
133 var html, src, templates;
134 if (context == null) {
135 context = {};
136 }
137 templates = load_templates();
138 if (templates[name] != null) {
139 src = generate(name, templates);
140 try {
141 html = eco.render(src, context);
142 } catch (err) {
143 html = "Error: Template <b>" + name + "</b> <i>" + err + "</i>";
144 }
145 } else {
146 html = "Error: Template <b>" + name + "</b> not found.";
147 }
148 return this.send(html);
149 };
150}).call(this);