Ei! Gostaria de redirecionar todos os links externos (ou, se não for possível filtrar, todos os links) para, por exemplo, exit.website.tld/?page={{URL}}.Isso é possível no Discourse? Se não, existe algum Plugin para isso? Já pesquisei, mas não encontrei nenhum com os termos de busca que usei.Então, algo parecido com o que o Steam faz. (Exemplo)
Eu também estava pensando nisso; eu queria adicionar a URL de salvamento do Internet Archive a todos os links externos e, vamos ser honestos: seria legal poder configurar isso por categoria.
Acho que existe algum tipo de filtro que pode ser feito por um plugin, mas as pessoas fazem coisas com componentes do tema que parecem dobrar as regras de manipulação de dados. Então, se isso não for possível atualmente, como as pessoas abordariam a adição dessa funcionalidade: plugin ou componente do tema?
Vemos isso como uma espécie de recurso hostil ao usuário (no mesmo estilo de “assinaturas de fórum”), então precisaria ser um plugin. Não tenho certeza se isso poderia ser feito em um componente de tema.
Já vi essa solicitação antes no contexto de segurança, como em
oh não! você está prestes a acessar um HYPERLINK para um SITE! Você se preparou para o PERIGO INCRÍVEL?!?!
e eu acho que isso poderia fazer sentido em alguns contextos extremamente raros em algumas comunidades extremamente raras.. uh.. acho que sim?
Eu administro uma categoria para arquivar sites. Nosso caso de uso é super específico/preguiçoso. ![]()
Além disso, eu vejo o proxy de arquivamento da web como sendo semelhante a pegar uma cópia de uma imagem em uma mensagem, mas, novamente, eu administro uma categoria para arquivar sites. ![]()
Na minha opinião, isso pode ser realmente uma questão de segurança, porque, claro, aqui no Fórum Meta do Discourse ou em alguns Fóruns de Programação, as pessoas sabem diferenciar URLs etc., mas em Fóruns que não são tão focados em tecnologia (especialmente Fóruns para trabalhos não técnicos, escolas etc.), muitas pessoas podem não perceber se estão em um site que parece o mesmo, mas tem um TLD diferente ou até mesmo um Nome de Domínio completamente diferente.
E, embora isso, claro, possa ser hostil ao usuário em alguns Fóruns, ninguém diz que precisa ser ativado por padrão. Você poderia simplesmente fazer como uma caixa de seleção que, então, usaria uma página do próprio Discourse ou vincularia uma página personalizada diretamente.
Na minha opinião, isso é mais uma funcionalidade essencial que deveria estar diretamente no Discourse, mas, claro, isso é apenas minha opinião.
Jeff deixou claro que isso precisará ser um plugin (a menos que possa ser feito em um tema, o que parece provável). A história sugere que, se você desenvolver o sistema de login e centenas de sites o quiserem, incluindo dezenas de clientes empresariais, ele se tornará um plugin oficial em apenas alguns anos.
Mas, se for possível fazer isso em um tema, o que acho que pode ser, então, tecnicamente, o Discourse já suporta o recurso; você só precisa de um tema para implementá-lo! Você pode consultar o Guia do desenvolvedor para temas do Discourse ou postar em Marketplace com um orçamento. Minha estimativa é que seja pelo menos US$ 1000, mas posso estar errado.
Embora eu não tenha experiência com Temas do Discourse etc., tenho experiência básica com JS e HTML. Algo assim não deveria levar mais do que 10 a 20 minutos de trabalho. Por que isso precisaria de um orçamento de $1000?
Se você consegue fazer isso em vinte minutos, então já deveria ter feito. Ainda sou bastante ruim em JavaScript e Ember, talvez seja muito mais fácil do que eu penso. Acredito que leve várias horas de trabalho.
Por favor, poste um link para o seu tema! Mal posso esperar para vê-lo.
Depois de cerca de 5 minutos, consegui um código JS funcional (que ainda precisa de alguns ajustes, mas funciona; são apenas 10 linhas, a propósito).Agora, o único ponto que preciso descobrir é como executar esse código após o carregamento da página…
Incrível! Que bom que foi tão fácil! Aquilo leva uma quantidade insana de tempo para mim. Geralmente, sou melhor em adivinhar quanto tempo deveria levar.
Em geral, o script apenas verifica se você está em uma Página de Artigo, percorre todas as tags <article>, localiza a tag real do conteúdo dentro delas, percorre todas as tags <a> presentes e, se o href delas não for um site oficial (usando uma expressão regular básica para isso), adiciona a URL da página de saída na frente.
Mas ainda estou com dificuldade em descobrir como executar o código JavaScript após o carregamento da página e de todo o conteúdo dinâmico (como Posts). Uma solução temporária seria simplesmente executar o código após 1 a 2 segundos, mas isso não é muito eficaz e, para algumas pessoas, o carregamento pode levar mais tempo do que isso…
Certamente pode ser feito como um componente de tema, mas lembre-se de que terá que ser um plugin se você quiser que ele também afete a visualização do crawler.
O que você está procurando é chamado de decorador de postagem. É um hook que permite executar scripts antes de cada postagem ser renderizada. Ele faz parte da API de plugins.
Agora, sobre o que você quer fazer (redirecionar todos os links externos). Não acho que adicionar tanta fricção seja uma boa ideia, então não posso ajudá-lo com isso — além disso, você já descobriu essa parte. Dito isso, aqui está um exemplo comentado de como criar uma configuração que visa todos os links externos nas postagens.
Isso deve ser inserido na seção header do seu tema ou componente de tema:
<script type="text/discourse-plugin" version="0.8">
// Armazena o nome do host para reutilização.
const siteHostname = location.hostname;
// Vamos criar um decorador para fazer isso em cada postagem
api.decorateCooked(
post => {
// A postagem tem links?
const links = [...post[0].querySelectorAll("a")];
// Sem links, encerra.
if (!links.length) return;
// Temos links, vamos filtrá-los e pegar apenas os externos
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// Se houver links externos, vamos fazer algo. Por exemplo, podemos
// adicionar uma classe a cada link externo, assim:
externalLinks.forEach(link => {
link.classList.add('external-link');
// Faça mais coisas aqui.
});
},
// Damos um ID ao decorador para evitar vazamentos de memória.
{ id: "external-link-decorator" }
);
</script>
Novamente, redirecionar usuários gera muita fricção e pode se tornar irritante rapidamente. Portanto, eu consideraria outra abordagem, como talvez adicionar um ícone sutil ao lado dos links externos e ensinar seus usuários o que ele significa, em vez disso?
Acho que esse caso de uso é muito melhor atendido por um plugin ou integração externa (usando um webhook de criação/edição de post) que garanta que todos os sites vinculados sejam devidamente preservados, independentemente de alguém clicar neles ou não.

