Limpar tags html em todas as postagens após a migração?

Olá, como mencionado em Script de importação do Flarum improvisado, mas funcional, migrei do Flarum para o Discourse. É meu primeiro site e estou adorando o trabalho de vocês; parabéns a todos.

Algo que, à primeira vista no desenvolvimento, parecia estar tudo certo foi a forma como as postagens foram migradas. No navegador, a maioria parece boa, mas, por baixo dos panos, há muitas tags HTML antigas que quebram coisas ao carregar imagens, importá-las para o armazenamento local e assim por diante.

Existe uma maneira inteligente de remover a marcação HTML de todas as postagens após a migração?
Outra questão: também preciso corrigir muitos URLs de http para https.

Obrigado pela ajuda. Aliás, o script improvisado que forneci definitivamente deve ser aprimorado para cuidar melhor do processamento das postagens para o formato de post do Discourse (não está no meu conjunto de habilidades)…

2 curtidas

É mais fácil corrigir esses problemas no importador. Se você já colocou o site no ar e isso não é uma opção, fica mais difícil. Você só precisa escrever código para modificar o texto bruto e refazer os posts. Não há mágica, temo eu.

3 curtidas

Parece que você está enfrentando o problema descrito aqui: Fix broken images for posts created by the WP Discourse and RSS plugins. Minha primeira resposta naquele tópico fornece alguns detalhes sobre o que causa o problema. O problema afeta imagens em posts que foram criados com HTML. Vou atualizar o título daquele tópico para deixar claro que ele afeta mais do que apenas posts criados com o plugin WP Discourse ou um feed RSS.

Idealmente, o analisador de markdown do Discourse seria capaz de lidar com tags de imagem HTML que estão envoltas em outras tags HTML. Acredito, no entanto, que seja um problema difícil de corrigir.

2 curtidas

Sim, esse é exatamente o fenômeno com as minhas imagens quebradas dentro de outras tags HTML.

Comecei a corrigir manualmente, mas é trabalhoso e fica ainda mais complicado porque isso faz o post subir para o topo da lista de mais recentes. Isso exige um reset manual do bump, etc.

Vou seguir em frente e tentar entender a lógica para remover as tags HTML, analisando alguns posts bem problemáticos. Depois, talvez precise de ajuda para automatizar isso em todo o banco de dados. Vou tentar usar o Data Explorer para resolver essa parte. O Data Explorer permitiria atuar como um IDE para realizar essas transformações nos posts?

Aguardo com expectativa a curva de aprendizado.

Koen

1 curtida

Não, o plugin Data Explorer permite apenas ler do banco de dados do site. Ele não permite escrever no banco de dados do site.

2 curtidas

Oi, consegui descobrir como fazer a limpeza de forma manual e também corrigir as imagens quebradas. No entanto, gostaria de automatizar esse processo.

O que eu gostaria de fazer é encontrar uma maneira de remover todas as tags HTML, como [P], [/P] e [BR/].

Pesquisei no fórum, mas não encontrei nada parecido. Também procurei nos scripts de importação, mas não há um importador de Discourse para Discourse para servir de base. Acredito que preciso de um script que:

  • acesse a tabela de posts;
  • itere sobre todos os posts;
  • itere sobre cada post:
    –> remova as tags P completamente;
    –> substitua BR/ por uma quebra de linha;
    –> faça algo inteligente com URLs;
    –> faça algo inteligente com imagens;
  • recrie (rebake) todos os posts, provavelmente.

Alguém pode me indicar alguma discussão relevante no Discourse, ou alguém tem algum script ou trecho de código que possa me ajudar a começar? Não sou um desenvolvedor experiente, mas consigo modificar coisas que já funcionam…

Compartilharei com a comunidade assim que alcançar meu objetivo.

Koen

1 curtida

Aqui está um código que faz algo semelhante:

posts=Post.where("raw like '%Sent from%using Tapatalk'")

posts.each do |post|
   post.raw.gsub!(/^Sent from my.+?using Tapatalk$/,"")
   post.save
   post.rebake!
end

Acho que você não precisa fazer algo “inteligente” para imagens ou URLs, a menos que estejam de alguma forma quebradas.

Você quer algo como

   post.raw.gsub!(/\/?\[p\]/ig,"\n")

para substituir [p] e [/p] por uma nova linha (uma linha extra não fará mal, mas você pode remover o \n se achar que não precisa de uma nova linha), mas eu não testei, então isso provavelmente está errado. Você pode testar em algo como https://rubular.com/.

2 curtidas

Ótimo, isso me colocou totalmente no caminho certo.

Acho que, para o meu caso simples, usar rake posts:remap["find","replace"] deve bastar, certo?

Vou tentar, muito obrigado!

1 curtida

Pode ser complicado (se é que é possível) descobrir como escapar o [ com essa tarefa rake.

1 curtida

Desculpe, o caractere “]” foi colocado apenas porque não consegui descobrir como inserir o “<”.

Preciso apenas remover alguns desses tags HTML padrão.

Deve ficar tudo bem então, certo, usando o remapeamento?

2 curtidas

Provavelmente sim. Você cita coisas usando crases assim

` <p> `

ou

`<p>`
2 curtidas

Apenas para informação, @koen360

Quando migramos nosso fórum, tivemos inúmeros problemas com esses códigos e tags do BBCode provenientes de quase duas décadas de postagens no fórum.

Não usamos a função rake remap para isso e, em todos os casos, utilizamos a técnica que @pfaffman descreve no trecho de código dele:

O trecho de código acima, usando gsub(), resume uma das melhores maneiras de limpar as postagens brutas após (ou, melhor ainda, durante) a migração.

Certifique-se de testar suas expressões REGEX ANTES de implementá-las de verdade no banco de dados e tenha um backup completo antes de realizar operações como essas diretamente no seu banco de dados.

1 curtida

Olá, abaixo está o conteúdo do meu script/cleanup.rb que executo usando: RAILS_ENV=development bundle exec ruby script/cleanup.rb

Conteúdo do arquivo:

require_relative '../config/environment'
pm = 0
Post.find_each do |test|
	test.raw.gsub!(/<(.|\/.)>/i,"")
	test.save
	test.rebake!
	pm = pm + 1
end
puts "cycled through #{pm} posts"

Tentei executar rake posts:rebake, que rebakeou 1757 posts. O script percorre apenas 1712 posts, que são os importados com as tags HTML, enquanto o restante são novos criados no Discourse.

Acho que estou chegando perto, mas ao inspecionar o conteúdo bruto na interface do usuário, continuo vendo todas as tags HTML.

Tentei reiniciar o ambiente e relançar o unicorn, mas sem sucesso. Tão perto… tão perto ;o)

2 curtidas

Você testou sua expressão regular em algum lugar? Faça um post de cada vez para garantir que o raw foi alterado?

1 curtida

Usei sua sugestão do Rubular e agora o regexr.com está assim, conforme a captura de tela abaixo. Por enquanto, foquei nas tags p e r para resolvê-las antes de adicionar as mais complexas.

2 curtidas

Quando adicionei uma instrução put ao meu pequeno cleanup.rb para imprimir o conteúdo bruto do post no CLI, notei que nenhuma tag HTML foi exibida.

No entanto, ao editar qualquer post, vejo o seguinte, com as tags HTML na mão direita. Isso não parece ser o cenário normal, pois quando retorno para editar o post que estou editando agora, não vejo as tags HTML…

Alguém tem uma ideia?

1 curtida

Esse gsub precisa de um ‘g’ após o ‘/i’ para corresponder a várias tags. Mas se o que você vê no seu puts for diferente do que aparece após a execução do script, então não tenho uma explicação.

1 curtida

Estranho, recebo:

script/cleanup.rb:9: opção de expressão regular desconhecida - g

ao adicionar g ao i assim:

require_relative ‘../config/environment’

pm = 0
Post.find_each do |test|
puts test.raw
test.raw.gsub!(/<(.|.)>/ig,“”)
test.save
test.rebake!
pm = pm + 1
end
puts “cycled through #{pm} posts”

1 curtida

Conforme me lembro (e é assim que geralmente fazemos a correspondência de várias linhas usando gsub…), uma REGEX multiline do Ruby requer m:

/./m - Qualquer caractere (o modificador m habilita o modo multiline)

Veja:

Espero que ajude.

1 curtida

Obrigado, funcionou do lado da expressão regular.

Parece que há duas coisas que não consigo explicar usando este script:

# Chame-o assim:
# RAILS_ENV=development bundle exec ruby script/cleanup.rb -> cleanup.log

require_relative '../config/environment'
pm = 0
Post.find_each do |test|
	puts test.raw
	test.raw.gsub!(/<(.|\/.)>/im,"")
	test.save
	test.rebake!
	pm = pm + 1
end
puts "cycled through #{pm} posts"
  1. Após executar isso algumas vezes, o cleanup.log continua contendo 10 instâncias de <p> em cerca de 21.000 linhas de material bruto dos posts. Estranhamente, esses nunca são removidos.
  2. Ainda mais estranho (para mim) é que, quando inicio o unicorn e acesso o site no meu computador local, ainda vejo as tags HTML em todos os posts que verifico na visualização bruta do editor.

Parece que não estou olhando para o mesmo ambiente, talvez? O d/unicorn acessa um ambiente de produção local enquanto meu script aplica alterações no desenvolvimento?

Estou tentando fazer isso funcionar usando o ambiente de desenvolvimento com o guia do Docker localmente primeiro, antes de ir para o meu site ao vivo.

Deve ser alguma coisa básica de iniciante que estou ignorando. :sweat_smile:

1 curtida