Baris Usakli 12 years ago
commit d8489e2c66

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

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

@ -1,8 +1,21 @@
var templates = {};
(function() {
(function (module) {
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) {
if (config['custom_mapping'] && tpl) {
@ -12,11 +25,11 @@ var templates = {};
}
}
}
return false;
}
templates.ready = function(callback) {
//quick implementation because introducing a lib to handle several async callbacks
if (callback == null && ready_callback) ready_callback();
else ready_callback = callback;
};
@ -26,49 +39,80 @@ var templates = {};
template.html = raw_tpl;
template.parse = parse;
template.blocks = {};
return template;
};
function loadTemplates(templatesToLoad) {
var timestamp = new Date().getTime();
var loaded = templatesToLoad.length;
$.getJSON('/templates/config.json', function(data) {
config = data;
});
for (var t in templatesToLoad) {
(function(file) {
$.get('/templates/' + file + '.tpl?v=' + timestamp, function(html) {
var template = function() {
this.toString = function() {
return this.html;
};
}
template.prototype.parse = parse;
template.prototype.html = String(html);
template.prototype.blocks = {};
templates[file] = new template;
function loadServer() {
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]));
}
}
loaded--;
if (loaded == 0) templates.ready();
}).fail(function() {
loaded--;
if (loaded == 0) templates.ready();
});
}(templatesToLoad[t]));
function loadClient() {
var timestamp = new Date().getTime();
var loaded = templatesToLoad.length;
jQuery.getJSON('/templates/config.json', function(data) {
config = data;
});
for (var t in templatesToLoad) {
(function(file) {
jQuery.get('/templates/' + file + '.tpl?v=' + timestamp, function(html) {
var template = function() {
this.toString = function() {
return this.html;
};
}
template.prototype.parse = parse;
template.prototype.html = String(html);
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([
'header', 'footer', 'register', 'home', 'topic','account', 'category', 'users', 'accountedit', 'friends',
'login', 'reset', 'reset_code', 'account',
'confirm', '403',
'confirm', '403', 'logout',
'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/redis'
]);
@ -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) {
var location = document.location || window.location,
@ -185,3 +237,5 @@ function load_template(callback, url, template) {
if (callback) callback();
});
}

@ -9,5 +9,8 @@
"latest": "category",
"popular": "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));

@ -35,7 +35,7 @@ marked.setOptions({
postcount = [],
locked = [],
deleted = [],
pinned = [],
pinned = [];
for (var i=0, ii=tids.length; i<ii; i++) {
title.push('tid:' + tids[i] + ':title');
@ -75,26 +75,25 @@ marked.setOptions({
active_usernames = replies[1];
var topics = [];
if (tids.length > 0) {
title = replies[2];
uid = replies[3];
timestamp = replies[4];
slug = replies[5];
postcount = replies[6];
locked = replies[7];
deleted = replies[8];
pinned = replies[9];
title = replies[2];
uid = replies[3];
timestamp = replies[4];
slug = replies[5];
postcount = replies[6];
locked = replies[7];
deleted = replies[8];
pinned = replies[9];
var usernames,
has_read,
moderators,
teaser_info;
var usernames,
has_read,
moderators,
teaser_info;
function generate_topic() {
if (!usernames || !has_read || !moderators || !teaser_info) return;
function generate_topic() {
if (!usernames || !has_read || !moderators || !teaser_info) return;
if (tids.length > 0) {
for (var i=0, ii=title.length; i<ii; i++) {
console.log(teaser_info[i]);
topics.push({
'title' : title[i],
'uid' : uid[i],
@ -111,62 +110,61 @@ marked.setOptions({
'teaser_text': teaser_info[i].text,
'teaser_username': teaser_info[i].username
});
console.log(teaser_info[i].text, teaser_info[i].username);
}
// Float pinned topics to the top
topics = topics.sort(function(a, b) {
if (a.pinned !== b.pinned) return b.pinned - a.pinned;
else {
// Sort by datetime descending
return b.timestamp - a.timestamp;
}
});
var active_users = [];
for (var username in active_usernames) {
active_users.push({'username': active_usernames[username]});
}
callback({
'category_name' : category_id ? category_name : 'Recent',
'show_topic_button' : category_id ? 'show' : 'hidden',
'category_id': category_id || 0,
'topics': topics,
'active_users': active_users,
'moderator_block_class': moderators.length > 0 ? '' : 'none',
'moderators': moderators
});
}
user.get_usernames_by_uids(uid, function(userNames) {
usernames = userNames;
generate_topic();
});
Topics.hasReadTopics(tids, current_user, function(hasRead) {
has_read = hasRead;
generate_topic();
// Float pinned topics to the top
topics = topics.sort(function(a, b) {
if (a.pinned !== b.pinned) return b.pinned - a.pinned;
else {
// Sort by datetime descending
return b.timestamp - a.timestamp;
}
});
categories.getModerators(category_id, function(mods) {
moderators = mods;
generate_topic();
});
var active_users = [];
for (var username in active_usernames) {
active_users.push({'username': active_usernames[username]});
}
Topics.get_teasers(tids, function(teasers) {
teaser_info = teasers;
generate_topic();
});
}
else {
callback({
'category_name' : category_id ? category_name : 'Recent',
'show_topic_button' : category_id ? 'show' : 'hidden',
'category_id': category_id || 0,
'topics': []
'topics': topics,
'active_users': active_users,
'moderator_block_class': moderators.length > 0 ? '' : 'none',
'moderators': moderators
});
}
user.get_usernames_by_uids(uid, function(userNames) {
usernames = userNames;
generate_topic();
});
Topics.hasReadTopics(tids, current_user, function(hasRead) {
has_read = hasRead;
generate_topic();
});
categories.getModerators(category_id, function(mods) {
moderators = mods;
generate_topic();
});
Topics.get_teasers(tids, function(teasers) {
teaser_info = teasers;
generate_topic();
});
// else {
// callback({
// 'category_name' : category_id ? category_name : 'Recent',
// 'show_topic_button' : category_id ? 'show' : 'hidden',
// 'category_id': category_id || 0,
// 'topics': []
// });
// }
});
});
}

@ -447,9 +447,10 @@ var config = require('../config.js'),
};
User.get_usernames_by_uids = function(uids, callback) {
var usernames = [];
if (!Array.isArray(uids)) return callback([]);
for(var i=0, ii=uids.length; i<ii; ++i) {
User.getUserField(uids[i],'username', function(username){

@ -20,7 +20,7 @@ var express = require('express'),
(function(app) {
var templates = global.templates;
var templates = null;
// Middlewares
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'
}));
module.exports.init = function() {
templates = global.templates;
}
auth.initialize(app);
app.use(function(req, res, next) {

@ -6,8 +6,7 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
user = require('./user.js'),
posts = require('./posts.js'),
topics = require('./topics.js'),
categories = require('./categories.js'),
templates = require('./templates.js');
categories = require('./categories.js');
(function(io) {
var users = {},
@ -50,10 +49,6 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
var uid = users[hs.sessionID];
if (DEVELOPMENT === true) {
// refreshing templates
templates.init();
}
/*process.on('uncaughtException', function(err) {
// handle the error safely

Loading…
Cancel
Save