Pulire i tag html in tutti i post dopo la migrazione?

Ciao, come menzionato in Script di importazione da Flarum provvisorio ma funzionante, ho migrato da Flarum a Discourse. È il mio primo sito e mi piace moltissimo il vostro lavoro, complimenti a tutti voi.

Una cosa che a prima vista, in fase di sviluppo, sembrava essere perfettamente a posto era il modo in cui i post sono stati tutti migrati. Nel browser la maggior parte appare corretta, ma sotto la superficie ci sono molti tag HTML legacy che causano problemi nel caricamento delle immagini, nell’importazione nello storage locale e così via.

Esiste un modo intelligente per rimuovere il markup HTML dai post dopo la migrazione di tutti i post?
Un’altra domanda: devo anche correggere molti URL da http a https.

Grazie per il vostro aiuto. A proposito, lo script provvisorio che ho fornito dovrebbe sicuramente essere modificato per gestire meglio l’elaborazione dei post nel formato post di Discourse (non è nelle mie competenze)…

2 Mi Piace

È più semplice risolvere questi problemi nell’importatore. Se sei già andato online e questa non è un’opzione, allora è più difficile. Devi semplicemente scrivere del codice per modificare il testo grezzo e rigenerare i post. Non c’è nulla di magico, temo.

3 Mi Piace

Sembra che tu stia riscontrando il problema descritto qui: Fix broken images for posts created by the WP Discourse and RSS plugins. La mia prima risposta in quel topic fornisce alcuni dettagli sulle cause del problema. Il problema riguarda le immagini nei post creati con HTML. Aggiornerò il titolo di quel topic per chiarire che il problema non riguarda solo i post creati con il plugin WP Discourse o un feed RSS.

Idealmente, il parser Markdown di Discourse dovrebbe essere in grado di gestire i tag HTML per le immagini racchiusi in altri tag HTML. Tuttavia, penso che si tratti di un problema difficile da risolvere.

2 Mi Piace

Sì, è esattamente il fenomeno che si verifica con le mie immagini rotte all’interno di altri tag HTML.

Ho iniziato a correggere manualmente, ma è un processo laborioso e si complica ulteriormente perché sposta il post in cima alla lista degli ultimi. Ciò richiede un reset manuale del bump, ecc.

Procederò cercando di capire la logica per rimuovere i tag HTML esaminando alcuni post davvero problematici. Potrei poi aver bisogno di aiuto per automatizzare il processo su tutto il database; proverò a usare Data Explorer per risolvere questa parte. Data Explorer permette di agire come un IDE per eseguire queste trasformazioni dei post?

Non vedo l’ora di affrontare la curva di apprendimento.

Koen

1 Mi Piace

No, il plugin Data Explorer consente solo la lettura dal database del sito. Non permette di scrivere nel database del sito.

2 Mi Piace

Ciao, sono riuscito a trovare un modo per pulire manualmente e correggere anche le immagini rotte. Tuttavia, vorrei farlo in modo automatico.

Ciò che vorrei fare è trovare un metodo per rimuovere tutti i tag HTML come [P] e [/P] e [BR/].

Ho cercato nel forum ma non ho trovato nulla di simile. Ho anche controllato gli script di importazione, ma non contengono un importatore da Discourse a Discourse con cui iniziare. Penso di aver bisogno di uno script che:

  • acceda alla tabella dei post
  • iteri su tutti i post
  • iteri all’interno di ogni post:
    –> rimuova completamente i tag P
    –> sostituisca BR/ con un carattere di nuova riga?
    –> gestisca in modo intelligente gli URL
    –> gestisca in modo intelligente le immagini
  • rigeneri probabilmente tutti i post.

Qualcuno può indicarmi una discussione pertinente su Discourse, o ha qualcuno uno script o degli snippet con cui iniziare? Non sono uno sviluppatore esperto, ma posso modificare cose che già funzionano…

Condividerò con la comunità non appena avrò raggiunto il mio obiettivo.

Koen

1 Mi Piace

Ecco un codice che fa qualcosa di simile:

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

Non credo sia necessario fare qualcosa di “intelligente” per le immagini o gli URL, a meno che non siano in qualche modo danneggiati.

Potresti usare qualcosa del genere:

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

per sostituire [p] e [/p] con una nuova riga (una riga vuota in più non fa male, ma puoi rimuovere \n se non ritieni necessaria una nuova riga), ma non l’ho testato, quindi probabilmente è errato. Puoi provarlo su qualcosa come https://rubular.com/.

2 Mi Piace

Fantastico, mi ha messo completamente sulla strada giusta.

Immagino che per il mio caso semplice, usare rake posts:remap["find","replace"] dovrebbe bastare, giusto?

Proverò, grazie mille!

1 Mi Piace

Può essere complicato (se non addirittura impossibile) capire come sfuggire [ con quel task rake.

1 Mi Piace

Scusa, quel carattere “]” è solo quello che ho inserito perché non sapevo come mettere il “<”.

Devo solo rimuovere un paio di questi tag HTML standard.

Dovrebbe andare bene, giusto, usando il remap?

2 Mi Piace

Probabilmente sì. Puoi citare le cose usando gli accenti gravi come questo

`<p>`

o

`<p>`
2 Mi Piace

FWIW @koen360

Quando abbiamo migrato il nostro forum, abbiamo avuto innumerevoli problemi di questo tipo relativi a bbcode e tag, provenienti da quasi due decenni di post del forum.

Non abbiamo utilizzato la funzione rake remap per questi casi e, in tutti i casi, abbiamo usato la tecnica che @pfaffman descrive nel suo frammento di codice:

Questo frammento di codice sopra, che utilizza gsub(), riassume uno dei modi migliori per pulire i post grezzi dopo (o, meglio ancora, durante) la migrazione.

Assicurati di testare le tue espressioni REGEX PRIMA di implementarle effettivamente sul DB e di avere un backup completo prima di eseguire operazioni di questo tipo direttamente sul tuo DB.

1 Mi Piace

Ciao, di seguito il contenuto del mio script script/cleanup.rb che avvio con: RAILS_ENV=development bundle exec ruby script/cleanup.rb

Contenuto del file:

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"

Ho provato a eseguire rake posts:rebake, che ha rigenerato 1757 post. Lo script invece scorre solo 1712 post, ovvero quelli importati con i tag HTML, mentre il resto sono nuovi post creati in Discourse.

Penso di essere quasi arrivato alla soluzione, ma quando ispeziono il contenuto raw nell’interfaccia utente continuo a vedere tutti i tag HTML.

Ho provato a riavviare l’ambiente e a rilanciare Unicorn, ma senza successo. Così vicino… così vicino ;o)

2 Mi Piace

Hai testato la tua espressione regolare da qualche parte? Fai un post alla volta per assicurarti che il testo grezzo sia stato modificato?

1 Mi Piace

Ho usato il tuo suggerimento rubular e ora regexr.com, vedi lo screenshot qui sotto. Per ora mi sono limitato ai tag p e r e li sto sistemando prima di aggiungere quelli più complessi.

2 Mi Piace

Quando ho aggiunto un’istruzione put al mio piccolo cleanup.rb per stampare il contenuto grezzo del post sulla riga di comando, ho notato che non venivano stampati affatto tag HTML.

Tuttavia, quando modifico un post, vedo quanto segue, con i tag HTML sul lato destro. Questa non sembra essere la situazione normale, perché quando torno a modificare il post che sto attualmente modificando, non vedo i tag HTML…

Qualcuno ha un’idea?

1 Mi Piace

Quella gsub ha bisogno di una ‘g’ dopo la ‘/i’ per abbinare più tag. Ma se ciò che vedi nel tuo puts è diverso da ciò che vedi dopo l’esecuzione dello script, allora non ho una spiegazione.

1 Mi Piace

Strano, ottengo:

script/cleanup.rb:9: opzione di espressione regolare sconosciuta - g

quando aggiungo g alla i in questo modo:

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 Mi Piace

Come ricordo (ed è così che generalmente facciamo corrispondere le righe multiple usando gsub…), una REGEX Ruby multilinea richiede m:

/./m - Qualsiasi carattere (il modificatore m abilita la modalità multilinea)

Vedi:

Spero ti sia utile.

1 Mi Piace

Grazie, ha funzionato dal lato dell’espressione regolare.

Sembra esserci qualcosa che non riesco a spiegare con questo script:

# Esegui in questo modo:
# 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 "ciclo completato su #{pm} post"
  1. dopo averlo eseguito alcune volte, cleanup.log continua a contenere 10 istanze di <p> in circa 21.000 righe di materiale grezzo dei post. Stranamente, questi non vengono mai rimossi.
  2. ancora più strano (per me) è che, quando avvio unicorn e accedo al sito dal mio computer locale, vedo ancora i tag HTML in tutti i post che controllo nella vista grezza dell’editor.

Sembra che non stia guardando lo stesso ambiente, forse? Unicorn punta a un ambiente di produzione locale mentre il mio script applica le modifiche a quello di sviluppo?

Sto cercando di far funzionare tutto usando l’ambiente di sviluppo seguendo la guida Docker in locale prima di passare al sito live.

Deve esserci qualcosa di basilare che sto trascurando, da principiante. :sweat_smile:

1 Mi Piace