Module dicosDnbBacE3c.dicosManage

Permet de synchroniser/créer les différents dictionnaires utilisés par mathalea pour :

  • le DNB,
  • le BAC
  • E3C
Expand source code
#!/usr/bin/python3
# -*- coding: utf8 -*-

# @author : Sébastien LOZANO

"""Permet de synchroniser/créer les différents dictionnaires utilisés par mathalea pour :

* le DNB,
* le BAC
* E3C
"""
pass

# On importe la librairie os pour gérer les fichiers
import os

# Pour mesurer le temps de traitement du script
from datetime import datetime 

def locationName(text:str)->str:
    """Renvoie un nom de lieu ad hoc

    **Paramètres**

        * text -- Un string avec le nom récupéré par découpage d'un nom de fichier
    
    **Sorties**

        * Un texte tout beau !    
    
    """
    pass
    if text == 'metropole' :
        return 'Métropole'
    elif text == 'pondichery' :
        return 'Pondichéry'
    elif text == 'ameriquenord' :
        return 'Amérique du Nord'
    elif text == 'asie' :
        return 'Asie'
    elif text == 'etranger' or text == 'etrangers' :
        return 'Centres étrangers'
    elif text == 'wallis' or text == 'wallisfutuna' :
        return 'Wallis et Futuna'
    elif text == 'polynesie' :
        return 'Polynésie'
    elif text == 'ameriquesud' :
        return 'Amérique du sud'
    elif text == 'caledonie' :
        return 'Nouvelle Calédonie'
    elif text == 'grece' :
        return 'Grèce'
    elif text == 'antillesguyanne' :
        return 'Antilles - Guyanne'
    else :
        return text

def monthName(mm:str)->str:
    """Une fonction pour transformer le numéro du mois en texte

    **Paramètres**

        * mm -- Un string avec les chiffres correspondant au mois récupéré par découpage d'un nom de fichier
    
    **Sorties**

        * Un nom de mois tout beau !    
    
    """
    pass
    month = ['','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre']
    return month[int(mm)]

def newEntry(file:str,dicoType:str)->list:
    """Une fonction pour créer une entrée dans un dico

    **Paramètres**

        * file -- Un string avec le nom du fichier à traiter
        * dicoType -- Un string avec dnb, bac ou e3c
    
    **Sorties**

        * Un tableau avec deux strings [un objet pour le dico, le nom du fichier traité]   
    
    """
    pass    
    # On récupère le nom du fichier sans l'extension
    filename = os.path.splitext(file)[0]    
    # On récupère l'extension
    extension = os.path.splitext(file)[1]
    # Pour les lignes à ajouter
    newLines = ''
    # On traite les fichiers tex qui ne sont pas les fichiers de correction 
    if filename[-4:] != '_cor' and  extension == ".tex" :
        if 'mathalea' in filename:
            numeroInitial = filename.split('_')[5]
        else:
            numeroInitial = filename.split('_')[4]
        newLines = f'''  {filename}: {{
    annee: '{filename[4:8]}',
    lieu: '{locationName(filename.split('_')[3])}',
    mois: '{monthName(filename[9:11])}',
    numeroInitial: '{numeroInitial}',
    png: '/{dicoType}/{filename[4:8]}/tex/png/{filename}.png',
    pngcor: '/{dicoType}/{filename[4:8]}/tex/png/{filename}_cor.png',
    typeExercice: '{dicoType}',
    url: '/{dicoType}/{filename[4:8]}/tex/{filename}.tex',
    urlcor: '/{dicoType}/{filename[4:8]}/tex/{filename}_cor.tex',
    tags: ['...tagsToChange']
  }},\n'''    
    
    return [newLines,filename]

def currentRef(dicoPath:str)->list:
    """Une fonction pour récupérer tous les fichiers déjà référencés dans le dico

    **Paramètres**

        * dicoPath -- Un string avec le chemin vers le dico
    
    **Sorties**

        * out -- Un tableau avec tous les noms des fichiers déjà dans le dico   
    
    """
    pass     
    # On ouvre le dico et on récupère les lignes
    content = open(dicoPath,'r')
    lines = content.readlines()
    content.close()
    # Un tableau pour récupérer les noms des fichiers déjà dans le dico
    out = []
    for line in lines:
        if ": {" in line:            
            out.append(line.replace(" ","")[:-3])
    return out
 
def insertNewEntries(pathName:str,dicoPath:str,dicoType:str):
    """Une procédure pour insérer les nouvelles entrées au dico

    **Paramètres**

        * pathName -- Un string avec le chemin du répertoire à scanner
        * dicoPath -- Un string avec le chemin vers le dico
        * dicoType -- Un string avec dnb, bac ou e3c        
    
    """
    pass
    # On lit les lignes du dico
    content = open(dicoPath,'r')
    lines = content.readlines()
    content.close()
    # On supprime l'avant dernière ligne qui contient }
    del lines[len(lines)-1]
    # On ouvre le fichier en écriture
    # On le réécrit complètement sans l'avant dernière ligne
    content = open(dicoPath,'w')
    content.writelines(lines)
    content.close()

    # On récupère les entrées actuelles du dico
    currentEntries = currentRef(dicoPath)

    # On ouvre le dico en ajout
    content = open(dicoPath, 'a')
    # On ajoute les nouvelles entrées
    for (dirpath, dirnames, filenames) in os.walk(pathName):
        # Parcourt tout le répertoire
        for file in sorted(filenames):
            new = newEntry(file,dicoType)
            # On ajoute l'entrée s'il elle n'existe pas déjà
            if (new[1] not in currentEntries):              
                content.writelines(new[0])    
    # On referme la dernière accolade
    lastAcc = '''
}\n'''
    content.writelines(lastAcc)
    content.close()

def manageDico(dicoPath:str,dicoType:str):
    """Une procedure pour la gestion du dico

    **Paramètres**

        * dicoPath -- Un string avec le chemin vers le dico
        * dicoType -- Un string avec dnb, bac ou e3c
    
    """
    pass
    # On crée le dico s'il n'existe pas
    fichier = open(dicoPath, "a+")
    fichier.close()

    # Si le dico est vide on ajoute les première lignes
    if (os.path.getsize(dicoPath) == 0):
        fichier = open(dicoPath, "w", encoding="utf8")
        firstLine = "/* eslint-disable no-multiple-empty-lines */\n"
        secondLine = "/* eslint-disable comma-dangle */\n"
        thirdLine = f'export const dictionnaire{dicoType.upper()} = {{\n'
        lastLine = "}"    
        fichier.writelines(firstLine)
        fichier.writelines(secondLine)
        fichier.writelines(thirdLine)
        fichier.writelines(lastLine)
        fichier.close()
    
    folderToScan = f'./{dicoType}/'
    # On crée le repertoire s'il n'existe pas
    if (not os.path.exists(folderToScan)):
        os.makedirs(folderToScan)    
    # On récupère et range toutes les années présentes dans le repertoire à scanner
    getAllYears = sorted(os.listdir(folderToScan)) 
    
    # On traite toutes les années
    for year in getAllYears:
        insertNewEntries(f'./{dicoType}/{year}/tex/',dicoPath,dicoType)

# Script principal
def main():
    """Procédure principale"""
    # On récupère la date au début du traitement
    start_time = datetime.now()
      
    # On nettoie le terminal
    os.system("clear")

    # On génère la documentation
    print("=============================================================================")
    print("  Création de la documentation en cours ...  ")    
    print(" ")    
    os.system('sh ./src/js/modules/dicosDnbBacE3c/generateDoc.sh')
    print("=============================================================================")
    print("  Synchronisation/Génération du dictionnaire en cours ...  ")    
    print(" ")    

    # On choisit le type de dico à synchroniser/générer
    choiceDico = ''
    while choiceDico not in ['1','2','3']:
        choiceDico = input("""Quels dictionnaire faut-il synchronier/générer ?
        ---> 1 : DNB
        ---> 2 : BAC
        ---> 3 : E3C
Taper 1, 2 ou 3 pour lancer le script --> """)
    # Une variable pour le chemin vers le dico à synchroniser/générer        
    dicoPath = ''
    # Une variable pour le type de dico à synchroniser/générer        
    dicoType = ''

    if (choiceDico == '1'):
        dicoPath = './src/js/modules/dictionnaireDNB.js'
        dicoType = 'dnb'
    elif (choiceDico == '2'):
        dicoPath = './src/js/modules/dictionnaireBAC.js'
        dicoType = 'bac'
    elif (choiceDico == '3'):
        dicoPath = './src/js/modules/dictionnaireE3C.js'
        dicoType = 'e3c'

    manageDico(dicoPath,dicoType)

    if __name__ == "__main__":
        restart = ''
        while restart not in ['o','n']:
            print("=============================================================================")
            print("  Syncroniser/Générer un autre dictionnaire ? ")    
            print(" ")           
            restart = input("Taper o ou n pour relancer le script --> ")
            if restart == 'o':
                main()  

    # On évalue le temps de traitement
    end_time = datetime.now()
    print("=============================================================================")
    print("  Durée de traitement : ",end_time-start_time)        
    print("=============================================================================")
 
if __name__ == "__main__":
    main()

    ################## Pour mettre d'équerre le dico DNB ################################
    #####################################################################################
    # currentRefsdicoDnbTest = currentRef('./src/js/modules/dictionnaireDNBTest.js')
    # currentRefsdicoDnb = currentRef('./src/js/modules/dictionnaireDNB.js')
    # diff = []
    # for ref in currentRefsdicoDnb:
    #     if ref not in currentRefsdicoDnbTest:
    #         diff.append(ref)
    # print(diff)
    # diff = []
    # for ref in currentRefsdicoDnbTest:
    #     if ref not in currentRefsdicoDnb:
    #         diff.append(ref)
    # print(diff)
    ######################################################################################

Functions

def currentRef(dicoPath: str) ‑> list

Une fonction pour récupérer tous les fichiers déjà référencés dans le dico

Paramètres

* dicoPath -- Un string avec le chemin vers le dico

Sorties

* out -- Un tableau avec tous les noms des fichiers déjà dans le dico
Expand source code
def currentRef(dicoPath:str)->list:
    """Une fonction pour récupérer tous les fichiers déjà référencés dans le dico

    **Paramètres**

        * dicoPath -- Un string avec le chemin vers le dico
    
    **Sorties**

        * out -- Un tableau avec tous les noms des fichiers déjà dans le dico   
    
    """
    pass     
    # On ouvre le dico et on récupère les lignes
    content = open(dicoPath,'r')
    lines = content.readlines()
    content.close()
    # Un tableau pour récupérer les noms des fichiers déjà dans le dico
    out = []
    for line in lines:
        if ": {" in line:            
            out.append(line.replace(" ","")[:-3])
    return out
def insertNewEntries(pathName: str, dicoPath: str, dicoType: str)

Une procédure pour insérer les nouvelles entrées au dico

Paramètres

* pathName -- Un string avec le chemin du répertoire à scanner
* dicoPath -- Un string avec le chemin vers le dico
* dicoType -- Un string avec dnb, bac ou e3c
Expand source code
def insertNewEntries(pathName:str,dicoPath:str,dicoType:str):
    """Une procédure pour insérer les nouvelles entrées au dico

    **Paramètres**

        * pathName -- Un string avec le chemin du répertoire à scanner
        * dicoPath -- Un string avec le chemin vers le dico
        * dicoType -- Un string avec dnb, bac ou e3c        
    
    """
    pass
    # On lit les lignes du dico
    content = open(dicoPath,'r')
    lines = content.readlines()
    content.close()
    # On supprime l'avant dernière ligne qui contient }
    del lines[len(lines)-1]
    # On ouvre le fichier en écriture
    # On le réécrit complètement sans l'avant dernière ligne
    content = open(dicoPath,'w')
    content.writelines(lines)
    content.close()

    # On récupère les entrées actuelles du dico
    currentEntries = currentRef(dicoPath)

    # On ouvre le dico en ajout
    content = open(dicoPath, 'a')
    # On ajoute les nouvelles entrées
    for (dirpath, dirnames, filenames) in os.walk(pathName):
        # Parcourt tout le répertoire
        for file in sorted(filenames):
            new = newEntry(file,dicoType)
            # On ajoute l'entrée s'il elle n'existe pas déjà
            if (new[1] not in currentEntries):              
                content.writelines(new[0])    
    # On referme la dernière accolade
    lastAcc = '''
}\n'''
    content.writelines(lastAcc)
    content.close()
def locationName(text: str) ‑> str

Renvoie un nom de lieu ad hoc

Paramètres

* text -- Un string avec le nom récupéré par découpage d'un nom de fichier

Sorties

* Un texte tout beau !
Expand source code
def locationName(text:str)->str:
    """Renvoie un nom de lieu ad hoc

    **Paramètres**

        * text -- Un string avec le nom récupéré par découpage d'un nom de fichier
    
    **Sorties**

        * Un texte tout beau !    
    
    """
    pass
    if text == 'metropole' :
        return 'Métropole'
    elif text == 'pondichery' :
        return 'Pondichéry'
    elif text == 'ameriquenord' :
        return 'Amérique du Nord'
    elif text == 'asie' :
        return 'Asie'
    elif text == 'etranger' or text == 'etrangers' :
        return 'Centres étrangers'
    elif text == 'wallis' or text == 'wallisfutuna' :
        return 'Wallis et Futuna'
    elif text == 'polynesie' :
        return 'Polynésie'
    elif text == 'ameriquesud' :
        return 'Amérique du sud'
    elif text == 'caledonie' :
        return 'Nouvelle Calédonie'
    elif text == 'grece' :
        return 'Grèce'
    elif text == 'antillesguyanne' :
        return 'Antilles - Guyanne'
    else :
        return text
def main()

Procédure principale

Expand source code
def main():
    """Procédure principale"""
    # On récupère la date au début du traitement
    start_time = datetime.now()
      
    # On nettoie le terminal
    os.system("clear")

    # On génère la documentation
    print("=============================================================================")
    print("  Création de la documentation en cours ...  ")    
    print(" ")    
    os.system('sh ./src/js/modules/dicosDnbBacE3c/generateDoc.sh')
    print("=============================================================================")
    print("  Synchronisation/Génération du dictionnaire en cours ...  ")    
    print(" ")    

    # On choisit le type de dico à synchroniser/générer
    choiceDico = ''
    while choiceDico not in ['1','2','3']:
        choiceDico = input("""Quels dictionnaire faut-il synchronier/générer ?
        ---> 1 : DNB
        ---> 2 : BAC
        ---> 3 : E3C
Taper 1, 2 ou 3 pour lancer le script --> """)
    # Une variable pour le chemin vers le dico à synchroniser/générer        
    dicoPath = ''
    # Une variable pour le type de dico à synchroniser/générer        
    dicoType = ''

    if (choiceDico == '1'):
        dicoPath = './src/js/modules/dictionnaireDNB.js'
        dicoType = 'dnb'
    elif (choiceDico == '2'):
        dicoPath = './src/js/modules/dictionnaireBAC.js'
        dicoType = 'bac'
    elif (choiceDico == '3'):
        dicoPath = './src/js/modules/dictionnaireE3C.js'
        dicoType = 'e3c'

    manageDico(dicoPath,dicoType)

    if __name__ == "__main__":
        restart = ''
        while restart not in ['o','n']:
            print("=============================================================================")
            print("  Syncroniser/Générer un autre dictionnaire ? ")    
            print(" ")           
            restart = input("Taper o ou n pour relancer le script --> ")
            if restart == 'o':
                main()  

    # On évalue le temps de traitement
    end_time = datetime.now()
    print("=============================================================================")
    print("  Durée de traitement : ",end_time-start_time)        
    print("=============================================================================")
def manageDico(dicoPath: str, dicoType: str)

Une procedure pour la gestion du dico

Paramètres

* dicoPath -- Un string avec le chemin vers le dico
* dicoType -- Un string avec dnb, bac ou e3c
Expand source code
def manageDico(dicoPath:str,dicoType:str):
    """Une procedure pour la gestion du dico

    **Paramètres**

        * dicoPath -- Un string avec le chemin vers le dico
        * dicoType -- Un string avec dnb, bac ou e3c
    
    """
    pass
    # On crée le dico s'il n'existe pas
    fichier = open(dicoPath, "a+")
    fichier.close()

    # Si le dico est vide on ajoute les première lignes
    if (os.path.getsize(dicoPath) == 0):
        fichier = open(dicoPath, "w", encoding="utf8")
        firstLine = "/* eslint-disable no-multiple-empty-lines */\n"
        secondLine = "/* eslint-disable comma-dangle */\n"
        thirdLine = f'export const dictionnaire{dicoType.upper()} = {{\n'
        lastLine = "}"    
        fichier.writelines(firstLine)
        fichier.writelines(secondLine)
        fichier.writelines(thirdLine)
        fichier.writelines(lastLine)
        fichier.close()
    
    folderToScan = f'./{dicoType}/'
    # On crée le repertoire s'il n'existe pas
    if (not os.path.exists(folderToScan)):
        os.makedirs(folderToScan)    
    # On récupère et range toutes les années présentes dans le repertoire à scanner
    getAllYears = sorted(os.listdir(folderToScan)) 
    
    # On traite toutes les années
    for year in getAllYears:
        insertNewEntries(f'./{dicoType}/{year}/tex/',dicoPath,dicoType)
def monthName(mm: str) ‑> str

Une fonction pour transformer le numéro du mois en texte

Paramètres

* mm -- Un string avec les chiffres correspondant au mois récupéré par découpage d'un nom de fichier

Sorties

* Un nom de mois tout beau !
Expand source code
def monthName(mm:str)->str:
    """Une fonction pour transformer le numéro du mois en texte

    **Paramètres**

        * mm -- Un string avec les chiffres correspondant au mois récupéré par découpage d'un nom de fichier
    
    **Sorties**

        * Un nom de mois tout beau !    
    
    """
    pass
    month = ['','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre']
    return month[int(mm)]
def newEntry(file: str, dicoType: str) ‑> list

Une fonction pour créer une entrée dans un dico

Paramètres

* file -- Un string avec le nom du fichier à traiter
* dicoType -- Un string avec dnb, bac ou e3c

Sorties

* Un tableau avec deux strings [un objet pour le dico, le nom du fichier traité]
Expand source code
def newEntry(file:str,dicoType:str)->list:
    """Une fonction pour créer une entrée dans un dico

    **Paramètres**

        * file -- Un string avec le nom du fichier à traiter
        * dicoType -- Un string avec dnb, bac ou e3c
    
    **Sorties**

        * Un tableau avec deux strings [un objet pour le dico, le nom du fichier traité]   
    
    """
    pass    
    # On récupère le nom du fichier sans l'extension
    filename = os.path.splitext(file)[0]    
    # On récupère l'extension
    extension = os.path.splitext(file)[1]
    # Pour les lignes à ajouter
    newLines = ''
    # On traite les fichiers tex qui ne sont pas les fichiers de correction 
    if filename[-4:] != '_cor' and  extension == ".tex" :
        if 'mathalea' in filename:
            numeroInitial = filename.split('_')[5]
        else:
            numeroInitial = filename.split('_')[4]
        newLines = f'''  {filename}: {{
    annee: '{filename[4:8]}',
    lieu: '{locationName(filename.split('_')[3])}',
    mois: '{monthName(filename[9:11])}',
    numeroInitial: '{numeroInitial}',
    png: '/{dicoType}/{filename[4:8]}/tex/png/{filename}.png',
    pngcor: '/{dicoType}/{filename[4:8]}/tex/png/{filename}_cor.png',
    typeExercice: '{dicoType}',
    url: '/{dicoType}/{filename[4:8]}/tex/{filename}.tex',
    urlcor: '/{dicoType}/{filename[4:8]}/tex/{filename}_cor.tex',
    tags: ['...tagsToChange']
  }},\n'''    
    
    return [newLines,filename]