#-*-coding:utf8-*- import re import Image as im from os import listdir, system class Latex2wiki: def __init__(self, fichier_latex): self._compteur_image = 0 self._fichier_latex = fichier_latex #Récupération du fichier fichier = open(fichier_latex).read() # Traduction des sections fichier = re.sub(r'\\section{(?P.*?)}','! \g', fichier) # Traduction des sous-sections fichier = re.sub(r'\\subsection{(?P.*?)}','!! \g', fichier) # Traduction des sous-sous-sections fichier = re.sub(r'\\subsubsection{(?P.*?)}','!!! \g', fichier) # Traduction des paragraphes fichier = re.sub(r'\\paragraph{(?P.*?)}','!!!! \g', fichier) # Traduction des emphases fichier = re.sub(r'{\\em (?P.*?)}',"''\g''", fichier) fichier = re.sub(r'\\emph{(?P.*?)}',"''\g''", fichier) # Suppression des indexes fichier = re.sub(r'\\index{(?P.*?)}',"", fichier) # Traduction des définitions fichier = re.sub(r'\\begin{Def}\[(?P.*?)\]', "----\n'''''Définition (\g)'''''\n", fichier) fichier = re.sub(r'\\end{Def}',"----", fichier) # Traduction des théorèmes fichier = re.sub(r'\\begin{Th}\[(?P.*?)\]', "\n----\n----\n'''''Théorème (\g)'''''\n", fichier) fichier = re.sub(r'\\begin{Th}', "\n----\n----\n'''''Théorème '''''\n", fichier) fichier = re.sub(r'\\end{Th}',"----\n----\n", fichier) # Traduction des exercices fichier = re.sub(r'\\begin{Exo}\n*', "----\n'''''Exercice :''''' ", fichier) fichier = re.sub(r'\\end{Exo}',"----", fichier) fichier = re.sub(r'\\textit{\\underline{Réponses? :}}', "'''''Réponse :''''' ", fichier) # Traduction des remarques fichier = re.sub(r'\\begin{Rem}\n',"'''''Remarque :''''' ", fichier) fichier = re.sub(r'\\end{Rem}\n',"", fichier) # Traduction des preuves fichier = re.sub(r'\\begin{Pre}\n',"'''''Preuve :''''' ", fichier) fichier = re.sub(r'\\end{Pre}\n',"", fichier) # Traduction des notations fichier = re.sub(r'\\begin{Notation}\n',"'''''Notation: ''''' ", fichier) fichier = re.sub(r'\\end{Notation}\n',"", fichier) # Traduction des exemples fichier = re.sub(r'\\begin{Ex}',"----\n'''''Exemple :''''' ", fichier) fichier = re.sub(r'\\end{Ex}',"----", fichier) # Suppression des noindent, newpage fichier = re.sub(r'\\noindent',"", fichier) fichier = re.sub(r'\\newpage',"", fichier) # Suppression des espaces en début de ligne fichier = re.sub(r'\n *',"\n", fichier) # Suppression des commentaires fichier = re.sub(r'%.*\n',"", fichier) # Traduction des À fichier = re.sub(r"\\`A","À", fichier) # Traduction des É fichier = re.sub(r"\\'E","É", fichier) fichier = re.sub(r"\\oe{}","œ", fichier) # Les énumérations fichier = re.sub(r'(\\begin{enumerate}(.|\n)*?\\end{enumerate})', self._enumerate, fichier) fichier = fichier.replace('\\begin{enumerate}','') fichier = fichier.replace('\\end{enumerate}','') # Les puces fichier = re.sub(r'(\\begin{itemize}(.|\n)*?\\end{itemize})', self._itemize, fichier) fichier = fichier.replace('\\begin{itemize}','') fichier = fichier.replace('\\end{itemize}','') # Les center fichier = re.sub(r'\\begin{center}\n', "%center% ", fichier) fichier = re.sub(r'\\end{center}\n', "", fichier) # Les pictures fichier = re.sub(r'\\includegraphics(\[scale=\d(\.\d)?\])?{(?P.*?)}',self._images_include, fichier) fichier = re.sub(r'\\includegraphics(\[scale=\d(\.\d\d)?\])?{(?P.*?)}',self._images_include, fichier) fichier = re.sub(r'\\unitlength = \d(\.\d*)? *mm\n', "", fichier) fichier = re.sub(r'\\begin{picture}(?:(.|\n)*?)\\end{picture}', self._images, fichier) fichier = re.sub(r'%center%[ \n]*Attach',"%center% Attach", fichier) # Les descriptions fichier = re.sub(r'\n*\\item', "\n\\item", fichier) fichier = re.sub(r'\\begin{description}(.|\n)*?\\end{description}', self._description, fichier) # La fin fichier = re.sub(r'\\gsaut\n\\centerline{\\x{Fin du Chapitre}}', "", fichier) # Les footnote fichier = re.sub(r'\\footnote{(.|\n)*?}', "", fichier) # Quelques symboles fichier = re.sub(r'\\varnothing', "∅", fichier) fichier = re.sub(r'\\cal', "\\mathcal", fichier) fichier = re.sub(r'\\mathcal{T}', "T", fichier) fichier = re.sub(r'\\mathcal{A}', "A", fichier) fichier = re.sub(r'\\mathcal{P}', "P", fichier) fichier = re.sub(r'\\{', "{", fichier) fichier = re.sub(r'\\}', "}", fichier) # Les tableaux fichier = re.sub(r'\$\$[ \n]*\\begin{array}(.|\n)*?\\end{array}[ \n]*\$\$' , self._tableau, fichier) # Les tabular fichier = re.sub(r'\\begin{tabular}(.|\n)*?\\end{tabular}' , self._tabular, fichier) # Les matrices fichier = re.sub(r'\$\$(.|\n)*?\$\$', self._matrice, fichier) # Ajout de l'en-tête fichier = '----\n(:toc:)\n'+fichier # Quelques suppressions et remplacements fichier = re.sub(r'\\scriptsize\n', "", fichier) fichier = re.sub(r'\\normalsize\n', "", fichier) fichier = re.sub(r'\\medskip', "", fichier) fichier = re.sub(r'\\bigskip', "", fichier) fichier = re.sub(r'\\dfrac', "\\frac", fichier) fichier = re.sub(r'\\"i', "ï", fichier) fichier = re.sub(r'\\"o', "ö", fichier) fichier = re.sub(r'\\"u', "ü", fichier) fichier = re.sub(r'\\-', "", fichier) fichier = re.sub(r'{}-', "-", fichier) fichier = re.sub(r'\\hdots', "", fichier) fichier = re.sub(r'\.\\\\', '.', fichier) fichier = re.sub(r'\\unitlength *= *\d(\.\d)? *mm', "", fichier) fichier = re.sub(r'\n\n\n*', "\n\n", fichier) fichier = re.sub(r'%center% *\n*', "%center% ", fichier) # Les guillemets fichier = re.sub(r'\\og', "«", fichier) fichier = re.sub(r'\\fg{}', "»", fichier) # Sauvegarde fichier_wiki = open(fichier_latex.split('.')[0]+'.wiki','w') fichier_wiki.write(fichier) fichier_wiki.close() def _tableau(self, M): tab = re.sub(r'\\begin{array}','',M.group()) tab = re.sub(r'\\end{array}','',tab) tab = re.sub(r'\n', "", tab) tab = re.sub(r'\$','',tab) motif = re.match(r'{(.*?)}',tab) motif = motif.group().replace('{','').replace('}','') motif = re.split(r'([rlc])',motif) motif = [k for k in motif if k != ''] tab = re.sub(r'{[rlc|]*?}','',tab) tab = re.sub(r'\\hline', '', tab) tab = re.sub(r'\\\\', '\n', tab) tab = re.sub(r'^ (?P.+?)','\g', tab) tab = re.sub(r'\n +','\n', tab) tab2 = '\n|| border=1 align=center\n' for k in tab.split('\n'): cpt = 0 m = re.split('&',k) #print k,m if m != ['']: tab2 += '|| ' for l in range(len(motif)): if motif[l] in 'rlc': try: tab2 += '$'+m[cpt]+'$' except: raise ValueError(m) cpt += 1 j = l+1 if j < len(motif): if motif[j] in 'rlc': tab2 += ' || ' else: if cpt != 0 and cpt != len(m): tab2 += ' || ' tab2 += ' ||\n' #print tab2 return tab2 def _tabular(self, M): tab = re.sub(r'\\begin{tabular}','',M.group()) tab = re.sub(r'\\end{tabular}','',tab) tab = re.sub(r'\n', "", tab) tab = re.sub(r'\$','',tab) motif = re.match(r'{(.*?)}',tab) motif = motif.group().replace('{','').replace('}','') motif = re.split(r'([rlc])',motif) motif = [k for k in motif if k != ''] tab = re.sub(r'{[rlc|]*?}','',tab) tab = re.sub(r'\\hline', '', tab) tab = re.sub(r'\\\\', '\n', tab) tab = re.sub(r'^ (?P.+?)','\g', tab) tab = re.sub(r'\n +','\n', tab) tab2 = '\n|| border=1 align=center\n' for k in tab.split('\n'): cpt = 0 m = re.split('&',k) #print k,m if m != ['']: tab2 += '|| ' for l in range(len(motif)): if motif[l] in 'rlc': try: tab2 += '$'+m[cpt]+'$' except: raise ValueError(m) cpt += 1 j = l+1 if j < len(motif): if motif[j] in 'rlc': tab2 += ' || ' else: if cpt != 0 and cpt != len(m): tab2 += ' || ' tab2 += ' ||\n' #print tab2 return tab2 def _matrice(self, M): if 'left' in M.group(): return re.sub(r'\n','',M.group()) else: return M.group() def _description(self, M): desc = M.group().replace('\\begin{description}','').replace('\\end{description}','') liste = [ k.replace(':','') for k in re.split(r'\\item(?P\[.*?\]{1}?)',desc) if k != '\n'] return ''.join([k.replace('[',':').replace(']',':') for k in liste]) def _enumerate(self, M): #desc = M.group().replace('\\begin{enumerate}','').replace('\\end{enumerate}','') return re.sub(r'\\item','#',M.group()) def _itemize(self, M): #desc = M.group().replace('\\begin{itemize}','').replace('\\end{itemize}','') return re.sub(r'\\item','*',M.group()) def _images_include(self, M): nom = M.group().split("{")[1].replace('}','') if '/' not in nom: nom = '/'+nom if 'eps' not in nom: nom += '.eps' try: dd = im.open(nom.split('/')[1]) dd.save(nom.split('/')[1].split('.')[0]+'.jpg') return "Attach:"+nom.split('/')[1].split('.')[0]+'.jpg' except: print "Erreur avec : ",nom def _images(self, M): nom = self._fichier_latex.split('.')[0]+str(self._compteur_image) dd = open(nom+'.tex','w') self._compteur_image += 1 dd.write('\\documentclass[11pt]{report}\n\\usepackage{gastex}\n') dd.write('\\usepackage{nopageno}\n\\begin{document}') dd.write(M.group()) dd.write('\\end{document}') dd.close() system('latex '+nom+'.tex') system('dvips '+nom+'.dvi') #system('convert '+nom+'.ps '+nom+'.jpg') for k in listdir('.'): if k.startswith(nom) and not k.endswith('ps'): system('rm '+k) dd = im.open(nom+'.ps') dd.save(nom+'.jpg') dd = im.open(nom+'.jpg') dd = dd.convert(mode = '1') # On enlève le blanc X, Y = [], [] for x in range(dd.size[0]): for y in range(dd.size[1]): if dd.getpixel((x,y)) != 255: X.append(x) Y.append(y) boite = [min(X)-5, min(Y)-5, max(X)+5, max(Y)+5] dd.crop(boite).save(nom+'.jpg') system('rm '+nom+'.ps') return "Attach:"+nom+".jpg" if __name__ == '__main__': for fichier in listdir('.'): if '.tex' in fichier: Latex2wiki(fichier)