Bot "link permanente" do GitHub arruinou silenciosamente o significado da minha postagem

Há cerca de um ano, fiz uma postagem na instância Discourse do GitHub que incluía vários URLs no formato https://github.com/OWNER/REPO/tree/BRANCH/path para discutir como o GitHub.com processa tais URLs. Minha postagem recebeu prontamente uma edição gerada pelo sistema com a mensagem “Github link was replaced by a permanent link”, que parece vir do plugin discourse-github. Embora substituir o nome da branch por um link permanente para o ID do commit atual possa ser um recurso útil no caso comum de uma postagem citando código específico, no caso especial de discutir o processamento de URLs do GitHub, a edição destruiu o significado da minha postagem. Tive a sorte de notar a edição do robô imediatamente e, após várias rodadas de confronto com ele, acabei encontrando uma solução alternativa: adicionar uma tag <span> para impedir que o padrão do robô correspondesse ao texto, assim:

https://github.com/OWNER/REPO/tree/<span>BRANCH</span>/PATH

Mas outros autores podem não notar a edição do robô e ficar com uma postagem que confundiria os leitores.

Qual é a melhor solução para evitar edições indesejadas de links permanentes do GitHub em uma postagem específica? Em geral, sinto que está errado que robôs façam edições automáticas que correm o risco de estragar uma postagem. Seria mais seguro (1) perguntar ao autor, ao salvar a postagem, se os links devem ser editados, ou (2) fazer com que o robô adicione um link permanente sem remover o link original. (Lembro-me de ter visto alguns robôs em outros sites, talvez no Reddit, que adicionam informações sem excluir as informações existentes.) Se os mantenedores do Discourse considerarem essas opções muito feias ou com muito trabalho para acomodar um caso de uso raro, outras opções poderiam ser (3) mostrar um aviso após o salvamento da postagem com um link para informações sobre como o autor pode evitar as edições, se necessário, seja (a) como um banner dedicado na interface ou (b) apenas uma linha de texto adicionada pelo robô ao final da postagem.

Não tenho certeza de qual seria o design mais razoável para que o autor opte por não ter as edições. As configurações de exclusão em todo o site do plugin discourse-github, baseadas no destino do link, não parecem adequadas para esse propósito. Talvez minha solução alternativa atual com a tag <span> seja suficiente. Mesmo que nenhuma alteração seja feita no Discourse, espero que esta postagem torne a solução alternativa mais fácil de ser descoberta por autores que notarem o problema.

Nota: anteriormente levantei essa questão no fórum do GitHub, pois assumi que o robô de “link permanente” era específico da instância do GitHub, mas um comentarista ali me informou que se trata de um recurso geral do Discourse, por isso estou levantando a questão aqui.

Obrigado pela atenção!

2 curtidas

Acho que essa é uma boa funcionalidade, pois as pessoas frequentemente colam links para master, que quase sempre ficam desatualizados com o tempo. Ainda assim, deve ser possível colar intencionalmente um link para uma branch, já que há muitos motivos válidos para isso. Além disso, de modo geral, essa funcionalidade parece um pouco quebrada: ela reescreve coisas que não deveria e não analisa coisas que provavelmente deveria.

Aqui estão alguns exemplos que podem ser usados como casos de teste para corrigi-la:

  1. Link simples criado apenas colando uma URL. Eu esperaria que isso fosse reescrito, e é: subdomain-static/forums-enhancements.js at master · ClassicPress/subdomain-static · GitHub
  2. Link no formato Markdown [url](url). Eu esperaria que este link não fosse reescrito, pois especifiquei explicitamente tanto o texto quanto a URL. Em vez disso, o texto do link é reescrito, e a URL do link não. Isso está quebrado: https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
  3. URL entre crases. Isso não é um link e não deve ser reescrito, mas é: https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
  4. URL em um bloco de código com três crases. Isso não é um link e não deve ser reescrito, mas é:
    https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
    

Acho que apenas o item (1) acima deveria ser reescrito. Isso tornaria o comportamento mais previsível e reescreveria apenas links “simples”. Links onde uma estrutura específica de Markdown foi usada (que pode ser pensada como uma forma de expressar uma intenção específica) devem ser deixados como estão.

1 curtida

Esta funcionalidade parece não estar habilitada no meta.discourse.org?

FWIW, discordo: acho que no (2) editar: o caso geral de [texto](URL) (chame isso de (2a)), o URL do link deve ser reescrito da mesma forma que (1). (Concordo que o comportamento atual de reescrever o texto e não o URL está completamente quebrado.) Eu tomo a decisão entre escrever (1) e (2a) com base se acho útil ou distrativo que o URL seja visível para o leitor, não com base em qualquer intenção sobre se o link deve apontar para a versão do código como escrita ou como lida. Claro, estou ciente do problema do link permanente, então eu mesmo crio um link permanente sempre que quero um. Mas, de forma mais geral, se um administrador do Discourse decidir habilitar o bot de link permanente, presumivelmente é porque eles acham que a maioria de seus usuários não está ciente do risco de que links baseados em nomes de branch possam se tornar obsoletos, e eu não acho que o uso da sintaxe de link Markdown seja um grande sinal de que um determinado usuário está ciente do problema, mas deseja optar por não ter esse link específico reescrito.

Mas acho que ambos estamos apenas especulando aqui. Como um usuário avançado, eu não me importo muito com o padrão, desde que eu possa substituí-lo conforme necessário.

Sim, exatamente. Atualmente não há como substituí-lo. Escrever [url](url) (o texto do link e o URL são exatamente os mesmos) definitivamente seria uma maneira de sinalizar ao bot que esse link não deve ser reescrito, porque não há outra razão para escrevê-lo dessa forma.

Existe se você quiser dar ao link seu próprio título em vez de tê-lo inferido do URL de destino, ou seja, [título](url). Dar um título ao link não indicaria nenhuma preferência por reescrita de URL, então concordo com @mattmccutchen que 1 e 2 devem se comportar de forma consistente para reescrita de URL.

Poderia haver um argumento para o título corresponder exatamente ao URL ser uma indicação de que ele não deve ser reescrito, mas e se um usuário quiser fornecer um título e quiser que o URL não seja reescrito? Precisa haver algum outro método para especificar isso.

Algo que me vem à mente seria um sufixo de título semelhante ao dimensionamento de imagem incorporada, embora eu não tenha certeza de como um usuário o descobriria.

Uma imagem incorporada pode ser dimensionada assim:
![título|100x200](url)

Portanto, o plugin discourse-github poderia (presumivelmente) ser feito para procurar algo como isto:
[título|github-no-rewrite](url)

Ah, não ficou claro para mim que o seu (2) se referia apenas ao caso especial em que o texto e o URL são os mesmos. Minha declaração era para o caso geral em que o texto e o URL podem não ser os mesmos; vamos chamar isso de (2a) agora.

No caso (2), concordo que é estranho reescrever o URL e não o texto, deixando-os inconsistentes, mas ISTM que se poderia argumentar igualmente que, se quisermos evitar a inconsistência, a melhor maneira de fazer isso é reescrever tanto o URL quanto o texto, em vez de nenhum deles. Portanto, não acho o argumento para tratar (2) como um opt-out convincente. Dado que devemos ter um opt-out que funcione para (2a), eu tenderia a apenas deixar os usuários usarem o mesmo opt-out para (2) e não complicar o design. (Acho que essa pode ter sido a ideia de Simon Manning também?)

Não tenho certeza se estou entendendo isso certo (ou se é possível), mas você poderia usar o escape de espaço como em Inline PDF Previews - #45 by Johani? Então [ texto]( url) não reescreveria nem o texto nem a url, e qualquer outra coisa seria alterada automaticamente?

Esta versão deve permanecer como está e não ser reescrita, deixe-me ver:

https://github.com/correctcomputation/checkedc-clang/blob/master-post-microsoft/clang/docs/checkedc/Setup-and-Build.md

escrito como:

<https://github.com/correctcomputation/checkedc-clang/blob/master-post-microsoft/clang/docs/checkedc/Setup-and-Build.md>

Não é um teste válido porque a reescrita de permalink do GitHub está desativada inteiramente nesta instância do Discourse. (Fico me perguntando o que isso diz sobre esse recurso se ele está desativado na instância “oficial” :upside_down_face:)

Se você fosse escrever este exemplo como um caso de teste para replace_github_non_permalinks.rb / replace_github_non_permalinks_spec.rb em vez disso, então acho que você descobriria que esse link também seria reescrito.

1 curtida