mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 19:46:01 +01:00
Merge remote-tracking branch 'origin' into notifications
Conflicts: src/webserver.js
This commit is contained in:
103
public/src/utils.js
Normal file
103
public/src/utils.js
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
(function (module) {
|
||||||
|
|
||||||
|
var utils, fs;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs = require('fs');
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = utils = {
|
||||||
|
generateUUID: function() {
|
||||||
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||||
|
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
|
||||||
|
return v.toString(16);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
//Adapted from http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search
|
||||||
|
walk: function(dir, done) {
|
||||||
|
var main_dir = global.configuration.ROOT_DIRECTORY + '/public/templates/';
|
||||||
|
var results = [];
|
||||||
|
fs.readdir(dir, function(err, list) {
|
||||||
|
if (err) return done(err);
|
||||||
|
var pending = list.length;
|
||||||
|
if (!pending) return done(null, results);
|
||||||
|
list.forEach(function(file) {
|
||||||
|
file = dir + '/' + file;
|
||||||
|
fs.stat(file, function(err, stat) {
|
||||||
|
if (stat && stat.isDirectory()) {
|
||||||
|
utils.walk(file, function(err, res) {
|
||||||
|
results = results.concat(res);
|
||||||
|
if (!--pending) done(null, results);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
results.push(file.replace(main_dir, '').replace('.tpl', ''));
|
||||||
|
if (!--pending) done(null, results);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
relativeTime: function(timestamp) {
|
||||||
|
var now = +new Date(),
|
||||||
|
difference = now - Math.floor(parseFloat(timestamp));
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 1000);
|
||||||
|
|
||||||
|
if (difference < 60) return difference + ' second' + (difference !== 1 ? 's' : '');
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 60);
|
||||||
|
if (difference < 60) return difference + ' minute' + (difference !== 1 ? 's' : '');
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 60);
|
||||||
|
if (difference < 24) return difference + ' hour' + (difference !== 1 ? 's' : '');
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 24);
|
||||||
|
if (difference < 30) return difference + ' day' + (difference !== 1 ? 's' : '');
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 30);
|
||||||
|
if (difference < 12) return difference + ' month' + (difference !== 1 ? 's' : '');
|
||||||
|
|
||||||
|
difference = Math.floor(difference / 12);
|
||||||
|
return difference + ' year' + (difference !== 1 ? 's' : '');
|
||||||
|
},
|
||||||
|
|
||||||
|
//http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
|
||||||
|
slugify: function(str) {
|
||||||
|
str = str.replace(/^\s+|\s+$/g, ''); // trim
|
||||||
|
str = str.toLowerCase();
|
||||||
|
|
||||||
|
// remove accents, swap ñ for n, etc
|
||||||
|
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
|
||||||
|
var to = "aaaaeeeeiiiioooouuuunc------";
|
||||||
|
for (var i=0, l=from.length ; i<l ; i++) {
|
||||||
|
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
|
||||||
|
.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
||||||
|
.replace(/-+/g, '-'); // collapse dashes
|
||||||
|
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Willingly stolen from: http://phpjs.org/functions/strip_tags/
|
||||||
|
'strip_tags': function(input, allowed) {
|
||||||
|
allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
|
||||||
|
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
|
||||||
|
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
|
||||||
|
|
||||||
|
return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
|
||||||
|
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ('undefined' !== typeof window) {
|
||||||
|
window.utils = module.exports;
|
||||||
|
}
|
||||||
|
|
||||||
|
})('undefined' === typeof module ? {module:{exports:{}}} : module)
|
||||||
@@ -3,6 +3,13 @@
|
|||||||
"admin/topics[^]*": "admin/topics",
|
"admin/topics[^]*": "admin/topics",
|
||||||
"admin/categories[^]*": "admin/categories",
|
"admin/categories[^]*": "admin/categories",
|
||||||
"admin/users[^]*": "admin/users",
|
"admin/users[^]*": "admin/users",
|
||||||
|
"admin/redis[^]*": "admin/redis",
|
||||||
|
"admin/index[^]*": "admin/index",
|
||||||
|
"admin/themes[^]*": "admin/themes",
|
||||||
|
"admin/settings[^]*": "admin/settings",
|
||||||
|
"admin/twitter[^]*": "admin/twitter",
|
||||||
|
"admin/facebook[^]*": "admin/facebook",
|
||||||
|
"admin/gplus[^]*": "admin/gplus",
|
||||||
"users[^]*edit": "accountedit",
|
"users[^]*edit": "accountedit",
|
||||||
"users[^]*friends": "friends",
|
"users[^]*friends": "friends",
|
||||||
"users/[^]*": "account",
|
"users/[^]*": "account",
|
||||||
|
|||||||
@@ -88,10 +88,11 @@
|
|||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
// Notifications dropdown
|
// Notifications dropdown
|
||||||
var notifTrigger = document.querySelector('.notifications a'),
|
var notifContainer = document.getElementsByClassName('notifications')[0],
|
||||||
|
notifTrigger = notifContainer.querySelector('a'),
|
||||||
notifList = document.getElementById('notif-list');
|
notifList = document.getElementById('notif-list');
|
||||||
notifTrigger.addEventListener('click', function() {
|
notifTrigger.addEventListener('click', function() {
|
||||||
socket.emit('api:notifications.get');
|
if (notifContainer.className.indexOf('open') === -1) socket.emit('api:notifications.get');
|
||||||
});
|
});
|
||||||
notifList.addEventListener('click', function(e) {
|
notifList.addEventListener('click', function(e) {
|
||||||
var target;
|
var target;
|
||||||
@@ -106,7 +107,6 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
socket.on('api:notifications.get', function(data) {
|
socket.on('api:notifications.get', function(data) {
|
||||||
console.log(data);
|
|
||||||
var notifFrag = document.createDocumentFragment(),
|
var notifFrag = document.createDocumentFragment(),
|
||||||
notifEl = document.createElement('li'),
|
notifEl = document.createElement('li'),
|
||||||
numRead = data.read.length,
|
numRead = data.read.length,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
var RDB = require('./redis.js'),
|
var RDB = require('./redis.js'),
|
||||||
posts = require('./posts.js'),
|
posts = require('./posts.js'),
|
||||||
utils = require('./utils.js'),
|
utils = require('./../public/src/utils.js'),
|
||||||
user = require('./user.js'),
|
user = require('./user.js'),
|
||||||
async = require('async'),
|
async = require('async'),
|
||||||
topics = require('./topics.js');
|
topics = require('./topics.js');
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
var config = require('../config.js'),
|
var config = require('../config.js'),
|
||||||
RDB = require('./redis.js'),
|
RDB = require('./redis.js'),
|
||||||
async = require('async');
|
async = require('async'),
|
||||||
|
utils = require('./utils.js');
|
||||||
|
|
||||||
(function(Notifications) {
|
(function(Notifications) {
|
||||||
Notifications.get = function(nid, callback) {
|
Notifications.get = function(nid, callback) {
|
||||||
@@ -15,12 +16,17 @@ var config = require('../config.js'),
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Notifications.create = function(text, score, path, callback) {
|
Notifications.create = function(text, score, path, uniqueId, callback) {
|
||||||
/*
|
/*
|
||||||
* Score guide:
|
* Score guide:
|
||||||
* 0 Low priority messages (probably unused)
|
* 0 Low priority messages (probably unused)
|
||||||
* 5 Normal messages
|
* 5 Normal messages
|
||||||
* 10 High priority messages
|
* 10 High priority messages
|
||||||
|
*
|
||||||
|
* uniqueId is used solely to override stale nids.
|
||||||
|
* If a new nid is pushed to a user and an existing nid in the user's
|
||||||
|
* (un)read list contains the same uniqueId, it will be removed, and
|
||||||
|
* the new one put in its place.
|
||||||
*/
|
*/
|
||||||
RDB.incr('notifications:next_nid', function(err, nid) {
|
RDB.incr('notifications:next_nid', function(err, nid) {
|
||||||
RDB.hmset(
|
RDB.hmset(
|
||||||
@@ -29,6 +35,7 @@ var config = require('../config.js'),
|
|||||||
'score', score || 5,
|
'score', score || 5,
|
||||||
'path', path || null,
|
'path', path || null,
|
||||||
'datetime', new Date().getTime(),
|
'datetime', new Date().getTime(),
|
||||||
|
'uniqueId', uniqueId || utils.generateUUID(),
|
||||||
function(err, status) {
|
function(err, status) {
|
||||||
if (status === 'OK') callback(nid);
|
if (status === 'OK') callback(nid);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var RDB = require('./redis.js'),
|
var RDB = require('./redis.js'),
|
||||||
utils = require('./utils.js'),
|
utils = require('./../public/src/utils.js'),
|
||||||
marked = require('marked'),
|
marked = require('marked'),
|
||||||
user = require('./user.js'),
|
user = require('./user.js'),
|
||||||
topics = require('./topics.js'),
|
topics = require('./topics.js'),
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
redis = require('redis'),
|
redis = require('redis'),
|
||||||
config = require('../config.js'),
|
config = require('../config.js'),
|
||||||
utils = require('./utils.js');
|
utils = require('./../public/src/utils.js');
|
||||||
|
|
||||||
|
|
||||||
RedisDB.exports = redis.createClient(config.redis.port, config.redis.host, config.redis.options);
|
RedisDB.exports = redis.createClient(config.redis.port, config.redis.host, config.redis.options);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
var user = require('./../user.js'),
|
var user = require('./../user.js'),
|
||||||
fs = require('fs'),
|
fs = require('fs'),
|
||||||
utils = require('./../utils.js'),
|
utils = require('./../../public/src/utils.js'),
|
||||||
config = require('../../config.js'),
|
config = require('../../config.js'),
|
||||||
marked = require('marked');
|
marked = require('marked');
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
var RDB = require('./redis.js'),
|
var RDB = require('./redis.js'),
|
||||||
posts = require('./posts.js'),
|
posts = require('./posts.js'),
|
||||||
utils = require('./utils.js'),
|
utils = require('./../public/src/utils.js'),
|
||||||
user = require('./user.js'),
|
user = require('./user.js'),
|
||||||
config = require('../config.js'),
|
config = require('../config.js'),
|
||||||
categories = require('./categories.js'),
|
categories = require('./categories.js'),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var config = require('../config.js'),
|
var config = require('../config.js'),
|
||||||
utils = require('./utils.js'),
|
utils = require('./../public/src/utils.js'),
|
||||||
RDB = require('./redis.js'),
|
RDB = require('./redis.js'),
|
||||||
crypto = require('crypto'),
|
crypto = require('crypto'),
|
||||||
emailjs = require('emailjs'),
|
emailjs = require('emailjs'),
|
||||||
|
|||||||
91
src/utils.js
91
src/utils.js
@@ -1,91 +0,0 @@
|
|||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
var utils = {
|
|
||||||
generateUUID: function() {
|
|
||||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
||||||
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
|
|
||||||
return v.toString(16);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
//Adapted from http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search
|
|
||||||
walk: function(dir, done) {
|
|
||||||
var main_dir = global.configuration.ROOT_DIRECTORY + '/public/templates/';
|
|
||||||
var results = [];
|
|
||||||
fs.readdir(dir, function(err, list) {
|
|
||||||
if (err) return done(err);
|
|
||||||
var pending = list.length;
|
|
||||||
if (!pending) return done(null, results);
|
|
||||||
list.forEach(function(file) {
|
|
||||||
file = dir + '/' + file;
|
|
||||||
fs.stat(file, function(err, stat) {
|
|
||||||
if (stat && stat.isDirectory()) {
|
|
||||||
utils.walk(file, function(err, res) {
|
|
||||||
results = results.concat(res);
|
|
||||||
if (!--pending) done(null, results);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
results.push(file.replace(main_dir, '').replace('.tpl', ''));
|
|
||||||
if (!--pending) done(null, results);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
relativeTime: function(timestamp) {
|
|
||||||
var now = +new Date(),
|
|
||||||
difference = now - Math.floor(parseFloat(timestamp));
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 1000);
|
|
||||||
|
|
||||||
if (difference < 60) return difference + ' second' + (difference !== 1 ? 's' : '');
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 60);
|
|
||||||
if (difference < 60) return difference + ' minute' + (difference !== 1 ? 's' : '');
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 60);
|
|
||||||
if (difference < 24) return difference + ' hour' + (difference !== 1 ? 's' : '');
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 24);
|
|
||||||
if (difference < 30) return difference + ' day' + (difference !== 1 ? 's' : '');
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 30);
|
|
||||||
if (difference < 12) return difference + ' month' + (difference !== 1 ? 's' : '');
|
|
||||||
|
|
||||||
difference = Math.floor(difference / 12);
|
|
||||||
return difference + ' year' + (difference !== 1 ? 's' : '');
|
|
||||||
},
|
|
||||||
|
|
||||||
//http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
|
|
||||||
slugify: function(str) {
|
|
||||||
str = str.replace(/^\s+|\s+$/g, ''); // trim
|
|
||||||
str = str.toLowerCase();
|
|
||||||
|
|
||||||
// remove accents, swap ñ for n, etc
|
|
||||||
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
|
|
||||||
var to = "aaaaeeeeiiiioooouuuunc------";
|
|
||||||
for (var i=0, l=from.length ; i<l ; i++) {
|
|
||||||
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
|
|
||||||
.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
|
||||||
.replace(/-+/g, '-'); // collapse dashes
|
|
||||||
|
|
||||||
return str;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Willingly stolen from: http://phpjs.org/functions/strip_tags/
|
|
||||||
'strip_tags': function(input, allowed) {
|
|
||||||
allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
|
|
||||||
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
|
|
||||||
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
|
|
||||||
|
|
||||||
return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
|
|
||||||
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = utils;
|
|
||||||
@@ -7,6 +7,7 @@ var express = require('express'),
|
|||||||
redis = require('redis'),
|
redis = require('redis'),
|
||||||
redisServer = redis.createClient(config.redis.port, config.redis.host, config.redis.options),
|
redisServer = redis.createClient(config.redis.port, config.redis.host, config.redis.options),
|
||||||
marked = require('marked'),
|
marked = require('marked'),
|
||||||
|
utils = require('./../public/src/utils.js'),
|
||||||
fs = require('fs'),
|
fs = require('fs'),
|
||||||
|
|
||||||
user = require('./user.js'),
|
user = require('./user.js'),
|
||||||
@@ -14,7 +15,6 @@ var express = require('express'),
|
|||||||
posts = require('./posts.js'),
|
posts = require('./posts.js'),
|
||||||
topics = require('./topics.js'),
|
topics = require('./topics.js'),
|
||||||
notifications = require('./notifications.js'),
|
notifications = require('./notifications.js'),
|
||||||
utils = require('./utils.js'),
|
|
||||||
admin = require('./routes/admin.js'),
|
admin = require('./routes/admin.js'),
|
||||||
userRoute = require('./routes/user.js'),
|
userRoute = require('./routes/user.js'),
|
||||||
auth = require('./routes/authentication.js');
|
auth = require('./routes/authentication.js');
|
||||||
|
|||||||
Reference in New Issue
Block a user