Olá, estou trabalhando no meu primeiro plugin Discourse.
A ideia
Queremos alterar ligeiramente o comportamento dos links de tags, de modo que, ao clicar em uma tag em qualquer lugar do Discourse, em vez de ir diretamente para ela, sejam exibidas duas opções: a URL normal da tag (forum.com/tag/tag-name) ou uma página externa relacionada de nossa escolha (something.site.com/some-name). Essa opção só aparecerá para as tags que estiverem na lista.
A lista estará no formato de um array Ruby de hashes (ou JSON) e pode ser adicionada diretamente ao plugin ou disponibilizada em uma URL. (A primeira opção parece ser mais eficiente em termos de recursos — podemos simplesmente atualizar a lista e reconstruir o plugin quando houver atualizações, já que essas não serão muito frequentes.)
# Array Ruby de hashes
array = [
{forum_tag: "discourse", external_slug: "discourse"},
{forum_tag: "dc", external_slug: "discourse"},
{forum_tag: "xenforo", external_slug: "xenforo"},
{forum_tag: "xf", external_slug: "xenforo"}
]
# OU
array.to_json
=> "[{\"forum_tag\":\"discourse\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"dc\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"xenforo\",\"external_slug\":\"xenforo\"},{\"forum_tag\":\"xf\",\"external_slug\":\"xenforo\"}]"
Basicamente, queremos a opção de exibir algo como quando você clica no número de replies na página principal do fórum:
Minhas reflexões
Encontrei 2 métodos na API do Discourse relacionados a tags:
-
addTagsHtmlCallback— Neste caso, eu precisaria definirtopic.tagscomo um array vazio logo após atribuir seu valor a outra variável. Dessa forma, eu impediria a renderização dastagse poderia escrever meu código personalizado. -
replaceTagRenderer— O segundo permite que eu altere a renderização datag, o que não parece tão hacky quanto o primeiro método.
No entanto, note que em ambos os casos preciso retornar uma string raw. Pelo que descobri, não consigo escrever e compilar um template Ember manualmente. Obviamente, posso simplesmente renderizar links personalizados e escrever uma função simples com jQuery, colocando-a na raiz de app/assets/javascripts, mas isso é uma solução bem diferente em comparação ao código do Discourse.
Estou no caminho certo? Qualquer ajuda será muito apreciada.
