diff --git a/app/assets/javascripts/discourse/helpers/topic-link.js.es6 b/app/assets/javascripts/discourse/helpers/topic-link.js.es6 index 9c2a73870e3..7af9bd99498 100644 --- a/app/assets/javascripts/discourse/helpers/topic-link.js.es6 +++ b/app/assets/javascripts/discourse/helpers/topic-link.js.es6 @@ -1,9 +1,14 @@ import registerUnbound from 'discourse/helpers/register-unbound'; +import { runFilters } from 'discourse/lib/filter'; registerUnbound('topic-link', function(topic) { var title = topic.get('fancyTitle'); var url = topic.linked_post_number ? topic.urlForPostNumber(topic.linked_post_number) : topic.get('lastUnreadUrl'); var extraClass = topic.get('last_read_post_number') === topic.get('highest_post_number') ? " visited" : ""; - return new Handlebars.SafeString("" + title + ""); + var string = "" + title + ""; + + string = runFilters('topic-link', string, topic); + + return new Handlebars.SafeString(string); }); diff --git a/app/assets/javascripts/discourse/lib/filter.js.es6 b/app/assets/javascripts/discourse/lib/filter.js.es6 new file mode 100644 index 00000000000..7f0537f2030 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/filter.js.es6 @@ -0,0 +1,24 @@ +var filters = {}; + +// use filter API to register a callback from a plugin +const filter = function(name, fn) { + var current = filters[name] = filters[name] || []; + current.push(fn); +}; + +const runFilters = function(name, val) { + const current = filters[name]; + if (current) { + + var args = Array.prototype.slice.call(arguments, 1); + + for(var i = 0; i < current.length; i++) { + val = current[i].apply(this, args); + } + } + + return val; +}; + +export { runFilters }; +export default filter;