Les substitutions communes entre différents fichiers

Fermé
masal - Modifié le 24 juin 2022 à 15:02
 Utilisateur anonyme - 27 juin 2022 à 15:46
Bonjour,

J'ai un programme qui modifie automatiquement des champs déjà définis dans plusieurs template
  .text
.
Par exemple, dans mon modèle, j'ai défini un champ
def\clients{#.......#}
le code demande avec quoi je veux le remplacer .
Parfois les substitutions sont communes entre les différents fichiers, il est donc inutile de les demander plusieurs fois. comment puis-je résoudre ce problème ?
import os, subprocess, re

def find_occurrences(template_tex):
    # Open template.tex
    with open(template_tex, "r") as f:
         filedata = f.read()

    # Find occurrences of {{item}}
    return set(re.findall("\#(.*?)\#", filedata))

def prompt_replacements(occurrences):
    replacements = dict()
    # Replacing fields
    for occurrence in occurrences:
        replaceby = input("Replace " + occurrence + " by: " )
        replacements[occurrence] = replaceby
    return replacements

def clean_latex_temporary_files(result_tex):
    filename_wext = result_tex[:result_tex.rfind(".")]
    for ext in ["tex", "aux", "log"]:
        print("rm", filename_wext + "." + ext) 
        os.remove(filename_wext + "." + ext)

def compile_latex(result_tex):
    # Convert result.tex to result.pdf
    proc = subprocess.Popen(["pdflatex", "-interaction=nonstopmode", result_tex])
    proc.communicate()
    clean_temporary_files(result_tex)

def make_replaced_latex(template_tex, result_tex, replacements):
    # Write results
    with open(template_tex, "r") as f:
        filedata = f.read()
        for (occurrence, replaceby) in replacements.items():
            filedata = filedata.replace("{{" + occurrence + "}}", replaceby)
    with open(result_tex, "w") as f:
         f.write(filedata)

def main():
    map_template_result = {
        "template1.tex" : "result1.tex",
        "template2.tex" : "result2.tex",
        "template3.tex" : "result3.tex",
    }
    occurrences = set()
    for template_tex in map_template_result.keys():
        occurrences |= find_occurrences(template_tex)
    replacements = prompt_replacements(occurrences)
    for (template_tex, result_tex) in map_template_result.items():
        make_replaced_latex(template_tex, result_tex, replacements)
        compile_latex(result_tex)
        clean_temporary_files(result_tex)

main()
A voir également:

3 réponses

Utilisateur anonyme
24 juin 2022 à 15:10
Bonjour

Tous d'abord, tu as essayé d'utiliser la coloration syntaxique mais sans forcer le langage python, ce qui a donné un pavé gris, moche, sans coloration, numérotation de ligne et ascenseurs.

J'ai corrigé ton message mais pour la prochaine fois merci de prendre en compte ce petit tuto.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour répondre à ta question, sans avoir décortiqué ton code.
Si tu veux faire un template à la fois pour plusieurs fichiers, il suffit de demander le template et une liste de fichiers.
Si tu veux faire plusieurs template valables sur plusieurs fichiers, il de demander la liste des templates et la liste des fichiers.

Là où ça se complique c'est si tu veux remplacer
def\clients{#.......#}
par
toto
dans 4 fichiers puis par
tutu
dans 5 fichiers et par
titi
pour ceux qui restent.
0
merci beaucoup , mais moi je veux faire un Template de chaque fichier mais parfois dans les fichiers il y a des champs identique dons je peux pas qu'ile me demande de les remplir à chaque fois , déjà tous mes fichier sont dans le même dossier .
0
Utilisateur anonyme
27 juin 2022 à 12:19
mais parfois dans les fichiers il y a des champs identique dons je peux pas qu'ile me demande de les remplir à chaque fois

Je suis pas certain de comprendre cette phrase.

Dans mon interpretation, ça revient à ce que je t'ai déjà dit
Si tu veux faire un template à la fois pour plusieurs fichiers, il suffit de demander le template et une liste de fichiers.

0
je suis désolé : je voulais dire que je veux pas qu'a chaque fois me demande de remplir le champs .
par exemple dans le
fichier1.tex
il y a
 \def\date {......} 

dans un autres fichier
fichier2.tex
il y a le même champs
 \def\date  {......} 
qui doit être remplis par la même chose que pour le premier fichier
0
Utilisateur anonyme
27 juin 2022 à 15:46
Oui, ma réponse reste la même.
Tu demandes le "code" à trouver, la valeur de remplacement et la liste des fichiers.
Ensuite tu ouvres chacun des fichiers et tu y appliques le changement.
0