diff --git a/app.js b/app.js index e448a6a534..9858ea7023 100644 --- a/app.js +++ b/app.js @@ -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() { diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 94074c825f..d5d26b1cc1 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -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 diff --git a/public/src/templates.js b/public/src/templates.js index 28015a169e..f030d94f5c 100644 --- a/public/src/templates.js +++ b/public/src/templates.js @@ -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; + 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])); + } + } - $.getJSON('/templates/config.json', function(data) { - config = data; - }); + function loadClient() { + var timestamp = new Date().getTime(); + var loaded = templatesToLoad.length; - for (var t in templatesToLoad) { - (function(file) { - $.get('/templates/' + file + '.tpl?v=' + timestamp, function(html) { - - var template = function() { - this.toString = function() { - return this.html; - }; - } + jQuery.getJSON('/templates/config.json', function(data) { + config = data; + }); - 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])); + 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, @@ -184,4 +236,6 @@ function load_template(callback, url, template) { document.getElementById('content').innerHTML = templates[tpl].parse(JSON.parse(data)); if (callback) callback(); }); -} \ No newline at end of file +} + + diff --git a/public/templates/config.json b/public/templates/config.json index df327ff93e..33cad7eda6 100644 --- a/public/templates/config.json +++ b/public/templates/config.json @@ -9,5 +9,8 @@ "latest": "category", "popular": "category", "active": "category" + }, + "force_refresh": { + "logout": true } } \ No newline at end of file diff --git a/src/templates.js b/src/templates.js deleted file mode 100644 index 383a3b4213..0000000000 --- a/src/templates.js +++ /dev/null @@ -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("[^]*", 'g'); - } - - function getBlock(regex, block, template) { - data = template.match(regex); - if (data == null) return; - - data = data[0] - .replace("", "") - .replace("", ""); - - 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)); \ No newline at end of file diff --git a/src/topics.js b/src/topics.js index e7f8619f70..166698b239 100644 --- a/src/topics.js +++ b/src/topics.js @@ -35,7 +35,7 @@ marked.setOptions({ postcount = [], locked = [], deleted = [], - pinned = [], + pinned = []; for (var i=0, ii=tids.length; i 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 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(); - }); + 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': [] + // }); + // } }); }); } diff --git a/src/user.js b/src/user.js index 38f21481f4..dd23660769 100644 --- a/src/user.js +++ b/src/user.js @@ -447,8 +447,9 @@ 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