Auto-Linkify Palavras

@md-misko obrigado pela PR!

Tem certeza? Fico um pouco surpreso com isso. Eu pensaria que, se sua regex fosse gulosa o suficiente, você conseguiria corresponder. Observe que remover o ponto dos caracteres de limite quebra a criação de links para palavras no final da frase.

Fiz um pequeno teste com sua regex abaixo no regex101.com e parece funcionar com os caracteres de limite atuais, veja regex101: build, test, and debug regex
Observe que, se eu entendi seu propósito corretamente, você pode precisar transformar alguns de seus grupos de captura em grupos sem captura com (?:)

A incapacidade de usar | é muito irritante, concordo. Observe que para a parte ID|id você pode simplesmente usar o modificador i para tornar a regex insensível a maiúsculas e minúsculas. Para os números, se você realmente precisar do intervalo exato entre 1-10 e 1-100, então é complicado, relaxar para 1-19 e 1-199 tornaria mais fácil. :slight_smile:

Aqui está sua regex com grupos sem captura que acho que devem funcionar

/id\\s?((?:[1-9]|10)\\.(?:[1-9]|[1-9][0-9]|100))/i, https://example.com/id$2

@danekhollas obrigado pelo feedback e pela regex! Mudei o código com base nos seus comentários, o PR está pronto para revisão.

1 curtida

Legal! Alguém da equipe do Discourse terá que revisar isso, CC @sam

Note que você pode simplesmente instalar a extensão a partir do seu repositório fork (você pode até especificar um branch).

1 curtida

Gostaria de esclarecer primeiro, por que os usuários estão usando o componente em vez das palavras-chave observadas integradas?

4 curtidas

Encontrei dois problemas principais com as palavras observadas integradas

  • não é possível adicionar regex complexas: Ocorreu um erro: Palavra muito longa (máximo é 100 caracteres)
  • não é possível usar caracteres arbitrários como limite de palavra: nomeadamente sublinhado
  • também a incapacidade de editar regras ou alterar a ordem de execução é menos que ideal

PR para o componente expõe limites de palavras ao usuário, e não há problemas com regex longas (além da incapacidade de usar |, que também é abordada no PR).

Caso contrário, as palavras observadas funcionam perfeitamente, e se estes puderem ser abordados no núcleo, sou totalmente a favor.

Criei esta postagem separada seguindo Auto-Linkify Words - #216 by md-misko, não tenho certeza se isso se qualifica como bugs:

Palavras observadas não respeitam unicode, elas tratam todos os caracteres unicode como limites de palavras (ao usar \b, mas isso é esperado, eu acho).

E mais (executando alguns casos de teste através de palavras observadas e encontrei estes dois):

  • A palavra observada \"\\bid\\(d+)\\b\" é uma expressão regular inválida. (verdadeiro, mas ainda adiciona a regra)
  • \\bid\\s?(\\d+)\\b → https://example.com/id$1 linkifica para https://example.com/id%241 (adiciona $1 codificado em URL em vez de fazer a substituição)

A substituição não é suportada ou isso é um bug?

Alguém encontrou uma solução alternativa para usar linhas verticais | neste momento? Tenho algumas regex onde elas são cruciais.

Olá, obrigado por desenvolver este tema incrível, adorei muito! Você poderia lançá-lo para que todos os usuários possam usá-lo? E não apenas administradores

GitHub - renato/discourse-imgify-words: tema para auto imgify urls no discourse, quase o mesmo que discourse-linkify-works

Olá,

Este componente de tema que você vinculou é uma adaptação do Sam que fiz como uma solução alternativa para uma necessidade que você descreveu em outro tópico.

São componentes de tema simples que apenas alteram a forma como essas palavras são renderizadas em uma postagem (o do Sam converte palavras específicas em links, o meu converte palavras específicas em imagens) com base nas configurações do componente de tema, que são gerenciadas apenas por administradores.

O recurso que você descreve não pode ser feito em um componente de tema, seria necessário um plugin para armazenar um conjunto de (palavra, URL da imagem) por usuário no banco de dados e a conversão de palavra para imagem deveria ser feita no lado do servidor, ao construir o conteúdo da postagem cozida (como HTML). Isso não pode ser feito em um componente de tema, que é apenas código frontend/client-side (se você contratar alguém para fazer este trabalho, é crucial que eles entendam esses detalhes).

Isso está fora do escopo deste componente de tema e exigiria um trabalho muito mais complexo. A sugestão é postar os detalhes de como você deseja que este recurso se comporte em Marketplace e você pode contratar alguém aqui com experiência prévia com os internos do Discourse para ajudá-lo.

Obrigado por me informar, entrarei nessa categoria e falarei sobre isso

Já foi levantado muitas vezes neste tópico, mas gostaria de verificar novamente; existe alguma forma de restringir isto a uma determinada categoria ou excluir categorias? Gostaria de usar isto na nossa categoria para iniciantes para ter links para todos os termos básicos que os novatos precisam aprender, mas em outras áreas, estes seriam apenas irritantes para os utilizadores experientes. Obrigado!

3 curtidas

Encontrei uma limitação irritante: dada uma expressão regular, $1 é substituído apenas uma vez.

Exemplo

/foo-([0-9a-f]+)/,https://target.example/foo/$1/foo-$1

Esperado

palavra-chave link
foo-abcd https://target.example/foo/abcd/foo-abcd

Atual

palavra-chave link
foo-abcd https://target.example/foo/abcd/foo-$1

O problema com palavras observadas é que uma palavra observada é vinculada tantas vezes quanto a palavra observada aparece em uma postagem. Isso faz uma bagunça.

P.S. Diga isso três vezes rápido. :grin:

Para ser preciso, a palavra é substituída uma vez por linha, não uma vez por postagem inteira. :slight_smile:

Eu gostaria que isso fosse verdade, Coin, mas não está na minha instalação. :frowning:

Veja como funciona na minha instância de teste:

:thinking:

Veja isto…

Minha regra:

O resultado:

@Canapin você ignorou meu problema: não se trata de palavras repetidas, mas de substituição de padrão repetida de uma única palavra: a URL contém o padrão a ser substituído duas vezes.

Como a opção de substituição de padrão /g é o padrão no plugin, ela deve ser aplicada a todas as ocorrências de $1 na substituição, não apenas à primeira.

É um caso diferente de ter a palavra-chave aparecendo várias vezes em uma frase, linha ou parágrafo. A substituição deve levar em conta múltiplas ocorrências da seleção.

1 curtida

Eu estava falando sobre o componente de palavra linkify, não sobre o recurso de palavras observadas :slight_smile:

@hellekin, obrigado pelo esclarecimento :+1:

Eu estava respondendo ao Sam sobre palavras observadas. :grin:

Bom saber que o linkify só faz uma, mas adoraria uma por postagem. Talvez eu tenha que experimentar isso hoje, palavras observadas são insuportáveis às vezes quando encontra uma correspondência.

1 curtida