Clique para editar

:information_source: Resumo Clicar na área de texto no compositor selecionará a linha correspondente no painel de visualização e vice-versa.
:hammer_and_wrench: Link do Repositório \u003chttps://github.com/thijsbrilleman/discourse-click-to-edit\u003e
:open_book: Guia de Instalação Como instalar plugins no Discourse

click-to-edit - 1080WebShareName-2

Funcionalidades

Clicar na área de texto no compositor selecionará a linha correspondente no painel de visualização e vice-versa.

28 curtidas

Ótima adição à edição principal do Discourse. Obrigado por criá-lo.

5 curtidas

Parece algo que deveria ser bem-vindo, embora eu não tenha poder de decisão sobre isso.

6 curtidas

Olá :waving_hand: Obrigado, isso é muito legal :tada: Estou apenas pensando que seria incrível transformá-lo em um componente de tema. :slightly_smiling_face:

7 curtidas

Não funciona muito bem no iPad, pois ele seleciona o texto inteiro ao escrever. Fica muito estranho.

3 curtidas

Obrigado, e concordo. Vou verificar assim que tiver tempo. Você seria sempre bem-vindo para enviar um pull request.

Este é atualmente o comportamento pretendido, mas estou, claro, aberto a ideias melhores. Que tipo de indicação visual você recomendaria?

2 curtidas

Ele apareceria como texto colado quando algo fosse realmente selecionado. Em seguida, haveria ação e resposta.

Curioso, por que isso é um plugin em vez de um componente de tema? Todos esses tokens podem ser gerados no lado do cliente, certo?

Bom trabalho, aliás, adoro que você esteja contando com os números de linha injetados pelo mecanismo de markdown.

4 curtidas

Obrigado, Sam.

Como você deve ter notado, os atributos data-ln estão presentes no HTML cozido gerado e armazenado no servidor também.

Eu implementei esse comportamento, para que mais tarde eu pudesse estender o plugin para permitir a inserção/edição confiável de fragmentos da página de visualização do tópico, equivalente ao botão de edição mostrado abaixo (mas um pouco mais robusto):

Faz um ano que escrevi, mas se me lembro corretamente, para esse fim, em plugin.rb, a linha

register_asset "vendor/javascripts/markdown-it-line-numbers.js", :vendored_pretty_text

é necessária para garantir que a extensão MarkdownIt também seja executada no lado do servidor ao cozinhar o HTML.

No entanto, não encontrei tempo para implementar o recurso de edição estendido, então, se esse requisito for descartado, ele poderá ser convertido em um componente, eu acho.

5 curtidas

@sam Estou analisando a conversão em um componente de tema, mas não consigo descobrir como executar este código no contexto de um plugin markdownit:

// javascripts/lib/discourse-markdown/initialize_markdownit_plugin.js:

export function setup(helper) {
    helper.registerPlugin(markdownitLineNumbers); // markdownitLineNumbers já disponível
}

Tenho a suspeita de que a linha no plugin que escrevi anteriormente também adiciona alguma mágica do lado do cliente:

# plugin.rb

register_asset "vendor/javascripts/markdown-it-line-numbers.js", :vendored_pretty_text

Você tem alguma ideia?

Não tenho certeza, vou contatar a equipe.

2 curtidas

Acredito que isso ocorra porque atualmente está restrito apenas ao escopo de plugins. Funcionaria sem essa verificação. (Este código foi introduzido neste commit)

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/static/markdown-it/features.js#L5

Eu queria integrar números de linha para outro componente, mas não queria criar um plugin, então desisti. Seria muito legal se os recursos de markdown pudessem ser suportados em componentes de tema!

Em tempo, um ótimo recurso que você propôs aqui – muito bom. :+1: :rocket:

4 curtidas

Ah sim, isso esclarece.

Analisando este código, pode ser possível injetar manualmente o plugin de markdown do componente de tema em tempo de execução, mas isso seria bastante improvisado. Aguardarei o veredito da equipe principal antes de tentar implementá-lo.

4 curtidas

Nosso pipeline de markdown é executado tanto no cliente (para visualização) quanto no servidor (para pré-renderizar o HTML das postagens). É por isso que ele é projetado apenas para plugins - eles são os únicos que podem injetar código no lado do servidor.

Agora… este caso é bastante incomum, pois a extensão é necessária apenas no compositor e não no servidor. Portanto, fazê-lo a partir de um componente de tema deve ser viável.

Você tinha alguma estratégia em mente para isso?

5 curtidas

Isso parece algo que teria um amplo apelo. Pode ser difícil encontrar seu lugar em uma postagem longa. Poderia ser pr-welcome?

5 curtidas

Substitua esta função no código original:

// discourse/app/assets/javascripts/discourse/app/components/d-editor.js
async cachedCookAsync(text, options) {
  this._cachedCookFunction ||= await generateCookFunction(options || {});
  return await this._cachedCookFunction(text);
}

com um inicializador de componente de tema:

export default {
  name: "d-editor-cached-cook-async-override",
  initialize() {
    const dEditor = require("discourse/components/d-editor").default;
    dEditor.reopen({
      cachedCookAsync(text, options) {
        // código duplicado aqui para retornar uma função de cozimento alterada
      },
    });
  },
};

Isso significaria uma quantidade considerável de duplicação de código, se é que funcionaria. Sujo, sujo.

4 curtidas

Hmm sim, concordo - definitivamente não é o ideal. Duplicar o código pode nem ser possível, porque os módulos markdown-it são carregados de forma assíncrona e não fazem parte do sistema de módulos amd ao qual temas/plugins têm acesso direto. :thinking:

Construir um sistema para permitir que temas contribuam com transformações de md apenas no lado do cliente poderia ser legal, embora os casos de uso sejam bastante limitados. Em 99% dos casos, as pessoas querem que as transformações de md também se apliquem no lado do servidor.

Então, acho que, por enquanto, manter um plugin é provavelmente a melhor abordagem.

5 curtidas

Gostaria de saber se esse tipo de decoração deveria ser aplicado de qualquer forma?

Por exemplo:

<p data-source-line="0">.....</p>

O atributo de dados extra ajudará muitas implementações internas que temos, como, por exemplo, não mostrar autocompletar quando você está dentro de um bloco de código. Citar e editar rapidamente também se tornam muito mais fáceis.

A implementação trivial carrega quase nenhum peso extra, mas nos permite excluir uma pilha de código-fonte.

7 curtidas

Nós tivemos isso no passado (atrás de uma flag), mas foi removido neste commit. Encontrei esta captura de tela de algumas discussões internas sobre esse recurso:

ou seja, o problema de desempenho foi com o código de sincronização de rolagem, não com a injeção dos números de linha :ok_hand:

Então sim, não tenho objeção em adicionar a injeção de data-source-line ao core, desde que seja adicionada apenas na pré-visualização. É algo que você estaria interessado em fazer um PR para @pipkin?

4 curtidas

Com prazer! Fico feliz em poder retribuir algo para vocês.

6 curtidas