Entrada de tópico como plugin para tags

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:

  1. addTagsHtmlCallback — Neste caso, eu precisaria definir topic.tags como um array vazio logo após atribuir seu valor a outra variável. Dessa forma, eu impediria a renderização das tags e poderia escrever meu código personalizado.

  2. replaceTagRenderer — O segundo permite que eu altere a renderização da tag, 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.

Para quem estiver interessado, tenho o prazer de anunciar o primeiro lançamento do meu plugin!

Aguardo o seu feedback!

Para todos os interessados, recomendo conferir as últimas alterações, especialmente:

Bom… dia (?) para todos!

:smiling_imp:

Bom trabalho, @Eiji!


Esperamos usar este plugin no Devtalk… Se alguém tiver experiência com plugins do Discourse, poderia dar uma olhada para ver se é possível fazer alguma melhoria, por favor? Agradecemos muito :blush: