extr.py 6.3 KB

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