#!/usr/bin/python -O """ Bloggers.it to Movable Type Converter - revisione 20080210 (finalizzato all'importazione in Wordpress) Homepage: http://stm.sottosuolo.org/programmazione/blogstuff/#Bloggers2MovableType Autore: StM - http://stm.sottosuolo.org Licenza d'uso: http://creativecommons.org/licenses/by/3.0/deed.it * Descrizione Script per la conversione di un set di file di export Bloggers.it in un file di export Movable Type, utilizzabile anche per l'import di post, autori, categorie e commenti su Wordpress. * Requisiti per l'esecuzione -Una installazione/runtime di python 2.3 o superiore -Preferibilmente assicurarsi che l'estensione del presente script sia .py * Utilizzo e funzionamento Lo script va invocato specificando come parametro il path della cartella in cui si trovano i file xml del vostro backup/export da Bloggers.it, che verranno elaborati in sequenza. L'output dell'elaborazione e' su standard output, redirezionabile su file. Esempio di invocazione: $ python Bloggers2MovableType.py bloggers.it/basedati/nomeblog/archivio > mt-export.txt L'output e' utilizzabile per l'import in Movable Type, Wordpress, e qualsiasi altra piattaforma che legga il formato Movable Type. """ # ----- configurazione ----- # Se volete conservare la chiusura dei commenti per quei post per cui risulta su Bloggers.it, # impostate questa variabile a 1. Potenzialmente MOLTI post avranno i commenti chiusi, dato # il funzionamento di Bloggers.it, quindi lasciate pure cosi'. importa_chiusura_commenti=0 # Se avete caricato immagini su bloggers.it, vi consiglio di caricarle in Wordpress in una sottocartella # di /wp-content/uploads, e di compilare le due variabili seguenti perche' lo script effettui la # sostituzione automatica delle url dalla posizione su bloggers.it a quella del nuovo blog. # Se non intendete effettuare questa operazione, mettete "" come valore di entrambe le variabili. url_immagini_bloggers="http://www.bloggers.it/obifrankenobi/itcommenti/" url_immagini_destinazione="http://www.obifrankenobi.it/wp-content/uploads/imgbloggers/" # Dovreste poter ignorare il codice da qui in poi, salvo per problemi o esigenze particolari # di character encoding. # ----- codifiche caratteri ----- # codifica caratteri dichiarata nel file xml di export (vedere prima riga, in genere UTF-8) declared_charset_encoding="UTF-8" # codifica caratteri presumibilmente REALE di alcuni file xml di export (per archivi vecchi) real_charset_encoding="ISO-8859-1" # codifica caratteri desiderata per il file di output. UTF-8 e' il default per Wordpress, # ed e' consigliato. wanted_charset_encoding="UTF-8" # Da qui in poi non dovrebbbe essere necessario il vostro intervento # ----- dichiarazioni xml, principale e di fallback ----- xmlencoding='' xmlencoding2='' # ----- import python ----- from xml.dom import minidom from os import listdir import sys import xml import codecs # Definizione del charset encoding di output sys.stdout = codecs.EncodedFile(sys.stdout, real_charset_encoding, wanted_charset_encoding) # ----- funzioni ----- def get_child_value(node, tag): els=node.getElementsByTagName(tag) if els and els.item(0).firstChild: return els.item(0).firstChild.nodeValue.encode(real_charset_encoding) else: return "" def converti_data(dataGGMMAAAA): return dataGGMMAAAA[3:6] + dataGGMMAAAA[0:2] + dataGGMMAAAA [5:] # Verifica che sia stata passata come parametro la cartella dell'archivio if len(sys.argv) != 2: print "Uso: " + sys.argv[0] + " [path_cartella_archivio] > mt-export.txt" sys.exit(1) archive_folder=sys.argv[1] # Scorre i file nella cartella contenente i file dell'archivio for xmlfile in listdir(archive_folder): if not (xmlfile.upper().endswith("XML")): continue xmlfile = archive_folder + "/" + xmlfile xmldoc=None try: # Caso 1: la dichiarazione xml del file e' corretta e il parsing avviene normalmente xmldoc=minidom.parse(xmlfile) except xml.parsers.expat.ExpatError: # Caso 2: il parsing del file xml fallisce, si usa una codifica di fallback xmlstring="" f=open(xmlfile) try: cnt=0 for line in f: if cnt == 0: # Rimpiazzo la dichiarazione xml alla prima riga line=line.replace(xmlencoding, xmlencoding2) xmlstring+=line cnt+=1 finally: f.close() xmldoc=minidom.parseString(xmlstring) # Ottengo e scorro la Nodelist dei post posts=xmldoc.getElementsByTagName("content") for i in xrange(0, posts.length): p=posts.item(i) title=get_child_value(p, "title") author=get_child_value(p, "Autore") date=converti_data(get_child_value(p, "day")) + ' ' + get_child_value(p, "time") + ':00' primary_category=get_child_value(p, "Forum") # Se il post risulta protetto, lo importo come bozza (non esiste altro modo per distinguerlo) status=None if get_child_value(p, "Protetto") == "true": status="draft" else: status="publish" allow_comments='1' if importa_chiusura_commenti==1 and (get_child_value(p, "Commenti") != "true"): allow_comments='0' # elaborazione body body=get_child_value(p, "body") body=body.replace(url_immagini_bloggers, url_immagini_destinazione) # inizio post print "TITLE: " + title print "AUTHOR: " + author print "DATE: " + date print "PRIMARY CATEGORY: " + primary_category print "STATUS: " + status print "ALLOW COMMENTS: " + allow_comments print "-----" print "BODY:" print body print "-----" # commenti comments=p.getElementsByTagName("comments").item(0).getElementsByTagName("element") for j in xrange(0, comments.length): c=comments.item(j) comment_author=get_child_value(c, "Autore") comment_url=get_child_value(c, "urlblog") comment_date=converti_data(get_child_value(c, "day")) + ' ' + get_child_value(c, "time") + ':00' comment_body=get_child_value(c, "body") print "COMMENT:" print "AUTHOR: " + comment_author print "URL: " + comment_url print "DATE: " + comment_date print comment_body print "-----" # fine post print "--------"