¿Limpiar etiquetas html en todas las publicaciones después de la migración?

Hola, como se mencionó en Script de importación de Flarum improvisado pero funcional, he migrado de Flarum a Discourse. Es mi primer sitio y estoy encantado con su trabajo; mis felicitaciones a todos.

Algo que a primera vista en el desarrollo parecía estar bien era la forma en que se migraron todos los mensajes. En el navegador, la mayoría se ven bien, pero al examinarlos de cerca, hay muchas etiquetas HTML heredadas que rompen cosas al cargar imágenes y al importarlas al almacenamiento local, entre otros problemas.

¿Existe una forma inteligente de eliminar el marcado HTML después de la migración de todos los mensajes?
Otra pregunta: también necesito corregir muchas URL, cambiando de http a https.

Gracias por su ayuda. Por cierto, el script improvisado que proporcioné definitivamente debería mejorarse para manejar mejor el procesamiento de los mensajes al formato de mensajes de Discourse (no es mi especialidad)…

2 Me gusta

Es más fácil solucionar estos problemas en el importador. Si ya has puesto el sitio en producción y esa no es una opción, entonces es más complicado. Solo tienes que escribir código para modificar el texto sin procesar y regenerar las publicaciones. No hay magia, lo siento.

3 Me gusta

Parece que estás experimentando el problema descrito aquí: Fix broken images for posts created by the WP Discourse and RSS plugins. Mi primera respuesta en ese tema proporciona algunos detalles sobre lo que causa el problema. Este problema afecta a las imágenes en publicaciones que fueron creadas con HTML. Actualizaré el título de ese tema para aclarar que afecta a más que solo las publicaciones creadas con el plugin WP Discourse o un feed RSS.

Idealmente, el analizador de Markdown de Discourse debería poder manejar etiquetas de imagen HTML que están envueltas en otras etiquetas HTML. Sin embargo, creo que es un problema difícil de resolver.

2 Me gusta

Sí, este es exactamente el fenómeno que tengo con mis imágenes rotas dentro de otras etiquetas HTML.

He comenzado a corregir manualmente, pero es laborioso y se complica por el hecho de que mueve la publicación al tope de la lista de lo más reciente. Eso requiere un reinicio manual del empuje, etc.

Procederé a intentar entender la lógica para eliminar las etiquetas HTML revisando algunas publicaciones realmente problemáticas. Luego, es posible que necesite ayuda para automatizar eso en toda la base de datos; voy a intentar usar Data Explorer para resolver esa parte. ¿Permitiría Data Explorer actuar como un IDE para realizar estas transformaciones de publicaciones?

Espero con interés el proceso de aprendizaje.

Koen

1 me gusta

No, el complemento Data Explorer solo permite leer desde la base de datos del sitio. No permite escribir en la base de datos del sitio.

2 Me gusta

Hola, he descubierto cómo limpiar manualmente y también cómo arreglar las imágenes rotas. Sin embargo, me gustaría hacerlo de forma automatizada.

Lo que me gustaría hacer es encontrar una manera de eliminar todas las etiquetas HTML como [P], [/P] y [BR/].

He buscado en el foro pero no encuentro nada similar. También revisé los scripts de importación, pero no incluyen un importador de Discourse a Discourse para empezar. Creo que necesito un script que:

  • acceda a la tabla de publicaciones,
  • recorra todas las publicaciones,
  • recorra cada publicación:
    –> elimine por completo las etiquetas P,
    –> reemplace BR/ con un carácter de nueva línea,
    –> haga algo inteligente con las URLs,
    –> haga algo inteligente con las imágenes,
  • y finalmente reconstruya todas las publicaciones, probablemente.

¿Alguien puede orientarme hacia alguna discusión relevante en Discourse, o tiene algún script o fragmento de código que pueda ayudarme a empezar? No soy un desarrollador experimentado, pero puedo modificar cosas que ya funcionan…

Compartiré con la comunidad una vez que haya logrado mi objetivo.

Koen

1 me gusta

Aquí hay un código que hace algo similar:

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

No creo que sea necesario hacer algo “inteligente” para las imágenes o las URL a menos que estén rotas de alguna manera.

Necesitarías algo como

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

para reemplazar [p] y [/p] con un salto de línea (un salto de línea extra no hará daño, pero puedes eliminar el \n si crees que no lo necesitas), pero no lo he probado, así que probablemente sea incorrecto. Puedes probarlo en algo como https://rubular.com/.

2 Me gusta

¡Genial! Esto me ha puesto totalmente en el camino correcto.

Supongo que, para mi caso sencillo, usar rake posts:remap["find","replace"] debería ser suficiente, ¿verdad?

Voy a probarlo, ¡muchas gracias!

1 me gusta

Puede ser complicado (si es que incluso es posible) averiguar cómo escapar los [ con esa tarea de rake.

1 me gusta

Lo siento, ese carácter “]” es simplemente lo que puse porque no pude averiguar cómo poner el “<”.

Solo necesito eliminar un par de estas etiquetas HTML estándar.

Entonces debería estar bien, ¿verdad, usando el remapeo?

2 Me gusta

Probablemente sí. Se citan cosas con comillas invertidas así

`<`p`>`

o

`<p>`
2 Me gusta

Por si acaso, @koen360:

Cuando migramos nuestro foro, tuvimos innumerables problemas con estos códigos BB y etiquetas provenientes de casi dos décadas de publicaciones en el foro.

No utilizamos la función de remap de rake para esto y, en todos los casos, empleamos la técnica que @pfaffman describe en su fragmento de código:

Este fragmento de código, que utiliza gsub(), resume una de las mejores formas de limpiar las publicaciones en bruto después (o incluso mejor, durante) la migración.

Asegúrate de probar tus expresiones REGEX ANTES de implementarlas realmente en la base de datos y ten una copia de seguridad completa antes de realizar operaciones como esta directamente en tu base de datos.

1 me gusta

Hola, a continuación está el contenido de mi script/cleanup.rb, que ejecuto usando: RAILS_ENV=development bundle exec ruby script/cleanup.rb

Contenido del archivo:

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"

Intenté ejecutar rake posts:rebake, el cual rebakea 1757 publicaciones. Mi script recorre solo 1712 publicaciones, que corresponden a las importadas con etiquetas HTML, mientras que el resto son nuevas creadas en Discourse.

Creo que estoy cerca, pero al inspeccionar el contenido raw en la interfaz de usuario sigo viendo todas las etiquetas HTML.

Intenté reiniciar el entorno y relanzar unicorn, pero sin éxito. ¡Tan cerca… tan cerca ;o)

2 Me gusta

¿Probaste tu expresión regular en algún lugar? Haz un post a la vez para asegurarte de que el raw se haya modificado.

1 me gusta

Usé tu sugerencia de Rubular y ahora regexr.com lo muestra (ver captura de pantalla a continuación). Por ahora me he centrado en las etiquetas p y r para resolverlas antes de añadir las más complejas.

2 Me gusta

Cuando agregué una sentencia put a mi pequeño cleanup.rb para imprimir el contenido crudo de la publicación en la CLI, noté que no se imprimían etiquetas HTML en absoluto.

Sin embargo, cuando edito cualquier publicación, sí veo lo siguiente, con las etiquetas HTML en el lado derecho. Esto no parece ser lo normal, porque cuando vuelvo a editar la publicación que estoy editando ahora, no veo las etiquetas HTML…

¿Alguien tiene alguna idea?

1 me gusta

Ese gsub necesita una g después de /i para coincidir con varias etiquetas. Pero si lo que ves en tu puts es diferente de lo que ves después de que el script se ha ejecutado, entonces no tengo una explicación.

1 me gusta

Extraño, obtengo:

script/cleanup.rb:9: opción de expresión regular desconocida - g

al agregar g a la i así:

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 me gusta

Por lo que recuerdo (y así es como generalmente coincidimos líneas múltiples usando gsub…), una expresión regular multilinea en Ruby requiere ‘m’:

/./m - Cualquier carácter (el modificador 'm' habilita el modo multilinea)

Vea:

Espero que esto ayude.

1 me gusta

Gracias, eso funcionó desde el lado de la expresión regular.

Parece que hay dos cosas que no puedo explicar con este script:

# Llámallo así:
# 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. Después de ejecutarlo varias veces, el archivo cleanup.log sigue conteniendo 10 instancias de <p> en aproximadamente 21000 líneas de material de publicación en bruto. Extrañamente, estos nunca se eliminan.
  2. Aún más extraño (para mí) es que cuando inicio unicorn y accedo al sitio en mi máquina local, todavía veo las etiquetas HTML en todas las publicaciones que reviso en la vista en bruto del editor.

Parece que no estoy viendo el mismo entorno, ¿verdad? ¿Acaso d/unicorn consulta un entorno de producción local mientras que mi script aplica cambios en el entorno de desarrollo?

Estoy intentando hacer que esto funcione usando el entorno de desarrollo con la guía de Docker localmente primero, antes de pasar a mi sitio en vivo.

Debe ser algo obvio que estoy pasando por alto por ser nuevo. :sweat_smile:

1 me gusta