Baris Usakli 12 years ago
commit 59f4b6788a

@ -35,7 +35,8 @@
"request": "~2.25.0", "request": "~2.25.0",
"reds": "~0.2.4", "reds": "~0.2.4",
"winston": "~0.7.2", "winston": "~0.7.2",
"nodebb-plugin-mentions": "~0.1.0" "nodebb-plugin-mentions": "~0.1.0",
"nodebb-plugin-markdown": "~0.1.0"
}, },
"bugs": { "bugs": {
"url": "https://github.com/designcreateplay/NodeBB/issues" "url": "https://github.com/designcreateplay/NodeBB/issues"

@ -66,27 +66,35 @@ var RDB = require('./redis.js'),
postSearch.index(content, pid); postSearch.index(content, pid);
}); });
posts.getPostField(pid, 'tid', function(tid) { async.parallel([
PostTools.isMain(pid, tid, function(isMainPost) { function(next) {
if (isMainPost) { posts.getPostField(pid, 'tid', function(tid) {
topics.setTopicField(tid, 'title', title); PostTools.isMain(pid, tid, function(isMainPost) {
topicSearch.remove(tid, function() { if (isMainPost) {
topicSearch.index(title, tid); topics.setTopicField(tid, 'title', title);
topicSearch.remove(tid, function() {
topicSearch.index(title, tid);
next(null, tid);
});
}
}); });
}
io.sockets.in('topic_' + tid).emit('event:post_edited', {
pid: pid,
title: title,
content: PostTools.markdownToHTML(content)
}); });
},
function(next) {
PostTools.toHTML(content, next);
}
], function(err, results) {
io.sockets.in('topic_' + results[0]).emit('event:post_edited', {
pid: pid,
title: title,
content: results[1]
}); });
}); });
}; };
PostTools.privileges(pid, uid, function(privileges) { PostTools.privileges(pid, uid, function(privileges) {
if (privileges.editable) { if (privileges.editable) {
plugins.fireHook('filter:save_post_content', content, function(parsedContent) { plugins.fireHook('filter:post.save', content, function(parsedContent) {
content = parsedContent; content = parsedContent;
success(); success();
}); });
@ -161,35 +169,28 @@ var RDB = require('./redis.js'),
}); });
} }
PostTools.markdownToHTML = function(md, isSignature) { PostTools.toHTML = function(raw, callback) {
var marked = require('marked'), plugins.fireHook('filter:post.parse', raw, function(parsed) {
cheerio = require('cheerio'); var cheerio = require('cheerio');
marked.setOptions({ if (parsed && parsed.length > 0) {
breaks: true var parsedContentDOM = cheerio.load(parsed);
}); var domain = nconf.get('url');
if (md && md.length > 0) {
var parsedContentDOM = cheerio.load(marked(md));
var domain = nconf.get('url');
parsedContentDOM('a').each(function() { parsedContentDOM('a').each(function() {
this.attr('rel', 'nofollow'); this.attr('rel', 'nofollow');
var href = this.attr('href'); var href = this.attr('href');
if (href && !href.match(domain) && !utils.isRelativeUrl(href)) { if (href && !href.match(domain) && !utils.isRelativeUrl(href)) {
this.attr('href', domain + 'outgoing?url=' + encodeURIComponent(href)); this.attr('href', domain + 'outgoing?url=' + encodeURIComponent(href));
if (!isSignature) this.append(' <i class="icon-external-link"></i>'); }
} });
});
html = parsedContentDOM.html();
} else {
html = '<p></p>';
}
return html; callback(null, parsedContentDOM.html());
} else {
callback(null, '<p></p>');
}
});
} }

@ -34,28 +34,29 @@ var RDB = require('./redis.js'),
Posts.addUserInfoToPost = function(post, callback) { Posts.addUserInfoToPost = function(post, callback) {
user.getUserFields(post.uid, ['username', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned'], function(err, userData) { user.getUserFields(post.uid, ['username', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned'], function(err, userData) {
if(err) if(err) return callback();
return callback();
postTools.toHTML(userData.signature, function(err, signature) {
post.username = userData.username || 'anonymous'; post.username = userData.username || 'anonymous';
post.userslug = userData.userslug || ''; post.userslug = userData.userslug || '';
post.user_rep = userData.reputation || 0; post.user_rep = userData.reputation || 0;
post.user_postcount = userData.postcount || 0; post.user_postcount = userData.postcount || 0;
post.user_banned = userData.banned || '0'; post.user_banned = userData.banned || '0';
post.picture = userData.picture || require('gravatar').url('', {}, https=nconf.get('https')); post.picture = userData.picture || require('gravatar').url('', {}, https=nconf.get('https'));
post.signature = postTools.markdownToHTML(userData.signature, true); post.signature = signature;
if(post.editor !== '') { if(post.editor !== '') {
user.getUserFields(post.editor, ['username', 'userslug'], function(err, editorData) { user.getUserFields(post.editor, ['username', 'userslug'], function(err, editorData) {
if(err) if(err) return callback();
return callback();
post.editorname = editorData.username; post.editorname = editorData.username;
post.editorslug = editorData.userslug; post.editorslug = editorData.userslug;
callback();
});
} else {
callback(); callback();
}); }
} else { });
callback();
}
}); });
} }
@ -64,28 +65,41 @@ var RDB = require('./redis.js'),
var posts = []; var posts = [];
function getPostSummary(pid, callback) { function getPostSummary(pid, callback) {
Posts.getPostFields(pid, ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'], function(postData) { async.waterfall([
if(postData.deleted === '1') { function(next) {
return callback(null); Posts.getPostFields(pid, ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'], function(postData) {
} if (postData.deleted === '1') return callback(null);
else {
Posts.addUserInfoToPost(postData, function() { postData.relativeTime = utils.relativeTime(postData.timestamp);
next(null, postData);
}
});
},
function(postData, next) {
Posts.addUserInfoToPost(postData, function() {
next(null, postData);
});
},
function(postData, next) {
topics.getTopicFields(postData.tid, ['slug', 'deleted'], function(err, topicData) { topics.getTopicFields(postData.tid, ['slug', 'deleted'], function(err, topicData) {
if(err) if (err) return callback(err);
return callback(err); else if (topicData.deleted === '1') return callback(null);
if(topicData.deleted === '1')
return callback(null);
if(postData.content)
postData.content = utils.strip_tags(postTools.markdownToHTML(postData.content));
postData.relativeTime = utils.relativeTime(postData.timestamp);
postData.topicSlug = topicData.slug; postData.topicSlug = topicData.slug;
posts.push(postData); next(null, postData);
callback(null);
}); });
}); },
function(postData, next) {
if (postData.content) {
postTools.toHTML(postData.content, function(err, content) {
if (!err) postData.content = utils.strip_tags(content);
next(err, postData);
});
} else next(null, postData);
}
], function(err, postData) {
if (!err) posts.push(postData);
callback(err);
}); });
} }
@ -144,7 +158,7 @@ var RDB = require('./redis.js'),
Posts.getPostsByPids = function(pids, callback) { Posts.getPostsByPids = function(pids, callback) {
var posts = []; var posts = [];
function iterator(pid, callback) { async.eachSeries(pids, function (pid, callback) {
Posts.getPostData(pid, function(postData) { Posts.getPostData(pid, function(postData) {
if(postData) { if(postData) {
postData.relativeTime = utils.relativeTime(postData.timestamp); postData.relativeTime = utils.relativeTime(postData.timestamp);
@ -152,8 +166,6 @@ var RDB = require('./redis.js'),
postData['edited-class'] = postData.editor !== '' ? '' : 'none'; postData['edited-class'] = postData.editor !== '' ? '' : 'none';
postData['relativeEditTime'] = postData.edited !== '0' ? utils.relativeTime(postData.edited) : ''; postData['relativeEditTime'] = postData.edited !== '0' ? utils.relativeTime(postData.edited) : '';
postData.content = postTools.markdownToHTML(postData.content);
if(postData.uploadedImages) { if(postData.uploadedImages) {
try { try {
postData.uploadedImages = JSON.parse(postData.uploadedImages); postData.uploadedImages = JSON.parse(postData.uploadedImages);
@ -164,13 +176,15 @@ var RDB = require('./redis.js'),
} else { } else {
postData.uploadedImages = []; postData.uploadedImages = [];
} }
posts.push(postData);
postTools.toHTML(postData.content, function(err, content) {
postData.content = content;
posts.push(postData);
callback(null);
});
} }
callback(null);
}); });
} }, function(err) {
async.eachSeries(pids, iterator, function(err) {
if(!err) { if(!err) {
callback(null, posts); callback(null, posts);
} else { } else {
@ -329,8 +343,9 @@ var RDB = require('./redis.js'),
}, },
content: function(next) { content: function(next) {
plugins.fireHook('filter:post.get', postData, function(postData) { plugins.fireHook('filter:post.get', postData, function(postData) {
postData.content = postTools.markdownToHTML(postData.content, false); postTools.toHTML(postData.content, function(err, content) {
next(null, postData.content); next(null, content);
});
}); });
} }
}, function(err, results) { }, function(err, results) {

@ -44,7 +44,7 @@ var user = require('./../user.js'),
require('async').each(data.categories, iterator, function(err) { require('async').each(data.categories, iterator, function(err) {
data.motd_class = (meta.config.show_motd === '1' || meta.config.show_motd === undefined) ? '' : 'none'; data.motd_class = (meta.config.show_motd === '1' || meta.config.show_motd === undefined) ? '' : 'none';
data.motd = marked(meta.config.motd || "# NodeBB <span class='hidden-phone'>v " + pkg.version + "</span>\nWelcome to NodeBB, the discussion platform of the future.\n\n<a target=\"_blank\" href=\"http://www.nodebb.org\" class=\"btn btn-large\"><i class=\"icon-comment\"></i><span class='hidden-phone'>&nbsp;Get NodeBB</span></a> <a target=\"_blank\" href=\"https://github.com/designcreateplay/NodeBB\" class=\"btn btn-large\"><i class=\"icon-github-alt\"></i><span class='hidden-phone'>&nbsp;Fork us on Github</span></a> <a target=\"_blank\" href=\"https://twitter.com/dcplabs\" class=\"btn btn-large\"><i class=\"icon-twitter\"></i><span class='hidden-phone'>&nbsp;@dcplabs</span></a>"); data.motd = require('marked')(meta.config.motd || "# NodeBB <span class='hidden-phone'>v " + pkg.version + "</span>\nWelcome to NodeBB, the discussion platform of the future.\n\n<a target=\"_blank\" href=\"http://www.nodebb.org\" class=\"btn btn-large\"><i class=\"icon-comment\"></i><span class='hidden-phone'>&nbsp;Get NodeBB</span></a> <a target=\"_blank\" href=\"https://github.com/designcreateplay/NodeBB\" class=\"btn btn-large\"><i class=\"icon-github-alt\"></i><span class='hidden-phone'>&nbsp;Fork us on Github</span></a> <a target=\"_blank\" href=\"https://twitter.com/dcplabs\" class=\"btn btn-large\"><i class=\"icon-twitter\"></i><span class='hidden-phone'>&nbsp;@dcplabs</span></a>");
res.json(data); res.json(data);
}); });

@ -4,7 +4,6 @@ var user = require('./../user.js'),
fs = require('fs'), fs = require('fs'),
utils = require('./../../public/src/utils.js'), utils = require('./../../public/src/utils.js'),
path = require('path'), path = require('path'),
marked = require('marked'),
winston = require('winston'); winston = require('winston');
(function(User) { (function(User) {
@ -353,12 +352,15 @@ var user = require('./../user.js'),
userData.posts = posts.filter(function(p) {return p.deleted !== "1";}); userData.posts = posts.filter(function(p) {return p.deleted !== "1";});
userData.isFollowing = isFollowing; userData.isFollowing = isFollowing;
userData.signature = postTools.markdownToHTML(userData.signature, true);
if(!userData.profileviews) if(!userData.profileviews)
userData.profileviews = 1; userData.profileviews = 1;
if(callerUID !== userData.uid) if(callerUID !== userData.uid)
user.incrementUserFieldBy(userData.uid, 'profileviews', 1); user.incrementUserFieldBy(userData.uid, 'profileviews', 1);
res.json(userData);
postTools.toHTML(userData.signature, function(err, signature) {
userData.signature = signature;
res.json(userData);
});
}); });
}); });
} else { } else {

@ -271,7 +271,7 @@ var RDB = require('./redis.js'),
topics.getTopicField(tid, 'title', function(err, title) { topics.getTopicField(tid, 'title', function(err, title) {
topics.getTeaser(tid, function(err, teaser) { topics.getTeaser(tid, function(err, teaser) {
if (!err) { if (!err) {
notifications.create(teaser.username + ' has posted a reply to: "' + title + '"', null, '/topic/' + tid, 'topic:' + tid, function(nid) { notifications.create('<strong>' + teaser.username + '</strong> has posted a reply to: "<strong>' + title + '</strong>"', null, '/topic/' + tid, 'topic:' + tid, function(nid) {
next(null, nid); next(null, nid);
}); });
} else next(err); } else next(err);

@ -5,7 +5,6 @@ var RDB = require('./redis.js')
user = require('./user.js'), user = require('./user.js'),
categories = require('./categories.js'), categories = require('./categories.js'),
posts = require('./posts.js'), posts = require('./posts.js'),
marked = require('marked'),
threadTools = require('./threadTools.js'), threadTools = require('./threadTools.js'),
postTools = require('./postTools'), postTools = require('./postTools'),
async = require('async'), async = require('async'),
@ -14,9 +13,6 @@ var RDB = require('./redis.js')
reds = require('reds'), reds = require('reds'),
topicSearch = reds.createSearch('nodebbtopicsearch'); topicSearch = reds.createSearch('nodebbtopicsearch');
marked.setOptions({
breaks: true
});
(function(Topics) { (function(Topics) {
@ -569,15 +565,17 @@ marked.setOptions({
if(postData.content) { if(postData.content) {
stripped = postData.content.replace(/>.+\n\n/, ''); stripped = postData.content.replace(/>.+\n\n/, '');
stripped = utils.strip_tags(postTools.markdownToHTML(stripped)); postTools.toHTML(stripped, function(err, stripped) {
stripped = utils.strip_tags(stripped);
callback(null, {
"text": stripped,
"username": userData.username,
"picture": userData.picture,
"timestamp" : timestamp
});
});
} }
callback(null, {
"text": stripped,
"username": userData.username,
"picture": userData.picture,
"timestamp" : timestamp
});
}); });
}); });
} else callback(new Error('no-teaser-found')); } else callback(new Error('no-teaser-found'));

@ -5,7 +5,6 @@ var utils = require('./../public/src/utils.js'),
meta = require('./meta.js'), meta = require('./meta.js'),
emailjsServer = emailjs.server.connect(meta.config.mailer), emailjsServer = emailjs.server.connect(meta.config.mailer),
bcrypt = require('bcrypt'), bcrypt = require('bcrypt'),
marked = require('marked'),
notifications = require('./notifications.js'), notifications = require('./notifications.js'),
topics = require('./topics.js'), topics = require('./topics.js'),
async = require('async'); async = require('async');
@ -581,7 +580,7 @@ var utils = require('./../public/src/utils.js'),
User.getUserField(uid, 'username', function(err, username) { User.getUserField(uid, 'username', function(err, username) {
RDB.smembers('followers:' + uid, function(err, followers) { RDB.smembers('followers:' + uid, function(err, followers) {
topics.getTopicField(tid, 'slug', function(err, slug) { topics.getTopicField(tid, 'slug', function(err, slug) {
var message = username + ' made a new post'; var message = '<strong>' + username + '</strong> made a new post';
notifications.create(message, 5, nconf.get('url') + 'topic/' + slug + '#' + pid, 'notification_'+ Date.now(), function(nid) { notifications.create(message, 5, nconf.get('url') + 'topic/' + slug + '#' + pid, 'notification_'+ Date.now(), function(nid) {
notifications.push(nid, followers); notifications.push(nid, followers);

@ -6,7 +6,6 @@ var express = require('express'),
path = require('path'), path = require('path'),
redis = require('redis'), redis = require('redis'),
redisServer = redis.createClient(nconf.get('redis:port'), nconf.get('redis:host')), redisServer = redis.createClient(nconf.get('redis:port'), nconf.get('redis:host')),
marked = require('marked'),
utils = require('../public/src/utils.js'), utils = require('../public/src/utils.js'),
pkg = require('../package.json'), pkg = require('../package.json'),
fs = require('fs'), fs = require('fs'),

@ -527,7 +527,7 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }),
user.getUserField(uid, 'username', function(err, username) { user.getUserField(uid, 'username', function(err, username) {
var finalMessage = username + ' : ' + msg; var finalMessage = 'New message from <strong>' + username + '</strong>';
notifications.create(finalMessage, 5, '#', 'notification_' + uid + '_' + touid, function(nid) { notifications.create(finalMessage, 5, '#', 'notification_' + uid + '_' + touid, function(nid) {
notifications.push(nid, [touid], function(success) { notifications.push(nid, [touid], function(success) {

Loading…
Cancel
Save