conversion-mediawiki-to-bbcode.py

version 3.8.8.c

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 +  ['', '', 'class="wikitable"', '']
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
 
 
#Taille du texte 100=100%=taille standard donc suppression avants l'étape #Divers
B =B +  ['', '', '<p style="font-size:100;">','</p>'] 
 
#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)