deprecated server side templates finally. code sharing between client side and server side templates; force_refresh parameter added to temasd

deprecated server side templates finally. code sharing between client
side and server side templates; force_refresh parameter added to
templates config.json; created initialization fn for webserver
v1.18.x
psychobunny 12 years ago
parent 3df8d7279b
commit 1cdbd376ba

@ -1,5 +1,5 @@
var categories = require('./src/categories.js'), var categories = require('./src/categories.js'),
templates = require('./src/templates.js'), templates = require('./public/src/templates.js'),
webserver = require('./src/webserver.js'), webserver = require('./src/webserver.js'),
websockets = require('./src/websockets.js'), websockets = require('./src/websockets.js'),
fs = require('fs'); fs = require('fs');
@ -12,6 +12,9 @@ global.configuration = {};
config['ROOT_DIRECTORY'] = __dirname; config['ROOT_DIRECTORY'] = __dirname;
templates.init(); templates.init();
templates.ready(function() {
webserver.init();
});
//setup scripts to be moved outside of the app in future. //setup scripts to be moved outside of the app in future.
function setup_categories() { function setup_categories() {

@ -39,7 +39,7 @@ var ajaxify = {};
tpl_url = url; tpl_url = url;
} }
if (templates[tpl_url]) { if (templates[tpl_url] && !templates.force_refresh(tpl_url)) {
if (quiet !== true) { if (quiet !== true) {
window.history.pushState({ window.history.pushState({
"url": url "url": url

@ -1,8 +1,21 @@
var templates = {};
(function() {
(function (module) {
var ready_callback, var ready_callback,
config = {}; config = {},
templates,
fs = null;
module.exports = templates = {};
try {
fs = require('fs');
} catch (e) {}
templates.force_refresh = function(tpl) {
return !!config.force_refresh[tpl];
}
templates.get_custom_map = function(tpl) { templates.get_custom_map = function(tpl) {
if (config['custom_mapping'] && tpl) { if (config['custom_mapping'] && tpl) {
@ -12,11 +25,11 @@ var templates = {};
} }
} }
} }
return false; return false;
} }
templates.ready = function(callback) { templates.ready = function(callback) {
//quick implementation because introducing a lib to handle several async callbacks
if (callback == null && ready_callback) ready_callback(); if (callback == null && ready_callback) ready_callback();
else ready_callback = callback; else ready_callback = callback;
}; };
@ -26,49 +39,80 @@ var templates = {};
template.html = raw_tpl; template.html = raw_tpl;
template.parse = parse; template.parse = parse;
template.blocks = {}; template.blocks = {};
return template; return template;
}; };
function loadTemplates(templatesToLoad) { function loadTemplates(templatesToLoad) {
var timestamp = new Date().getTime(); function loadServer() {
var loaded = templatesToLoad.length; var loaded = templatesToLoad.length;
for (var t in templatesToLoad) {
(function(file) {
fs.readFile(global.configuration.ROOT_DIRECTORY + '/public/templates/' + file + '.tpl', function(err, html) {
var template = function() {
this.toString = function() {
return this.html;
};
}
template.prototype.file = file;
template.prototype.parse = parse;
template.prototype.html = String(html);
global.templates[file] = new template;
loaded--;
if (loaded == 0) templates.ready();
});
}(templatesToLoad[t]));
}
}
$.getJSON('/templates/config.json', function(data) { function loadClient() {
config = data; var timestamp = new Date().getTime();
}); var loaded = templatesToLoad.length;
for (var t in templatesToLoad) { jQuery.getJSON('/templates/config.json', function(data) {
(function(file) { config = data;
$.get('/templates/' + file + '.tpl?v=' + timestamp, function(html) { });
var template = function() {
this.toString = function() {
return this.html;
};
}
template.prototype.parse = parse; for (var t in templatesToLoad) {
template.prototype.html = String(html); (function(file) {
template.prototype.blocks = {}; jQuery.get('/templates/' + file + '.tpl?v=' + timestamp, function(html) {
templates[file] = new template; var template = function() {
this.toString = function() {
loaded--; return this.html;
if (loaded == 0) templates.ready(); };
}).fail(function() { }
loaded--;
if (loaded == 0) templates.ready(); template.prototype.parse = parse;
}); template.prototype.html = String(html);
}(templatesToLoad[t])); template.prototype.blocks = {};
templates[file] = new template;
loaded--;
if (loaded == 0) templates.ready();
}).fail(function() {
loaded--;
if (loaded == 0) templates.ready();
});
}(templatesToLoad[t]));
}
} }
if (fs === null) loadClient();
else loadServer();
} }
function init() { templates.init = function() {
loadTemplates([ loadTemplates([
'header', 'footer', 'register', 'home', 'topic','account', 'category', 'users', 'accountedit', 'friends', 'header', 'footer', 'register', 'home', 'topic','account', 'category', 'users', 'accountedit', 'friends',
'login', 'reset', 'reset_code', 'account', 'login', 'reset', 'reset_code', 'account',
'confirm', '403', 'confirm', '403', 'logout',
'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext', 'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext',
'admin/index', 'admin/categories', 'admin/users', 'admin/topics', 'admin/settings', 'admin/themes', 'admin/twitter', 'admin/facebook', 'admin/gplus' 'admin/index', 'admin/categories', 'admin/users', 'admin/topics', 'admin/settings', 'admin/themes', 'admin/twitter', 'admin/facebook', 'admin/gplus'
]); ]);
@ -157,9 +201,17 @@ var templates = {};
} }
init();
if ('undefined' !== typeof window) {
window.templates = module.exports;
templates.init();
}
})('undefined' === typeof module ? {module:{exports:{}}} : module)
}());
function load_template(callback, url, template) { function load_template(callback, url, template) {
var location = document.location || window.location, var location = document.location || window.location,
@ -184,4 +236,6 @@ function load_template(callback, url, template) {
document.getElementById('content').innerHTML = templates[tpl].parse(JSON.parse(data)); document.getElementById('content').innerHTML = templates[tpl].parse(JSON.parse(data));
if (callback) callback(); if (callback) callback();
}); });
} }

@ -9,5 +9,8 @@
"latest": "category", "latest": "category",
"popular": "category", "popular": "category",
"active": "category" "active": "category"
},
"force_refresh": {
"logout": true
} }
} }

@ -1,114 +0,0 @@
var fs = require('fs');
// to be deprecated in favour of client-side only templates.
(function(Templates) {
global.templates = {};
function loadTemplates(templatesToLoad) {
for (var t in templatesToLoad) {
(function(file) {
fs.readFile(global.configuration.ROOT_DIRECTORY + '/public/templates/' + file + '.tpl', function(err, html) {
var template = function() {
this.toString = function() {
return this.html;
};
}
template.prototype.file = file;
template.prototype.parse = parse;
template.prototype.html = String(html);
global.templates[file] = new template;
});
}(templatesToLoad[t]));
}
}
Templates.init = function() {
loadTemplates([
'header', 'footer', 'register', 'home', 'topic', 'account', 'friends',
'login', 'reset', 'reset_code',
'403', 'logout',
'admin/header', 'admin/footer', 'admin/index',
'emails/header', 'emails/footer',
'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext'
]);
}
var parse = function(data) {
function replace(key, value, template) {
var searchRegex = new RegExp('{' + key + '}', 'g');
return template.replace(searchRegex, value);
}
function makeRegex(block) {
return new RegExp("<!-- BEGIN " + block + " -->[^]*<!-- END " + block + " -->", 'g');
}
function getBlock(regex, block, template) {
data = template.match(regex);
if (data == null) return;
data = data[0]
.replace("<!-- BEGIN " + block + " -->", "")
.replace("<!-- END " + block + " -->", "");
return data;
}
function setBlock(regex, block, template) {
return template.replace(regex, block);
}
var template = this.html, regex, block;
return (function parse(data, namespace, template) {
console.log(this.file + ' is being called on server side. Templates will be deprecated soon');
if (Object.keys(data).length == 0) {
regex = makeRegex('[^]*');
template = template.replace(regex, '');
}
for (var d in data) {
if (data.hasOwnProperty(d)) {
if (data[d] instanceof String || data[d] === null) {
continue;
} else if (data[d].constructor == Array) {
namespace += d;
regex = makeRegex(d),
block = getBlock(regex, namespace, template)
if (block == null) continue;
var numblocks = data[d].length - 1, i = 0, result = "";
do {
result += parse(data[d][i], namespace + '.', block);
} while (i++ < numblocks);
template = setBlock(regex, result, template);
} else if (data[d] instanceof Object) {
namespace += d + '.';
regex = makeRegex(d),
block = getBlock(regex, namespace, template)
if (block == null) continue;
block = parse(data[d], namespace, block);
template = setBlock(regex, block, template);
} else {
template = replace(namespace + d, data[d], template);
}
}
}
return template;
})(data, "", template);
}
}(exports));

@ -20,7 +20,7 @@ var express = require('express'),
(function(app) { (function(app) {
var templates = global.templates; var templates = null;
// Middlewares // Middlewares
app.use(express.favicon()); // 2 args: string path and object options (i.e. expire time etc) app.use(express.favicon()); // 2 args: string path and object options (i.e. expire time etc)
@ -38,6 +38,11 @@ var express = require('express'),
key: 'express.sid' key: 'express.sid'
})); }));
module.exports.init = function() {
templates = global.templates;
}
auth.initialize(app); auth.initialize(app);
app.use(function(req, res, next) { app.use(function(req, res, next) {

Loading…
Cancel
Save