issue #214, preparing for addition of post.parse hook by renaming markdownToHTML to just "toHTML", and making it asynchronous.

v1.18.x
Julian Lam 12 years ago
parent 8a4a0154f6
commit 0243e9c5be

@ -66,20 +66,28 @@ var RDB = require('./redis.js'),
postSearch.index(content, pid);
});
posts.getPostField(pid, 'tid', function(tid) {
PostTools.isMain(pid, tid, function(isMainPost) {
if (isMainPost) {
topics.setTopicField(tid, 'title', title);
topicSearch.remove(tid, function() {
topicSearch.index(title, tid);
async.parallel([
function(next) {
posts.getPostField(pid, 'tid', function(tid) {
PostTools.isMain(pid, tid, function(isMainPost) {
if (isMainPost) {
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]
});
});
};
@ -161,7 +169,7 @@ var RDB = require('./redis.js'),
});
}
PostTools.markdownToHTML = function(md, isSignature) {
PostTools.toHTML = function(raw, callback) {
var marked = require('marked'),
cheerio = require('cheerio');
@ -169,8 +177,8 @@ var RDB = require('./redis.js'),
breaks: true
});
if (md && md.length > 0) {
var parsedContentDOM = cheerio.load(marked(md));
if (raw && raw.length > 0) {
var parsedContentDOM = cheerio.load(marked(raw));
var domain = nconf.get('url');
parsedContentDOM('a').each(function() {
@ -179,17 +187,14 @@ var RDB = require('./redis.js'),
if (href && !href.match(domain) && !utils.isRelativeUrl(href)) {
this.attr('href', domain + 'outgoing?url=' + encodeURIComponent(href));
if (!isSignature) this.append(' <i class="icon-external-link"></i>');
}
});
html = parsedContentDOM.html();
callback(null, parsedContentDOM.html());
} else {
html = '<p></p>';
callback(null, '<p></p>');
}
return html;
}

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

@ -44,7 +44,7 @@ var user = require('./../user.js'),
require('async').each(data.categories, iterator, function(err) {
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);
});

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

@ -5,7 +5,6 @@ var RDB = require('./redis.js')
user = require('./user.js'),
categories = require('./categories.js'),
posts = require('./posts.js'),
marked = require('marked'),
threadTools = require('./threadTools.js'),
postTools = require('./postTools'),
async = require('async'),
@ -14,9 +13,6 @@ var RDB = require('./redis.js')
reds = require('reds'),
topicSearch = reds.createSearch('nodebbtopicsearch');
marked.setOptions({
breaks: true
});
(function(Topics) {
@ -569,15 +565,17 @@ marked.setOptions({
if(postData.content) {
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'));

@ -5,7 +5,6 @@ var utils = require('./../public/src/utils.js'),
meta = require('./meta.js'),
emailjsServer = emailjs.server.connect(meta.config.mailer),
bcrypt = require('bcrypt'),
marked = require('marked'),
notifications = require('./notifications.js'),
topics = require('./topics.js'),
async = require('async');

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

Loading…
Cancel
Save