Atualizando para o Novo Plugin de Matemática

Ainda tenho o plugin antigo "Discourse Mathjax" instalado. Alguém já converteu com sucesso suas postagens para serem exibidas corretamente com o novo plugin? Você poderia, por favor, postar um comando de linha funcional?

Os dois plugins não são 100% compatíveis, pois algum conteúdo ficará quebrado se eu apenas ativar o novo.

Por exemplo, o novo plugin requer $$ duplos antes e depois dos blocos \\begin{...}...\\end{...}, por exemplo, \\begin{align}...\\end{align} (sem $$ duplos) é renderizado como matemática com o plugin antigo, mas não com o novo.

Para converter esses, eu faria um scraping de todo o conteúdo e faria uma busca-substituição com regexp para adicionar/anexar os $$ duplos antes/depois de \\begin{..}/\\end{..} (mas blocos aninhados assim seriam um problema). Pode haver outros casos em que o conteúdo aparecerá quebrado que ainda não percebi (é um fórum de 5 anos com muita matemática).

1 curtida

Bem, gastei mais do que admito para converter e corrigir conteúdo quebrado após a atualização para o novo plugin de matemática, então estou postando aqui os comandos importantes que usei (desculpem a gambiarra feia, fiquei com preguiça). Alguma correção manual do conteúdo ainda foi necessária, mas não muita no nosso caso.

NOTA: Isso é para fins de inspiração. Lembre-se do poema “Não me responsabilizo…”. Não execute isso cegamente se não o entender.

# substitui \\\\ por \\ (que também traduz \\\\\\\\ para \\\\)
Post.where('raw ~ ?', "\\\\\\\\").each{|p| p.raw=p.raw.gsub(/\\\\\\\\/, "\\\\"); p.save; print "."; $stdout.flush;}; puts "";

# substitui {align} por {aligned} e remove todas as versões com asterisco
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{align.*?\\}/, "\\1{aligned}"); p.save; print "."; $stdout.flush;}; puts "";

# substitui {array} por {matrix} e remove todas as versões com asterisco
Post.where('raw ~ ?', "\\\\begin\\{array").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{array\\*?\\}/, "\\1{matrix}"); p.save; print "."; $stdout.flush;}; puts "";

# substitui `\begin{equation}` por `$$`
Post.where('raw ~ ?', "\\\\begin\\{equation").each{|p| p.raw=p.raw.gsub(/\s*\\(begin|end)\\{equation\\*?}\\s*/, "$$"); p.save; print "."; $stdout.flush;}; puts "";

# adiciona novas linhas antes e depois de `$$`
Post.where('raw ~ ?', "\\$\\$").each{|p| p.raw=p.raw.gsub(/\$\$/,"\\n$$ \\n"); p.save; print "."; $stdout.flush;}; puts "";

# adiciona `$$` antes e depois de blocos `{aligned}`
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/\s*(\\begin\\{align})/m,"\\n$$ \\n\\1").gsub(/(\\end\\{align.*?\\})\s*/m,"\\1\\n$$ \\n"); p.save; print "."; $stdout.flush;}; puts "";

# ... corrige `$$` duplos em `{aligned}`
Post.where('raw ~ ?', "\\\\begin\\{aligned").each{|p| p.raw=p.raw.gsub(/(\\end\\{align.*?\\}\\n\\$\\$)\\n\\$\\$/,"\\1").gsub(/\\$\\$\\n(\\$\\$\\n\\\\begin\\{align)/,"\\1"); p.save; print "."; $stdout.flush;}; puts "";

## aplique os dois comandos acima a outros ambientes que você possa ter além de {aligned}

# CORREÇÃO MANUAL RECOMENDADA PARA O SEGUINTE:
# Posts onde `$$` aparecem em `> ` citado `\u003e `. Apenas o `$$` de abertura e
# fechamento devem ser prefixados, ou seja, `\u003e $$`, o conteúdo entre eles não deve
# ou então será renderizado como sinais de maior que de matemática.
# Execute isso para identificar os posts:
Post.where('raw ~ ?', ">\\s*\\n\\s*$$").each{|p| puts "https://discourse.domain.com/p/#{p.id}";};

# ... OU, execute isso para tentar uma correção automatizada, embora arriscada
# (funcionou bem para nós, alguns posts precisaram de mais trabalho manual):
Post.where('raw ~ ?', ">\\s*\\n\\s*$$").each{|p| p.raw=p.raw.gsub(/(\\>\s*)\\$\\$(.*?)\\$\\$\\s*?\\n/m,"\\1\u003e $$\\\\2\u003e $$\n\u003e"); p.save; print "."; $stdout.flush;}; puts "";

# Cosmético, opcional: substitui 3+ novas linhas consecutivas por 2 novas linhas
Post.where('raw ~ ?', "\\n{3,}").each{|p| p.raw=p.raw.gsub(/\n{3,}/,"\n\n"); p.save; print "."; $stdout.flush;}; puts "";

# Opcional: substitui 2+ novas linhas consecutivas antes e depois de `$$`
# por uma única nova linha
# AVISO: tudo bem na versão atual do plugin, mas pode exibir
# de forma diferente em uma versão futura (?). Por exemplo, em Latex real, uma linha vazia
# após $$ antes do texto faz uma diferença no espaçamento vertical.
Post.where('raw ~ ?', "\\n\\$\\$\\n{2,}|\\n{2,}\\$\\$").each{|p| p.raw=p.raw.gsub(/\n\$\$\n{2,}/,"\n$$\n").gsub(/\n{2,}\$\$/,"\n$$"); p.save; print "."; $stdout.flush;}; puts "";
2 curtidas

@sam como este plugin agora é oficial, poderíamos fazer com que o recurso “Citação” também funcione corretamente? Ao selecionar texto com matemática e, em seguida, usar o botão “Citação”, atualmente recebo toda a matemática removida e duplicada. O código JavaScript para o recurso “Citação” poderia reconhecer as tags HTML de matemática e adicionar os $ e/ou $$ necessários na caixa de edição, em vez de removê-los e duplicar a string de matemática.

Além disso, acho que seria bom incluir uma versão mais recente do Katex no plugin. A versão incluída tem mais de 2 anos (0.11), enquanto a versão estável do Katex é a 0.15.2, que é mais rica e tem muitos bugs corrigidos. Estou ciente do readme, mas poucas pessoas se darão ao trabalho.

O Mathjax 3.x também seria bom (muito mais rápido que o 2.7).

EDIT: Existe uma atualização muito mais fácil do Katex incluído que não requer a compilação do Katex a partir das fontes. Basta baixar o tarball, copiar os arquivos, substituir a pasta de fontes no CSS.

wget -O- https://github.com/KaTeX/KaTeX/releases/latest/download/katex.tar.gz | tar -zx
cp katex/fonts/*.woff* /path/to/discourse/plugins/discourse-math/public/katex/fonts/
cp katex/katex.min.* katex/contrib/mhchem.min.js /path/to/discourse/plugins/discourse-math/public/katex/
sed -i "s~url(fonts/~url(/plugins/discourse-math/katex/fonts/~g" /path/to/discourse/plugins/discourse-math/public/katex/katex.min.css
5 curtidas

Tudo isso parece ótimo, há alguma chance de você enviar alguns PRs para isso?

3 curtidas

Criei um PR para atualizar o KaTeX e também o atualizei para a versão mais recente. Não estou usando MathJax, então ainda não me preocupei com isso. Em última análise, o Discourse pode querer permitir o link para um CDN para estes (permitir que o usuário especifique a URL para que ele possa corrigir uma versão de lançamento, se desejar; padrão para o host atual), mesmo que vá um pouco contra o ethos do Discourse, pois essas bibliotecas são atualizadas com muita frequência com correções e outras coisas.

Infelizmente, não tenho tempo para um PR para a correção do recurso “Quote” – estou muito atolado de trabalho nos dias de hoje, é por isso que deixei uma mensagem esperando que outra pessoa possa resolver isso.

4 curtidas

Valeu demais pela PR @nordize, mesclei!

5 curtidas

Lembro-me que este tópico continha muitas mensagens e discussões - o que aconteceu?

Vim para adicionar algumas notas à minha última contribuição que fiz no início deste ano, bem como uma melhoria para permitir que macros persistam entre expressões matemáticas com Katex (veja aqui). Estou no tópico errado?

As postagens neste tópico estão em um temporizador automático para serem limpas, mas posso desenterrar algumas se você quiser movê-las para um tópico no estilo Dicas e Truques?

Por que diabos?!? Este plugin é importante e um dos mais populares. A discussão neste tópico teve muitas postagens de interesse. Eu escrevi pelo menos um guia em uma postagem e confiei que estaria lá para consultá-lo. Eu e meus colegas até marcamos algumas das postagens nos favoritos… e agora tudo sumiu?

Esta é uma decisão muito estranha. Um dos propósitos do Discourse não era ser capaz de lidar com tópicos longos (carregamento adaptativo e tudo mais, etc.)? “limpar” … certamente não estamos com pouco espaço! Na era atual, a posteridade da informação é mais importante. Eu realmente não entendo tais decisões, pois não estamos mais em 1990, e isso basicamente diz que o ônus ainda é do indivíduo para salvar informações e se esforçar para compartilhá-las de fontes locais, porque elas podem desaparecer a qualquer momento de onde foram postadas online, o que incentiva o desperdício, o incômodo, a atenção e a organização desnecessárias, e diminui a confiança e a confiabilidade. Ajudar os usuários da comunidade também se torna ineficiente e problemático se as informações forem apagadas após 1 mês. Isso frustra vários propósitos. Deveríamos ter ido na direção oposta.

Não é uma questão de vida ou morte, obviamente, não quero exagerar, mas ainda assim… Você poderia trazê-lo de volta na íntegra e talvez reconsiderar esta política de 1 mês daqui para frente?

De qualquer forma, @sam - eu fiz este PR: https://github.com/discourse/discourse-math/pull/51 que encorajo a mesclar porque o Mathjax tem isso por padrão, então as pessoas que alternam entre Mathjax e Katex teriam conteúdo quebrado. O mesmo vale para as pessoas que atualizam do plugin antigo.

1 curtida

Eu poderia ter dito isso de forma mais delicada. :slightly_smiling_face:

Esperançosamente (se tudo correr bem :crossed_fingers:), qualquer informação útil/discussão interessante terá sido movida para o OP ou dividida em um novo tópico. Há uma chance de que isso nem sempre aconteça, mas ficarei feliz em dar uma olhada e verificar. :+1:

2 curtidas

Claro, talvez não tenha tomado café suficiente… mas é ótimo descobrir que as coisas em que se investe tempo (em prol de uma comunidade) são jogadas fora. Acho que deveria ter guardado o guia e os scripts que escrevi para atualizar do plugin antigo, bem como os outros posts que me interessavam, e depois esperar que as pessoas me pedissem ajuda por e-mail. Quem diria que postá-los no fórum da comunidade seria a opção mais insegura. Sim, não tomei café suficiente…

Nada disso aconteceu aqui, pelo que pude apurar.

Trazer o tópico de volta seria demais…? Definitivamente não tomei café suficiente! :slight_smile:

1 curtida

Eu acho que peguei todos os certos? Eu os movi da área de temporizador automático para Support, então eles devem estar seguros contra qualquer exclusão. :+1: Alguma alteração ou ajuste que você queira que eu faça?