| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!./venv/bin/python
- import sys,pypandoc,os,re,subprocess,yaml
- #
- data_yml_mandatory_keys=['fichier', 'date', 'auteur', 'titre']
- 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
- #
- #-----------------------------------------------------------------------
- # Construire le titre à partir du fichier yml.
- #-----------------------------------------------------------------------
- with open("data.yml") as f:
- lt=yaml.safe_load(f)
- 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 {x} dans data.yml\n\n")
- # si statut est défini, type dit l'être aussi:
- if "statut" in lt.keys():
- if "type" not in lt.keys():
- raise Exception(f"\n\n statut est défini, mais pas type\n\n")
- else: # si statut n'est pas défini, on le définit à "" et type à "Conférence".
- lt["statut"]=" "
- lt["type"]="Conférence"
- #
- # 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 lt.keys()
- if x!="fichier"])
- le_titre="\\titre{"+titre_elements+"}"+"\n"
- #--------------------------------------------------------------------
- template="../tpl.tex" # le template
- #---------------------------------------------------------------------
- exten=fich.split(".")[-1]
- 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 tex
- #
- with open(futurTex,"w") as f:
- L1=star_sec(L)
-
- rp0,rp1= repPath
- for l in L1:
-
- while (q:=rechgrac.search(l)) != None:
- l=l.replace(rp0,rp1)
- # on supprime les "quote"
- l=l.replace("\\begin{quote}","")
- l=l.replace("\\end{quote}","")
-
- f.write(l)
- f.write("\n")
-
- if "debut" in l:
- f.write(le_titre)
- #
- #---fin d'éciture du fichier tex
- #
- # lualatex, 2 fois:
- #
- for i in {1,2}:
- subprocess.run(["/usr/bin/lualatex", futurTex])
- #--- fin
|