extr.py 3.6 KB

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