Seria possível ajustar as configurações atuais do tipógrafo Markdown (também conhecido como “pontuação inteligente”) para habilitar sinais de pontuação Unicode, como aspas e travessões, mas desabilitar (c), ™ e, potencialmente, outros glifos especializados desse tipo?
Isso surge com especial frequência em listas enumeradas. Por exemplo:
(a) maçã
(b) banana
(c) direito autoral?
(d) data
Esse estilo de enumeração é muito comum em leis, contratos, políticas e outras redações formais influenciadas pelo estilo jurídico. Também é um estilo de tópicos muito comum. Fazia parte do estilo de tópicos “padrão” que me ensinaram quando era aluno do ensino fundamental nos Estados Unidos.
Vejo que as configurações atuais oferecem certa flexibilidade em torno da pontuação, mas, até onde posso ver, não há nenhuma maneira de habilitar a pontuação inteligente sem também habilitar os símbolos inteligentes.
Não tenho opiniões fortes sobre isso. Acredito que a necessidade de digitar o símbolo de direitos autorais é tão rara que esse atalho pode ser mantido. O equilíbrio entre a utilidade extremamente rara e o formato da lista (a) (b) (c) — que é bastante comum, mas pouco elegante — me parece aceitável. Estou de acordo em remover completamente esse atalho em particular, @sam.
Isso não parece ser tão configurável. Seria necessário aplicar um patch no markdown.it para suportar essa flexibilidade ou simplesmente criar nossa própria versão baseada no prettify a partir do markdown.it.
A única correção trivial é desativar todo o recurso.
O lado bom é que o motor é bastante configurável: podemos desativar as regras no markdown.it, copiar o código e implementar nossas próprias substituições, assim como o @Roman implementou.
Alguns dias de engenharia para limpar isso também seriam necessários; seria uma pena enviar o mesmo código duas vezes, mas é meio inevitável se formos fazer um fork dele.
A partir do commit 7b8969ce5cb2edc54f2c1aa39a85a3a08076337d na master do markdown-it, o arquivo de origem relevante é lib/rules_core/replacements.js e o fixture de teste relevante é test/fixtures/markdown-it/typographer.txt.
Todas as substituições estão codificadas diretamente. Elas incluem (c) → (c), (tm) → ™, (r) → (r) e (p) → (p), que são agrupadas como “abreviações escopadas”.
Por que não, não obtenho (p) para §. Isso quase certamente deveria ser ℗, o símbolo de fonograma, em vez disso.
Vou investigar isso por um tempo e ver se consigo criar um patch que torne o recurso “typographer” mais configurável.
O mantenedor é extremamente responsivo. Ele fecha meus PRs em questão de minutos
O que estou lendo é que ele reluta muito, muito em introduzir qualquer mudança quebradora, mesmo em novas versões principais, até mesmo para coisas como a renderização de (P) como §. Ele também é alérgico a permitir opções no estilo typographer: {A: true, B: false}, mesmo quando typographer: true continua funcional, devido à complexidade percebida.
Estou lendo nas entrelinhas e ele é um russo escrevendo em inglês. Mas tenho a sensação de que ele vê o markdown-it como algo já consolidado.
Com toda a gratidão, talvez valha a pena fazer um fork da implementação, reescrevê-la como Módulos ES e remover toda a funcionalidade do tipo plugin que está atualmente embutida, tanto a ligação de links quanto as substituições, incluindo as substituições de pontuação do tipógrafo.
O mantenedor não tem interesse em pontos sobre código duplicado em bundles sem números. Também não se interessa por mudanças que não quebrem a API, a menos que sejam ‘exigidas por 100% dos usuários’ ou que bloqueiem implementações de plugins. Isso cria um certo impasse, já que eles estão lançando dois submódulos muito voltados para plugins, para linkificação e pontuação inteligente, que, segundo essa filosofia, deveriam estar em seus próprios pequenos pacotes npm. Isso acontece.
Para contextualizar, houve lançamentos significativos do markdown-it no passado recente. Destaque para uma melhoria de desempenho feita por Alex Kocharin em novembro do ano passado.
Para corrigir (c), lidar com (p) e fazer o que quisermos com setas e afins, a melhor opção é provavelmente propor um patch que remova os submódulos de linkificação e pontuação inteligente do núcleo e os carregue como plugins no Discourse. Use uma GitHub Action ou uma tarefa agendada (cron job) para monitorar a branch master do markdown-it e tentar um rebasing automático. Se o mantenedor continuar tão conservador em relação a mudanças, o patch deve se aplicar corretamente por um bom tempo. A menos que eles deem um grande salto, como reescrever o projeto usando ES Modules em vez de CommonJS.
Discutimos isso internamente e decidimos que faremos um hard fork do typographer.
Basicamente, desabilitaremos o typographer no markdown.it e implementaremos uma cópia no Discourse. O markdown.it é extremamente extensível; isso é basicamente “copiar e colar”.
Assim que a cópia for concluída, poderemos adicionar testes, personalizar e alterar algumas das regras.
Ei, desculpe retomar essa discussão. Como estou procurando uma maneira de desabilitar ... -> …, gostaria de saber se essa funcionalidade evoluiu de alguma forma e se no futuro poderei habilitar ou desabilitar regras individuais.
Bom, eu já tentei isso, mas aparentemente não está funcionando. Não importa se eu ativo ou desativo o tipógrafo, as substituições sempre são feitas (e, aliás, o (c) não parece funcionar).