conversion-mediawiki-to-bbcode.py

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

Code PYTHON :
# 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=[]
 
 
# Suppression de ce qui est conflictuel  
B =B +  ['', '',  '', '----']
B =B +  ['', '',  '', '**']
 
# Conversion temporaire
B =B +  ['-tmp', '',  '*', '']
# Conversion finale
B =B +  ['[*]', '',  '-tmp', '']
 
# Crédits et remerciements
B =B +  ['', '',  "''tuto source'' :" , '']
B =B +  ['', '',  "''Tuto source :''" , ''] # Variante
B =B +  ['', '', 'Source :',  '']
B =B +  ['[style=success]Crédits et remerciements à : ', '[/style]', "''Crédits et remerciements à : ",  "''"]
B =B +  ['[style=success]Crédits et remerciements à : ', '[/style]',"''Crédits et remerciements à", "''"]
B =B +  ['][style=success]Crédits et remerciements à : ', '[/style]' ,  'Post initial :', ']']
 
#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 +  ['', '', '<big>', '']
B =B +  ['', '', '</big>', '']
 
B =B +  ['[/table]','','</table>','']
 
# termes non-geres, a eliminer
 
B =B +  ['', '', '<br/>', ''] # Retour à la ligne
B =B +  ['', '', '[[Catégorie:', ']]'] # + supprimer le texte associe
B =B +  ['', '', '__NOTOC__', ''] 
 
B =B +  ['', '', '<Gallery>', '']
B =B +  ['', '', '</Gallery>', '']
 
B =B +  ['', '', '|frameless', '']
 
B =B +  ['', '', '|left', '']
B =B +  ['', '', '|none', '']
 
B =B +  ['', '', '{|', '']
B =B +  ['', '', '|}', '']
 
 
B =B +  ['', '', ']640px|', ''] # Réglage img à dégager
B =B +  ['', '', '|500px', ''] # Réglage img à dégager
B =B +  ['', '', '|450px', ''] # Réglage img à dégager
B =B +  ['', '', '|400px', ''] # Réglage img à dégager
B =B +  ['', '', ']400px|', ''] # 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
 
 
#couleurs (avant la table des matières pour eviter le conflict du "="
B =B +  ['[color=#', ']', '<span style="color:#', ';">']
B =B +  ['[/color]', '', '</span>', '']
 
 
# 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)
B =B +  [' -- ', ' -- ', '= ', ' ='] # Conversion titre
 
 
#divers
B =B +  ['[code]', '[/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 +  ['[quote]', '', '<blockquote>', '']
B =B +  ['[/quote]', '', '</blockquote>', '']
 
#styles gras, italique souligne
B =B +  ['[b]', '','<b>','']
B =B +  ['[i]', '','<i>','']
B =B +  ['[u]', '','<u>','']
B =B +  ['[/b]', '','</b>','']
B =B +  ['[/i]', '','</i>','']
B =B +  ['[/u]', '','</u>','']
B =B +  ['[b]', '[/b]', "'''", "'''"]
B =B +  ['[i]', '[/i]', "''", "''"]
B =B +  ['[u]', '[/u]', '<u>', '</u>']
 
 
#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 +  [':s', '', '[[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 
 
# Le cas des miniatures
B =B +  ['', '', 'center|', ''] 
B =B +  ['[/img]', '', '|thumb|', ']]' ]
B =B +  ['[img]/upload/mw_images/', '', '[[Image:', '']
B =B +  ['', '', '|thumb', ''] 
B =B +  ['', '', 'thumb|', ''] 
 
 
# voir pour faire [lightbox=/upload/mw_images/...][img style="max-width: 150px;"]/upload/mw_images/...[/img][/lightbox]
 
#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
 
# Reconvertir les erreurs des conversions précédentes
B =B +  ['mw_images', '[/img]','mw_im=ges',']]']
B =B +  ['[link=', ']' , '[=ink]', ']']
B =B +  ['[/img]', '', '][/img]', '']
 
# Le cas des hebergeurs à image cliquables
B =B +  ['[img]', '','[img[/url]','']
B =B +  ['[/img]', '' , '[/img[/img]','']
 
# Crédits et remerciements (le ":" recalcitrant)
B =B +  ['[/style]', '',':[/style]','']
 
#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.