Ícone de Links Externos

:information_source: Resumo Adiciona um Ícone a Links Externos em Tópicos e Posts
:hammer_and_wrench: Repositório GitHub - denvergeeks/discourse-external-links-icon
:question: Guia de Instalação Como instalar um tema ou componente de tema
:open_book: Novo nos Temas do Discourse? Guia para iniciantes sobre como usar Temas do Discourse

Instalar este componente de tema

Usa o SVG padrão (o mesmo ícone que Links em Destaque no núcleo) como este linkdiscourse-external-links-icon

4 curtidas

Estou vendo isto no modo escuro:

Provavelmente não é a aparência pretendida, certo?

O componente funciona bem com diferentes paletas

Mas uma captura de tela não ajusta sua cor para a paleta de cores. O que você sugeriria para apresentar o recurso em um fórum onde o componente não está instalado? Uma captura de tela maior que inclua o link?
Eu estava prestes a sugerir o uso do componente de ícone do Discourse, mas não consigo alterar a cor do ícone:

example.com

[example.com [wrap=icon id=up-right-from-square][/wrap]]()

[quote=“Moin, post:3, topic:392222”]Uma captura de tela maior que inclua o link?

[/quote]

Sim, eu acho? Isso seria uma representação melhor do que esperar.

Eu mudei a imagem na descrição/exemplo para um .webp transparente com um preenchimento cinza.

1 curtida

Ótimo, ficou muito melhor!

1 curtida

Olá, não funciona para mim, o ícone aparece em todos os links, inclusive nos internos.

Outra coisa, para títulos que têm um link externo direto, como um vídeo do YouTube, o ícone aparece duas vezes:

4 curtidas

O mesmo aqui. O ícone também aparece em links internos.

Se eu entendi o código corretamente, ele procura por “http*” na URL para determinar links externos. Infelizmente, a ferramenta de link no editor usa automaticamente URLs totalmente qualificadas (absolutas) começando com “https://<MeuDomínio>/..”.

Eu presumo que isso causa os ícones externos em links “internos”.

O código poderia ser expandido para verificar “https://<MeuDomínio>/..” classificando-os como internos?

1 curtida

Criei um PR para corrigir esses problemas.

Isso ocultará o ícone de link para links internos, relativos ou absolutos, bem como os ocultará nos links de título.

4 curtidas

Obrigado @Lilly, eu mesclei isto.

2 curtidas

Eu fiz algo semelhante com CSS puro há muito tempo, quando o Discourse usava o Font Awesome no font-family.

Não é mais possível, mas um efeito semelhante pode ser alcançado com isto:

.cooked {
  a[href^="http"]:not([href*="www.yourdomain.com"]) {
    display: inline-flex;
    align-items: center;

    &::after {
      content: "";
      width: 0.8em;
      height: 0.8em;
      margin-left: 0.2em;
      margin-bottom: 0.4em;
      background-color: currentColor; 
      mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 640'%3E%3Cpath d='M384 64C366.3 64 352 78.3 352 96C352 113.7 366.3 128 384 128L466.7 128L265.3 329.4C252.8 341.9 252.8 362.2 265.3 374.7C277.8 387.2 298.1 387.2 310.6 374.7L512 173.3L512 256C512 273.7 526.3 288 544 288C561.7 288 576 273.7 576 256L576 96C576 78.3 561.7 64 544 64L384 64zM144 160C99.8 160 64 195.8 64 240L64 496C64 540.2 99.8 576 144 576L400 576C444.2 576 480 540.2 480 496L480 416C480 398.3 465.7 384 448 384C430.3 384 416 398.3 416 416L416 496C416 504.8 408.8 512 400 512L144 512C135.2 512 128 504.8 128 496L128 240C128 231.2 135.2 224 144 224L224 224C241.7 224 256 209.7 256 192C256 174.3 241.7 160 224 160L144 160z'/%3E%3C/svg%3E");
      mask-size: contain;
    }
  }
}

O SVG está codificado, no entanto.

Oi, sou eu de novo, desculpe :grinning_face_with_smiling_eyes:

Os ícones externos aparecem no TC Custom Header Links (icons), eles não deveriam. Obrigado.

image

Olá :waving_hand:

Aqui está um exemplo de como eu uso isso no meu componente de tema.

No meu caso, eu uso configurações para isso porque o componente altera ícones dinamicamente via CSS, permitindo-me direcionar essas configurações diretamente. (Adicionar classe aos links nem sempre funciona muito bem em alguns casos.)


No entanto, para o seu componente, você pode simplesmente excluir o nome de host atual dinamicamente, algo como isto, eu acho:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  api.decorateCookedElement(
    (element) => {
      const currentHost = window.location.hostname;

      const selector = `a[href*='//']:not([href^='/']):not([href*='${currentHost}'])`;
      
      const links = element.querySelectorAll(selector);

      links.forEach((link) => {
        console.log("External link:", link.href);
      });
    },
    { id: "external-link", onlyStream: true }
  );
});