| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!/home/moi/ProtoMemoires/venv/bin/python
- # de docx ou odt ver LaTeX
- #
- import sys,pypandoc,os,re,subprocess,yaml,hashlib
- #---------------------------------------------
- sys.path.append(f"{os.getcwd()}/..")
- from memmod import *
- #----
- 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.
- #
- limit =75 #taille max en caratères
- if len(s+t)<limit:
- return s,t
- else:
- tl=t.split()
- tl.pop()
- while sum(len(x) for x in tl)>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
- #---------------------------------------------------------------------
- # ligne de command [nocompile]
- #
- # nocompile pour ne pas compiler
- #
- #
- compile= not "nocompile" in sys.argv
- #-----------------------------------------------------------------------
- # 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")
- #lt['statut']=", "+lt["statut"]
- 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:
- if len(lt["biblio"].split()) ==2:
- bibfile= lt["biblio"].split()[0]
- citeall = lt["biblio"].split()[1] == "citeall"
- else:
- bibfile= lt["biblio"]
- citeall=False
- #-------------------------------------------------
- #
- # 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'])
- titre_elements= titre_elements+"}{"+t
- le_titre= f"\\titre{{{titre_elements}}}\n"
- #--------------------------------------------------------------------
- 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:
- #bibfile=lt['biblio']
- 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("\\begin{center}\\textbf{Bibliographie}\\end{center}\n")
- #f.write("\\citeall[\\fullcite]\n")
- 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(f"\\fancyhead[CO]{{{s} {t}}}\n")
- f.write(le_titre)
- f.write(f"\\label{{{label}}}\n")
-
- #
- #---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
|