conversion-mediawiki-to-bbcode.py

Cet article a été mis à jour, vous consultez ici une archive de cet article!
version 3.8.1

# Ce programme python contient dans le meme repertoire :
# texte a convertir.txt : le code mediawiki a traduire
# texte converti.txt : le bbcode cms obtenu après exécution du script

B=[]

#tableaux
B =B + ['[table style=" ','"]','<table','>']
B =B + ['[row]','','<tr>','']
B =B + ['[/row]','','</tr>','']
B =B + ['[col]','','<td>','']
B =B + ['[col style=" ','"]','<td ','>']
B =B + ['[/col]','','</td>','']
B =B + ['width: ',';','width="','"']
B =B + ['border-spacing: ','; ','border="','"']
B =B + ['margin: ','; ','cellspacing="','"']
B =B + ['padding: ','; ','cellpadding="','"']

B =B + ['','', '<div align="center">', '']# alignement déjà au centre par defaut
B =B + ['','', '<div align="right">', '']# non-géré !
B =B + ['','', '<div align="left">', '']# non-géré !
B =B + ['','','</div>','']# inutile

B =B + ['[/table]','','</table>','']

# termes non-geres, a eliminer

B =B + ['', '', '<br/>', ''] # ? saut de ligne ?
B =B + ['', '', '[[Catégorie:', ']]'] # + supprimer le texte associe

B =B + ['', '', '<Gallery>', '']
B =B + ['', '', '</Gallery>', '']

B =B + ['', '', '|frameless', '']

# Le cas des miniatures
B =B + ['[/img]', '', '|thumb|', ']]' ]
B =B + ['[img]/upload/mw_images/', '', '[[Image:', '']
B =B + ['', '', '|thumb', '']

# voir pour faire [img style="max-width: 150px;"]/upload/mw_images/...[/img]

B =B + ['', '', '|left', '']
B =B + ['', '', '|none', '']

B =B + ['', '', '{|', '']
B =B + ['', '', '|}', '']

B =B + ['', '', '|500px', ''] # Réglage img à dégager
B =B + ['', '', '|450px', ''] # Réglage img à dégager
B =B + ['', '', '|300px', ''] # Réglage img à dégager
B =B + ['', '', '|200px', ''] # Réglage img à dégager
B =B + ['', '', '|150px', ''] # Réglage img à dégager


B =B + [' ', '', '*', ''] # Suppression les puces mw

# plan du texte
B =B + [' ----- ', '', '=====', ''] # Toujours la plus longue chaine en 1er
B =B + [' ---- ', '', '====', ''] # pour éviter la recursivite
B =B + [' --- ', '', '===', '']
B =B + [' -- ', '', '==', '']
B =B + ['-- ', '', '-- ', ''] # mise en forme des
B =B + [' --', '', ' --', ''] # chapitres(un seul espace avant/après)

#divers
B =B + ['
Code :
', '
', '<nowiki>', '</nowiki>']
B =B + ['[youtube=560,315]https://www.youtube.com/watch?v=', '[/youtube]', '[https://www.youtube.com/watch?v=', ' Voir la vidéo]']
B =B + ['[dm]', '[/dm]', '[https://www.dailymotion.com/video/', ' Voir la vidéo]']
B =B + ['[vimeo]', '[/vimeo]', '[https://vimeo.com/', ' Voir la vidéo]']
B =B + ['[size=', ']', '<p style="font-size:', ';">']
B =B + ['[/size]', '', '</p>', '']
B =B + ['
Citation :
', '', '<blockquote>', '']
B =B + ['
', '', '</blockquote>', '']

#styles gras, italique souligne
B =B + ['', '','<b>','']
B =B + ['', '','<i>','']
B =B + ['', '','<u>','']
B =B + ['
', '','</b>','']
B =B + ['
', '','</i>','']
B =B + ['', '','</u>','']
B =B + ['', '', "'''", "'''"]
B =B + ['', '', "''", "''"]
B =B + ['', '', '<u>', '</u>']

#couleurs
B =B + ['[color=#', ']', '<span style="color:#', ';">']
B =B + ['[/color]', '', '</span>', '']

#smileys
B =B + [':D', '', '[[image:icon_biggrin.gif]]', '']
B =B + [':)', '', '[[image:icon_smile.gif]]', '']
B =B + [':(', '', '[[image:icon_sad.gif]]', '']
B =B + [':shock:', '','[[image:icon_eek.gif]]', '']
B =B + ['8)', '', '[[image:icon_cool.gif]]', '']
B =B + [':lol:', '', '[[image:icon_lol.gif]]', '']
B =B + [':mad:', '', '[[image:icon_mad.gif]]', '']
B =B + [':P', '', '[[image:icon_razz.gif]]', '']
B =B + [':oops:', '', '[[image:icon_redface.gif]]', '']
B =B + [':o', '', '[[image:icon_surprised.gif]]', '']
B =B + [':cry', '', '[[image:icon_cry.gif]]', '']
B =B + [':evil:', '', '[[image:icon_evil.gif]]', '']
B =B + [':twisted:', '', '[[image:icon_twisted.gif]]', '']
B =B + [':roll:', '', '[[image:icon_rolleyes.gif]]', '']
B =B + [':wink:', '', '[[image:icon_wink.gif]]', '']
B =B + [':!:', '', '[[image:icon_exclaim.gif]]', '']
B =B + [' :???: ', '', '[[image:icon_confused2.gif]]', '']
B =B + [':?:', '', '[[image:icon_question.gif]]', '']
B =B + [':?', '', '[[image:icon_confused.gif]]', '']
B =B + [':idea:', '', '[[image:icon_idea.gif]]', '']
B =B + [':arrow:', '', '[[image:icon_arrow.gif]]', '']
B =B + [':|', '', '[[image:icon_neutral.gif]]', '']
B =B + [':mrgreen:', '', '[[image:icon_mrgreen.gif]]', '']
B =B + [':hang:', '', '[[image:icon_hangloose.gif]]', '']
B =B + [':/: ', '', '[[image:icon_unhappy.gif]]', '']
B =B + [' :zyeuxkipic: ', '', '[[image:icon_exorbite.gif]]', '']
B =B + [' :help ', '', '[[image:icon_helpme.gif]]', '']
B =B + [' :love ', '', '[[image:icon_love.gif]]', '']
B =B + [' :mdr-f ', '', '[[image:icon_mdr-f.gif]]', '']
B =B + [' :bravo ', '', '[[image:icon_bravo.gif]]', '']
B =B + [' :tongue ', '', '[[image:icon_tongue.gif]]', '']
B =B + [' :jmincline ', '', '[[image:icon_remarquable.gif]]', '']
B =B + [' :gna: ', '', '[[image:icon_neztourne-f.gif]]', '']
B =B + [' :excitee: ', '', '[[image:icon_excitee.gif]]', '']
B =B + [' :ptdr ', '', '[[image:icon_ptdr.gif]]', '']
B =B + [' :pong ', '', '[[image:icon_pong.gif]]', '']
B =B + [' :meaculpa ', '', '[[image:icon_mea-culpa.gif]]', '']
B =B + [' :top: ', '', '[[image:icon_top.gif]]', '']
B =B + [' :dcroises ', '', '[[image:icon_jcroiselesdoigts.gif]]', '']
B =B + [' :respect ', '', '[[image:icon_respect.gif]]', '']
B =B + [' :hangf: ', '', '[[image:icon_hangloose-f.gif]]', '']
B =B + [' :sante ', '', '[[image:Icon_ahoy.gif]]', '']
B =B + [' :tchin ', '', '[[image:Icon_tchin.gif]]', '']
B =B + [' :ahyo ', '', '[[image:Icon_ahoy2.gif]]', '']
B =B + [' :joke ', '', '[[image:icon_joke.gif]]', '']
B =B + [' :cartonjaune: ', '', '[[image:Icon_foot-carton-jaune.gif]]', '']
B =B + [' :cartonrouge ', '', '[[image:Icon_foot-carton-rouge.gif]]', '']
B =B + [' :nrv ', '', '[[image:icon_nrv.gif]]', '']
B =B + [' :furax ', '', '[[image:icon_furax.gif]]', '']
B =B + [' :idea ', '', '[[image:icon_idea2.gif]]', '']
B =B + [' :wtf ', '', '[[image:icon_wtf.gif]]', '']
B =B + [' :think ', '', '[[image:icon_think.gif]]', '']
B =B + [' :cramer ', '', '[[image:Icon_Cramer.gif]]', '']
B =B + [' :CramerJ ', '', '[[image:Icon_CramerJ.gif]]', '']
B =B + [' :merci ', '', '[[image:Icon_pancarte-merci.gif]]', '']
B =B + [' :+1: ', '', '[[image:Icon_pancarte-plus1.gif]]', '']
B =B + [' :poups ', '', '[[image:Icon_pancarte-oops.png]]', '']
B =B + [' :tusort ', '', '[[image:Icon_pancarte-tusort.gif]]', '']
B =B + [' :tgenial ', '', '[[image:icon_tgenial.gif]]', '']
B =B + [' :upup ', '', '[[image:Icon_pancarte-upup.gif]]', '']
B =B + [' :gne? ', '', '[[image:Icon_pancarte-gne.gif]]', '']
B =B + [' :bienvwenue: ', '', '[[image:Icon_bienvwenue.gif]]', '']
B =B + [' :vatependre ', '', '[[image:Icon_pancarte-va-te-pendre.gif]]', '']
B =B + [' :fuck ', '', '[[image:Icon_pancarte-fuck.gif]]', '']
B =B + [' :dejadehors ', '', '[[image:Icon_pancarte-deja-dehors.gif]]', '']
B =B + [' :heh-hee:', '', '[[image:icon_heh-hee.gif]]', '']

#images
B =B + ['[img]/upload/mw_images/', '[/img]', '[[image:', ']]'] # balise image "classique"
B =B + ['[img]/upload/mw_images/', '[/img]', 'image:', '|'] # le cas particulier gallery : pas de [[ mais separateurlien externe

#Fichier
B =B + ['[img]/upload/mw_images/', '[/img]', '[[Fichier:', ']]']

B =B + ['[img]/upload/mw_images/', '[/img]','[img]/upload/mw_images/',']]']


#lien externe
B =B + ['[url]http', '[/url]', '[http', ']']


#lien interne
B =B + ['[link]', '[/link]', '[[', ']]']

# conversion des caracteres speciaux
H=[]

H=H+[' ','_'] #supprimer espaces
H=H+[':','_']
H=H+[',','_']
H=H+[';','_']


H=H+['à','a']
H=H+['â','a']
H=H+['ä','a']

H=H+['ç','c']

H=H+['é','e']
H=H+['è','e']
H=H+['ê','e']
H=H+['ë','e']

H=H+['ï','i']
H=H+['î','i']

H=H+['ô','o']
H=H+['ö','o']

H=H+['ù','u']
H=H+['û','u']
H=H+['ü','u']


H=H+['__','_'] # suppression des
H=H+['__','_'] # espaces multiples


#try: (pas utilise pour debug)
if 1==1:
# la conversion peut commencer !
destination = open('texte converti.txt', "w")

with open('texte a convertir.txt','r')as source:
nblignevide=0
for ligne in source:
A=(ligne.strip('\n'))
if A=='':
nblignevide= nblignevide +1
else:
nblignevide =0

# recherche mots clé
for i in range(0,len(B),4):
for j in range(0,10):
C=A.lower().find(B[i+2].lower()) # 1er mot cle (insensible a la casse)
if C<0: # introuvable dans cette ligne :
break # abandon

if len(B[i+3])>0:
D=A.lower().find(B[i+3].lower(),C+len(B[i+2])) # 2e mot cle présent ?
else:
D=-1
if D<0: #un seul remplacement ?
A=A[:C]+B[i]+A[C+len(B[i+2]):]
else: # 2 remplacements
A=A[:C]+B[i]+A[C+len(B[i+2]):D]+B[i+1]+A[D+len(B[i+3]):]
C=C+len(B[i])
D=D+len(B[i])-len(B[i+2]) # Mots clé remplacés. Ils contiennent une chaîne entre C et D


# Cas particuliers
if B[i+2]=='[[Catégorie:':
A=A[:C]+ A[D:] #supprimer les catégories

if B[i+1]=='[/url]' or B[i+1]=='[/link]' or B[i+1]=='[/img]': #recherche lien (separateur + texte)
if B[i+1]=='[/url]':
S=' ' # separateur lien externe
else:
S='|' # separateur lien interne

E=A.find(S,C) # rechercher le separateur lien/texte

if E<0 and B[i+1]=='[/link]': # pas de texte associe au lien interne ? il-apparaitrait-comme-ca-pas-beau
G='|'+A[C:D] # on duplique le texte du lien
F=G.replace('_',' ') # supprimer les _ du texte pour la lisibilite
A=A[:D]+F+A[D:]

E=D # actualiser position du |separateur
D=D+len(F) # actualiser longueur de chaîne

if E>0 and E<(D): # si le texte alternatif existe
A=A[:C-5]+'='+A[C-4:]# remplacer [ par =
A=A[:E]+']'+A[E+1:]# remplacer espace par ]
D=E
print (A)
# formater le lien interne : en minuscules, ni espace ni accents
if S=='|':
G=A[C:D]
F=G.strip(" ") # supprimer espaces parasites eventuels

for k in range(0,len(H),2):
G=F.replace(H[k],H[k+1]) # liste des modifs voir la table 'H = H + ...' plus haut
F=G

if B[i+1]=='[/link]': #liens internes:
G=F.lower() # en minuscules
F=G.replace('_','-') # tiret remplace underscore

A=A[:C] + F + A[D:]

if nblignevide< 2:
destination.write(A+"\n")
#print (A)
destination.close()
print('Conversion terminée !')
print('Le résultat de la conversion se trouve dans le fichier suivant :')
print('"texte converti.txt"')
print

#except:
if 1==0:
if 1==0:
print('Le fichier à traiter:')
print('"texte a convertir.txt"')
print('est introuvable. Il doit être dans le même répertoire que ce programme !')
print
else:
print(Exception)



Note à l'attention des visiteurs,

Le wiki est un travail de compilation d'expériences des membres du forum t4zone.info . Par conséquent nous incitons vivement nos visiteurs à ne pas simplement copier le contenu pour le publier sur d'autres forums ou réseaux sociaux. Proposer un lien, c'est facile et gratifiant pour les auteurs des tutoriels ainsi que pour les personnes qui maintiennent le wiki en ligne.

Le contenu est diffusé dans un esprit de partage et d'entraide. C'est un travail qui est entrepris depuis plusieurs années et les pages sont sujettes à modifications.

L’oeuvre est diffusée avec une licence de paternité et doit être rediffusée sous les mêmes termes en citant sa source.