extr.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #!/home/moi/Memoires/venv/bin/python
  2. # de docx ou odt ver LaTeX
  3. #
  4. import sys,pypandoc,os,re,subprocess,yaml,hashlib
  5. #---------------------------------------------
  6. #sys.path.append(f"{os.getcwd()}/..")
  7. sys.path.append("/home/moi/Memoires/progs")
  8. from memmod import *
  9. import parsebib
  10. #----
  11. def fancyshort(s,t):
  12. # restreindre le texte de fancyhead (s est le nom, t le titre,
  13. # qu'il faut éventuellement racourcir pour qu'il tienne sur une seule
  14. # ligne.
  15. #
  16. # s (le nom de l'orateur, par exemple) est toujours affiché.
  17. # t est éventuellement raccourci.
  18. #
  19. # NOTE : ne devrait plus être utile, car on définira plutôt
  20. # ---- un "titre court"
  21. #
  22. limit =75 #taille max en caratères
  23. if len(s+t)<limit:
  24. return s,t
  25. else:
  26. tl=t.split()
  27. tl.pop()
  28. while sum(len(x) for x in tl)>limit:
  29. tl.pop()
  30. return s, " ".join(tl)+"\\ldots"# pointillés à la fin.
  31. def star_sec(l):
  32. # \section est transformée en \section* et on ne garde comme argument
  33. # que ce qui est nécessaire.
  34. it=iter(L)
  35. ret=[]
  36. passed= False
  37. for x in it:
  38. if "begin{document" in x:
  39. passed= True
  40. if passed and "section[" in x:
  41. s=x
  42. while "label" not in x:
  43. x=next(it)
  44. s=s+" "+x
  45. if not "}" in s:
  46. x=next(it)
  47. s=s+x
  48. k=s.find("]")
  49. r=(s[:k]+"}").replace("[","*{")+" "
  50. ret.append(r)
  51. ret.append("\n")
  52. else:
  53. ret.append(x)
  54. return ret
  55. #---------------------------------------------------------------------
  56. #
  57. if "--help" in sys.argv:
  58. print("options:")
  59. print(" nocompile")
  60. print(" citeall")
  61. sys.exit(0)
  62. # ligne de command [nocompile]
  63. #
  64. # nocompile pour ne pas compiler
  65. #
  66. #
  67. compile= not "nocompile" in sys.argv
  68. #
  69. # Tout citer, si citeall sur la ligne de commade
  70. # (et biblio defini dans data.yml):
  71. citeall = "citeall" in sys.argv
  72. if input(f"\nParamètres : {sys.argv[1:]}. Continuer(o/n) ?")!="o":
  73. sys.exit()
  74. #-----------------------------------------------------------------------
  75. # Construire le titre à partir du fichier data.yml.
  76. #-----------------------------------------------------------------------
  77. #---clés du fichier data.yml
  78. data_yml_mandatory_keys=['fichier', 'date', 'auteur', 'titre']
  79. data_yml_order=['date','type','auteur','statut','titre']
  80. #
  81. with open("data.yml") as f:
  82. lt=yaml.safe_load(f)
  83. print("data_yml lu")
  84. # on vérifie que le fichier "data.yml" est correct:
  85. for x in data_yml_mandatory_keys: #vérifier la présence des clés obligatoires
  86. if not x in lt.keys():
  87. raise Exception(f"\n\n Il manque la clé {x} dans data.yml\n\n")
  88. # si statut est défini, type doit l'être aussi:
  89. if "statut" in lt.keys(): # membre t=itulaire, correspondant, d'honneur...
  90. if "type" not in lt.keys():
  91. raise Exception(f"\n\n statut est défini, mais pas type\n\n")
  92. #
  93. add_virgule = True
  94. else: # si statut n'est pas défini, on le définit à " " et type à "Conférence".
  95. add_virgule =False
  96. lt["statut"]=" "
  97. if "type" not in lt.keys():
  98. lt["type"]="Conférence"
  99. print("data.yml analysé")
  100. # ---les paramètres:
  101. auteur= lt["auteur"]
  102. titre= lt["titre"]
  103. #label=dolabel(auteur,titre)
  104. if add_virgule:
  105. auteur=auteur+","
  106. lt["auteur"] = auteur
  107. # biblio ?
  108. has_bib= "biblio"in lt.keys()
  109. if has_bib:
  110. bibfile= lt["biblio"]
  111. if citeall:
  112. parsebib.parsebib(bibfile)
  113. elif citeall:
  114. raise Exception("citeall, mais pas de fichier .bib décrit dans data.yml")
  115. #-------------------------------------------------
  116. #
  117. # le fichier (docx, odt) qu'on va traiter:
  118. #
  119. fich=lt["fichier"].strip()
  120. #
  121. # fabriquer le titre à partir des données yml
  122. #
  123. titre_elements="}{".join([lt[x].replace("\n","") for x in data_yml_order])
  124. s,t=fancyshort(lt['auteur'],lt['titre'])
  125. #
  126. #--------------------------------------------------------------------
  127. template=sys.path[0]+"/tpl.tex" # le template
  128. #---------------------------------------------------------------------
  129. exten=fich.split(".")[-1]
  130. #
  131. # Traitement du fichier source
  132. # ---------------------------
  133. if exten=="docx" or exten=="odt":
  134. futurTex= fich.replace(exten,"tex")
  135. else:
  136. s=f"\n{fich} : extension incorrecte"
  137. raise Exception(s)
  138. #répertoire pour les images
  139. images= fich.split(".")[0]+"-media"
  140. print("Répertoire des images : ",images)
  141. if not os.path.isdir(images):
  142. os.mkdir(images)
  143. #
  144. # conversion en latex
  145. #
  146. extra_args= ["-s",f"--template={template}",f"--extract-media={images}"]
  147. #extra_args= ["-s",f"--template={template}",f"--extract-media={images}",
  148. # f"--lof=true"]
  149. L = pypandoc.convert_file(fich, 'tex',
  150. extra_args=extra_args).splitlines()
  151. #-----------------------------------------------------------------------
  152. # section -> section*
  153. rechsec= r"section[{\[]"
  154. rechsecc=re.compile(rechsec)
  155. # pour modifier le latex en changeant le chemin vers les images.
  156. if exten=="docx":
  157. rechgra=r"includegraphics\[.*\]{media.*}"
  158. repPath=("media",f"{images}/word/media")
  159. elif exten=="odt":
  160. rechgra=r"includegraphics\[.*\]{Pictures.*}"
  161. repPath=("Pictures",f"{images}/Pictures")
  162. rechgrac=re.compile(rechgra)
  163. #
  164. # On crée le fichier LaTex
  165. #
  166. with open(futurTex,"w") as f:
  167. L1=star_sec(L)
  168. rp0,rp1= repPath
  169. for l in L1:
  170. if has_bib and "addbibresource{}" in l:
  171. l=l.replace("{","{"+bibfile)
  172. while (q:=rechgrac.search(l)) != None:
  173. l=l.replace(rp0,rp1)
  174. l=treatline(l)
  175. #
  176. if "@@fin" in l:
  177. if has_bib:
  178. f.write("\\section*{Bibliographie}")
  179. if citeall:
  180. f.write(nocite_all(bibfile)+"\n")
  181. f.write("\\printbibliography[heading=none]\n")
  182. f.write("\\FloatBarrier\n")
  183. f.write("\\end{refsection}\n")
  184. f.write(l)
  185. f.write("\n")
  186. if "@@debut" in l:
  187. f.write("\\begin{refsection}\n")
  188. f.write("\\fancyhead{}\n")
  189. f.write("\\fancyhead[CE]{Mémoires: 2\\ieme{} partie}\n")
  190. #
  191. f.write("\\input{titre}")# fabriqué par makeTitre
  192. #
  193. #
  194. #---fin d'éciture du fichier tex
  195. #
  196. # lualatex, 2 fois si pas de bib, 3 fois + biber sinon:
  197. #
  198. if compile:
  199. subprocess.run(["/usr/bin/lualatex", futurTex])
  200. if has_bib:
  201. subprocess.run(["/usr/bin/biber", futurTex.replace(".tex","")])
  202. subprocess.run(["/usr/bin/lualatex", futurTex])
  203. subprocess.run(["/usr/bin/lualatex", futurTex])
  204. #--- fin