88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
/**
|
|
Support for quoting other users.
|
|
**/
|
|
|
|
var esc = Handlebars.Utils.escapeExpression;
|
|
|
|
Discourse.Dialect.replaceBlock({
|
|
start: new RegExp("\\[quote(=[^\\[\\]]+)?\\]([\\s\\S]*)", "igm"),
|
|
stop: '[/quote]',
|
|
emitter: function(blockContents, matches, options) {
|
|
|
|
var params = {'class': 'quote'},
|
|
username = null;
|
|
|
|
if (matches[1]) {
|
|
var paramsString = matches[1].replace(/^=|\"/g, ''),
|
|
paramsSplit = paramsString.split(/\,\s*/);
|
|
|
|
username = paramsSplit[0];
|
|
|
|
paramsSplit.forEach(function(p,i) {
|
|
if (i > 0) {
|
|
var assignment = p.split(':');
|
|
if (assignment[0] && assignment[1]) {
|
|
var escaped = esc(assignment[0]);
|
|
// don't escape attributes, makes no sense
|
|
if(escaped === assignment[0]) {
|
|
params['data-' + assignment[0]] = esc(assignment[1].trim());
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
var avatarImg;
|
|
if (options.lookupAvatarByPostNumber) {
|
|
// client-side, we can retrieve the avatar from the post
|
|
var postNumber = parseInt(params['data-post'], 10);
|
|
avatarImg = options.lookupAvatarByPostNumber(postNumber);
|
|
} else if (options.lookupAvatar) {
|
|
// server-side, we need to lookup the avatar from the username
|
|
avatarImg = options.lookupAvatar(username);
|
|
}
|
|
|
|
while (blockContents.length && (typeof blockContents[0] === "string" || blockContents[0] instanceof String)) {
|
|
blockContents[0] = String(blockContents[0]).replace(/^\s+/, '');
|
|
if (!blockContents[0].length) {
|
|
blockContents.shift();
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
var contents = ['blockquote'];
|
|
if (blockContents.length) {
|
|
var self = this;
|
|
|
|
var nextContents = blockContents.slice(1);
|
|
blockContents = this.processBlock(blockContents[0], nextContents).concat(nextContents);
|
|
|
|
blockContents.forEach(function (bc) {
|
|
if (typeof bc === "string" || bc instanceof String) {
|
|
var processed = self.processInline(String(bc));
|
|
if (processed.length) {
|
|
contents.push(['p'].concat(processed));
|
|
}
|
|
} else {
|
|
contents.push(bc);
|
|
}
|
|
});
|
|
}
|
|
|
|
// If there's no username just return a simple quote
|
|
if (!username) {
|
|
return ['p', ['aside', params, contents]];
|
|
}
|
|
|
|
return ['aside', params,
|
|
['div', {'class': 'title'},
|
|
['div', {'class': 'quote-controls'}],
|
|
avatarImg ? ['__RAW', avatarImg] : "",
|
|
username ? I18n.t('user.said', {username: username}) : ""
|
|
],
|
|
contents
|
|
];
|
|
}
|
|
});
|