mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-27 17:46:05 -05:00
Remove Zalgo API from Discourse.Mention
:
http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony - Thanks @riking for finding it.
This commit is contained in:
parent
b909e26fa4
commit
ed6e2b1d79
5 changed files with 52 additions and 46 deletions
|
@ -10,9 +10,9 @@ Discourse.Dialect.inlineRegexp({
|
||||||
|
|
||||||
emitter: function(matches) {
|
emitter: function(matches) {
|
||||||
var username = matches[1],
|
var username = matches[1],
|
||||||
mentionLookup = this.dialect.options.mentionLookup || Discourse.Mention.lookupCache;
|
mentionLookup = this.dialect.options.mentionLookup;
|
||||||
|
|
||||||
if (mentionLookup(username.substr(1))) {
|
if (mentionLookup && mentionLookup(username.substr(1))) {
|
||||||
return ['a', {'class': 'mention', href: Discourse.getURL("/users/") + username.substr(1).toLowerCase()}, username];
|
return ['a', {'class': 'mention', href: Discourse.getURL("/users/") + username.substr(1).toLowerCase()}, username];
|
||||||
} else {
|
} else {
|
||||||
return ['span', {'class': 'mention'}, username];
|
return ['span', {'class': 'mention'}, username];
|
||||||
|
|
|
@ -1,53 +1,59 @@
|
||||||
|
|
||||||
|
// A local cache lookup
|
||||||
|
var localCache = [];
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Helps us determine whether someone has been mentioned by looking up their username.
|
Lookup a username and return whether it is exists or not.
|
||||||
|
|
||||||
|
@function lookup
|
||||||
|
@param {String} username to look up
|
||||||
|
@return {Promise} promise that results to whether the name was found or not
|
||||||
|
**/
|
||||||
|
function lookup(username) {
|
||||||
|
return new Em.RSVP.Promise(function (resolve) {
|
||||||
|
var cached = localCache[username];
|
||||||
|
|
||||||
|
// If we have a cached answer, return it
|
||||||
|
if (typeof cached !== "undefined") {
|
||||||
|
resolve(cached);
|
||||||
|
} else {
|
||||||
|
Discourse.ajax("/users/is_local_username", { data: { username: username } }).then(function(r) {
|
||||||
|
localCache[username] = r.valid;
|
||||||
|
resolve(r.valid);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Help us link directly to a mentioned user's profile if the username exists.
|
||||||
|
|
||||||
@class Mention
|
@class Mention
|
||||||
@namespace Discourse
|
@namespace Discourse
|
||||||
@module Discourse
|
@module Discourse
|
||||||
**/
|
**/
|
||||||
Discourse.Mention = (function() {
|
Discourse.Mention = {
|
||||||
var localCache = {};
|
|
||||||
|
|
||||||
var cache = function(name, valid) {
|
/**
|
||||||
localCache[name] = valid;
|
Paints an element in the DOM with the appropriate classes and markup if the username
|
||||||
};
|
it is mentioning exists.
|
||||||
|
|
||||||
var lookupCache = function(name) {
|
@method paint
|
||||||
return localCache[name];
|
@param {Element} the element in the DOM to decorate
|
||||||
};
|
**/
|
||||||
|
paint: function(e) {
|
||||||
var lookup = function(name, callback) {
|
|
||||||
var cached = lookupCache(name);
|
|
||||||
if (cached === true || cached === false) {
|
|
||||||
callback(cached);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
Discourse.ajax("/users/is_local_username", { data: { username: name } }).then(function(r) {
|
|
||||||
cache(name, r.valid);
|
|
||||||
callback(r.valid);
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var load = function(e) {
|
|
||||||
var $elem = $(e);
|
var $elem = $(e);
|
||||||
if ($elem.data('mention-tested')) return;
|
if ($elem.data('mention-tested')) return;
|
||||||
var username = $elem.text();
|
var username = $elem.text().substr(1);
|
||||||
username = username.substr(1);
|
|
||||||
var loading = lookup(username, function(valid) {
|
$elem.addClass('mention-loading');
|
||||||
if (valid) {
|
lookup(username).then(function(found) {
|
||||||
return $elem.replaceWith("<a href='" + Discourse.getURL("/users/") + (username.toLowerCase()) + "' class='mention'>@" + username + "</a>");
|
if (found) {
|
||||||
|
$elem.replaceWith("<a href='" + Discourse.getURL("/users/") + username.toLowerCase() + "' class='mention'>@" + username + "</a>");
|
||||||
} else {
|
} else {
|
||||||
return $elem.removeClass('mention-loading').addClass('mention-tested');
|
$elem.removeClass('mention-loading').addClass('mention-tested');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (loading) {
|
|
||||||
return $elem.addClass('mention-loading');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return { load: load, lookup: lookup, lookupCache: lookupCache };
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ Discourse.ComposerView = Discourse.View.extend(Ember.Evented, {
|
||||||
Discourse.Onebox.load(e, refresh);
|
Discourse.Onebox.load(e, refresh);
|
||||||
});
|
});
|
||||||
$('span.mention', $wmdPreview).each(function(i, e) {
|
$('span.mention', $wmdPreview).each(function(i, e) {
|
||||||
Discourse.Mention.load(e, refresh);
|
Discourse.Mention.paint(e);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.trigger('previewRefreshed', $wmdPreview);
|
this.trigger('previewRefreshed', $wmdPreview);
|
||||||
|
|
|
@ -5,7 +5,7 @@ module("Discourse.Markdown", {
|
||||||
});
|
});
|
||||||
|
|
||||||
var cooked = function(input, expected, text) {
|
var cooked = function(input, expected, text) {
|
||||||
var result = Discourse.Markdown.cook(input, {mentionLookup: false, sanitize: true});
|
var result = Discourse.Markdown.cook(input, {sanitize: true});
|
||||||
equal(result, expected, text);
|
equal(result, expected, text);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ test("Heading", function() {
|
||||||
test("Oneboxing", function() {
|
test("Oneboxing", function() {
|
||||||
|
|
||||||
var matches = function(input, regexp) {
|
var matches = function(input, regexp) {
|
||||||
return Discourse.Markdown.cook(input, {mentionLookup: false }).match(regexp);
|
return Discourse.Markdown.cook(input).match(regexp);
|
||||||
};
|
};
|
||||||
|
|
||||||
ok(!matches("- http://www.textfiles.com/bbs/MINDVOX/FORUMS/ethics\n\n- http://drupal.org", /onebox/),
|
ok(!matches("- http://www.textfiles.com/bbs/MINDVOX/FORUMS/ethics\n\n- http://drupal.org", /onebox/),
|
||||||
|
|
|
@ -14,7 +14,7 @@ function normalize(str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var md = function(input, expected, text) {
|
var md = function(input, expected, text) {
|
||||||
var result = Discourse.Markdown.cook(input, {mentionLookup: false, sanitize: true, traditional_markdown_linebreaks: true}),
|
var result = Discourse.Markdown.cook(input, {sanitize: true, traditional_markdown_linebreaks: true}),
|
||||||
resultNorm = normalize(result),
|
resultNorm = normalize(result),
|
||||||
expectedNorm = normalize(expected),
|
expectedNorm = normalize(expected),
|
||||||
same = (result === expected) || (resultNorm === expectedNorm);
|
same = (result === expected) || (resultNorm === expectedNorm);
|
||||||
|
|
Loading…
Reference in a new issue