#!/home/moi/Memoires/venv/bin/python # de docx ou odt ver LaTeX # import sys,pypandoc,os,re,subprocess,yaml,hashlib #--------------------------------------------- #sys.path.append(f"{os.getcwd()}/..") sys.path.append("/home/moi/Memoires/progs") from memmod import * import parsebib #---- def fancyshort(s,t): # restreindre le texte de fancyhead (s est le nom, t le titre, # qu'il faut éventuellement racourcir pour qu'il tienne sur une seule # ligne. # # s (le nom de l'orateur, par exemple) est toujours affiché. # t est éventuellement raccourci. # # NOTE : ne devrait plus être utile, car on définira plutôt # ---- un "titre court" # limit =75 #taille max en caratères if len(s+t)limit: tl.pop() return s, " ".join(tl)+"\\ldots"# pointillés à la fin. def star_sec(l): # \section est transformée en \section* et on ne garde comme argument # que ce qui est nécessaire. it=iter(L) ret=[] passed= False for x in it: if "begin{document" in x: passed= True if passed and "section[" in x: s=x while "label" not in x: x=next(it) s=s+" "+x if not "}" in s: x=next(it) s=s+x k=s.find("]") r=(s[:k]+"}").replace("[","*{")+" " ret.append(r) ret.append("\n") else: ret.append(x) return ret #--------------------------------------------------------------------- # if "--help" in sys.argv: print("options:") print(" nocompile") print(" citeall") sys.exit(0) # ligne de command [nocompile] # # nocompile pour ne pas compiler # # compile= not "nocompile" in sys.argv # # Tout citer, si citeall sur la ligne de commade # (et biblio defini dans data.yml): citeall = "citeall" in sys.argv if input(f"\nParamètres : {sys.argv[1:]}. Continuer(o/n) ?")!="o": sys.exit() #----------------------------------------------------------------------- # Construire le titre à partir du fichier data.yml. #----------------------------------------------------------------------- #---clés du fichier data.yml data_yml_mandatory_keys=['fichier', 'date', 'auteur', 'titre'] data_yml_order=['date','type','auteur','statut','titre'] # with open("data.yml") as f: lt=yaml.safe_load(f) print("data_yml lu") # on vérifie que le fichier "data.yml" est correct: for x in data_yml_mandatory_keys: #vérifier la présence des clés obligatoires if not x in lt.keys(): raise Exception(f"\n\n Il manque la clé {x} dans data.yml\n\n") # si statut est défini, type doit l'être aussi: if "statut" in lt.keys(): # membre t=itulaire, correspondant, d'honneur... if "type" not in lt.keys(): raise Exception(f"\n\n statut est défini, mais pas type\n\n") # add_virgule = True else: # si statut n'est pas défini, on le définit à " " et type à "Conférence". add_virgule =False lt["statut"]=" " if "type" not in lt.keys(): lt["type"]="Conférence" print("data.yml analysé") # ---les paramètres: auteur= lt["auteur"] titre= lt["titre"] #label=dolabel(auteur,titre) if add_virgule: auteur=auteur+"," lt["auteur"] = auteur # biblio ? has_bib= "biblio"in lt.keys() if has_bib: bibfile= lt["biblio"] if citeall: parsebib.parsebib(bibfile) elif citeall: raise Exception("citeall, mais pas de fichier .bib décrit dans data.yml") #------------------------------------------------- # # le fichier (docx, odt) qu'on va traiter: # fich=lt["fichier"].strip() # # fabriquer le titre à partir des données yml # titre_elements="}{".join([lt[x].replace("\n","") for x in data_yml_order]) s,t=fancyshort(lt['auteur'],lt['titre']) # #-------------------------------------------------------------------- template=sys.path[0]+"/tpl.tex" # le template #--------------------------------------------------------------------- exten=fich.split(".")[-1] # # Traitement du fichier source # --------------------------- if exten=="docx" or exten=="odt": futurTex= fich.replace(exten,"tex") else: s=f"\n{fich} : extension incorrecte" raise Exception(s) #répertoire pour les images images= fich.split(".")[0]+"-media" print("Répertoire des images : ",images) if not os.path.isdir(images): os.mkdir(images) # # conversion en latex # extra_args= ["-s",f"--template={template}",f"--extract-media={images}"] #extra_args= ["-s",f"--template={template}",f"--extract-media={images}", # f"--lof=true"] L = pypandoc.convert_file(fich, 'tex', extra_args=extra_args).splitlines() #----------------------------------------------------------------------- # section -> section* rechsec= r"section[{\[]" rechsecc=re.compile(rechsec) # pour modifier le latex en changeant le chemin vers les images. if exten=="docx": rechgra=r"includegraphics\[.*\]{media.*}" repPath=("media",f"{images}/word/media") elif exten=="odt": rechgra=r"includegraphics\[.*\]{Pictures.*}" repPath=("Pictures",f"{images}/Pictures") rechgrac=re.compile(rechgra) # # On crée le fichier LaTex # with open(futurTex,"w") as f: L1=star_sec(L) rp0,rp1= repPath for l in L1: if has_bib and "addbibresource{}" in l: l=l.replace("{","{"+bibfile) while (q:=rechgrac.search(l)) != None: l=l.replace(rp0,rp1) l=treatline(l) # if "@@fin" in l: if has_bib: f.write("\\section*{Bibliographie}") if citeall: f.write(nocite_all(bibfile)+"\n") f.write("\\printbibliography[heading=none]\n") f.write("\\FloatBarrier\n") f.write("\\end{refsection}\n") f.write(l) f.write("\n") if "@@debut" in l: f.write("\\begin{refsection}\n") f.write("\\fancyhead{}\n") f.write("\\fancyhead[CE]{Mémoires: 2\\ieme{} partie}\n") # f.write("\\input{titre}")# fabriqué par makeTitre # # #---fin d'éciture du fichier tex # # lualatex, 2 fois si pas de bib, 3 fois + biber sinon: # if compile: subprocess.run(["/usr/bin/lualatex", futurTex]) if has_bib: subprocess.run(["/usr/bin/biber", futurTex.replace(".tex","")]) subprocess.run(["/usr/bin/lualatex", futurTex]) subprocess.run(["/usr/bin/lualatex", futurTex]) #--- fin