extr.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/home/moi/ProtoMemoires/venv/bin/python
  2. import sys,pypandoc,os,re,subprocess,yaml
  3. #
  4. data_yml_mandatory_keys=['fichier', 'date', 'auteur', 'titre']
  5. data_yml_order=['date','type','auteur','statut','titre']
  6. def star_sec(l):
  7. # \section est transformée en \section* et on ne garde comme argument
  8. # que ce qui est nécessaire.
  9. it=iter(L)
  10. ret=[]
  11. passed= False
  12. for x in it:
  13. if "begin{document" in x:
  14. passed= True
  15. if passed and "section[" in x:
  16. s=x
  17. while "label" not in x:
  18. x=next(it)
  19. s=s+" "+x
  20. if not "}" in s:
  21. x=next(it)
  22. s=s+x
  23. k=s.find("]")
  24. r=(s[:k]+"}").replace("[","*{")+" "
  25. ret.append(r)
  26. ret.append("\n")
  27. else:
  28. ret.append(x)
  29. return ret
  30. #
  31. #-----------------------------------------------------------------------
  32. # Construire le titre à partir du fichier yml.
  33. #-----------------------------------------------------------------------
  34. with open("data.yml") as f:
  35. lt=yaml.safe_load(f)
  36. for x in data_yml_mandatory_keys: #vérifier la présence des clés obligatoires
  37. if not x in lt.keys():
  38. raise Exception(f"\n\n Il manque {x} dans data.yml\n\n")
  39. # si statut est défini, type doit l'être aussi:
  40. if "statut" in lt.keys():
  41. if "type" not in lt.keys():
  42. raise Exception(f"\n\n statut est défini, mais pas type\n\n")
  43. lt['statut']=", "+lt["statut"]
  44. else: # si statut n'est pas défini, on le définit à " " et type à "Conférence".
  45. lt["statut"]=" "
  46. lt["type"]="Conférence"
  47. # biblio ?
  48. has_bib= "biblio"in lt.keys()
  49. #
  50. # le fichier (docx, odt) qu'on va traiter:
  51. #
  52. fich=lt["fichier"].strip()
  53. #
  54. # fabriquer le titre à partir des données yml
  55. #
  56. titre_elements="}{".join([lt[x].replace("\n","") for x in data_yml_order])
  57. #le_titre="\\titre{"+titre_elements+"}"+"\n"
  58. le_titre= f"\\titre{{{titre_elements}}}\n"
  59. #--------------------------------------------------------------------
  60. template="../tpl.tex" # le template
  61. #---------------------------------------------------------------------
  62. exten=fich.split(".")[-1]
  63. if exten=="docx" or exten=="odt":
  64. futurTex= fich.replace(exten,"tex")
  65. else:
  66. s=f"\n{fich} : extension incorrecte"
  67. raise Exception(s)
  68. #répertoire pour les images
  69. images= fich.split(".")[0]+"-media"
  70. print("Répertoire des images : ",images)
  71. if not os.path.isdir(images):
  72. os.mkdir(images)
  73. #
  74. # conversion en latex
  75. #
  76. #extra_args= ["-s",f"--template={template}",f"--extract-media={images}"]
  77. extra_args= ["-s",f"--template={template}",f"--extract-media={images}",
  78. f"--lof=true"]
  79. L = pypandoc.convert_file(fich, 'tex',
  80. extra_args=extra_args).splitlines()
  81. #-----------------------------------------------------------------------
  82. # section -> section*
  83. rechsec= r"section[{\[]"
  84. rechsecc=re.compile(rechsec)
  85. # pour modifier le latex en changeant le chemin vers les images.
  86. if exten=="docx":
  87. rechgra=r"includegraphics\[.*\]{media.*}"
  88. repPath=("media",f"{images}/word/media")
  89. elif exten=="odt":
  90. rechgra=r"includegraphics\[.*\]{Pictures.*}"
  91. repPath=("Pictures",f"{images}/Pictures")
  92. rechgrac=re.compile(rechgra)
  93. #
  94. # On crée le fichier tex
  95. #
  96. with open(futurTex,"w") as f:
  97. L1=star_sec(L)
  98. rp0,rp1= repPath
  99. for l in L1:
  100. if has_bib and "addbibresource{}" in l:
  101. bibfile=lt['biblio']
  102. l=l.replace("{","{"+bibfile)
  103. if "textsuperscript{e}" in l:
  104. print(l)
  105. l=l.replace("textsuperscript{e}","ieme{}")
  106. print(l)
  107. #ccc=input()
  108. while (q:=rechgrac.search(l)) != None:
  109. l=l.replace(rp0,rp1)
  110. # on supprime les "quote"
  111. l=l.replace("\\begin{quote}","")
  112. l=l.replace("\\end{quote}","")
  113. # subsection-> subsection*
  114. l=l.replace("subsection{","subsection*{")
  115. if "@@fin" in l:
  116. if has_bib:
  117. f.write("\\begin{center}\\textbf{Bibliographie}\\end{center}\n")
  118. f.write("\citeall[\\fullcite]\n")
  119. f.write("\FloatBarrier\n")
  120. f.write(l)
  121. f.write("\n")
  122. if "@@debut" in l:
  123. f.write("\\fancyhead{}\n")
  124. f.write("\\fancyhead[CE]{Mémoires: 2\ieme{} partie}\n")
  125. aut= lt["auteur"]
  126. f.write(f"\\fancyhead[CO]{{{lt['auteur']}, {lt['titre']}}}\n")
  127. f.write(le_titre)
  128. #
  129. #---fin d'éciture du fichier tex
  130. #
  131. # lualatex, 2 fois:
  132. #
  133. subprocess.run(["/usr/bin/lualatex", futurTex])
  134. if has_bib:
  135. subprocess.run(["/usr/bin/biber", futurTex.replace(".tex","")])
  136. subprocess.run(["/usr/bin/lualatex", futurTex])
  137. subprocess.run(["/usr/bin/lualatex", futurTex])
  138. #--- fin