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);
|