Esempio n. 1
0
def ranger_articles_xml(chemin_base, coll_articles, entree_version_section,
                        entree_texte, entree_version_texte, dates_changement,
                        ensemble_articles, cidTexte):

    if coll_articles == None:
        return dates_changement, ensemble_articles

    for i in range(len(coll_articles)):

        print('({}/{})'.format(i + 1, len(coll_articles)), end='')
        sys.stdout.flush()

        # Lecture brute des attributs XML
        id = coll_articles[i]['id']
        nom = coll_articles[i].text
        etat_juridique = coll_articles[i]['etat']
        num = coll_articles[i]['num']
        debut = normalise_date(coll_articles[i]['debut'])
        fin = normalise_date(coll_articles[i]['fin'])

        # Enregistrement de l’article
        # TODO gérer les mises à jour
        try:
            entree_article = Article.get(Article.id == id)
        except:
            entree_article = Article.create(
                id=id,
                nom=nom,
                etat_juridique=etat_juridique,
                num=num,
                debut=debut,
                fin=fin,
                texte=entree_texte,
                version_section=entree_version_section,
                version_texte=entree_version_texte)

        # Inscription des dates et articles
        dates_changement |= {debut, fin}
        ensemble_articles |= {entree_article}

        nb_chiffres = len('({}/{})'.format(i + 1, len(coll_articles)))
        print('\033[' + str(nb_chiffres) + 'D' +
              (''.join([' ' * nb_chiffres])) + '\033[' + str(nb_chiffres) +
              'D',
              end='')
        sys.stdout.flush()

    return dates_changement, ensemble_articles
Esempio n. 2
0
def creer_markdown_texte(texte, cache):
    
    # Informations de base
    cid = texte[1]
    articles = Article.select(Article.id).where(Article.texte == cid)
    chemin_base = os.path.join(cache, 'xml', chemin_texte(cid))
    
    # Créer le répertoire de cache
    path(os.path.join(cache, 'markdown')).mkdir_p()
    path(os.path.join(cache, 'markdown', cid)).mkdir_p()
    
    for article in articles:
        
        # Si la markdownisation a déjà été faite, passer
        chemin_markdown = os.path.join(cache, 'markdown', cid, article.id + '.md')
        if os.path.exists(chemin_markdown):
            continue
        
        # Lecture du fichier
        chemin_article = os.path.join(chemin_base, 'article', decompose_cid(article.id) + '.xml')
        f_article = open(chemin_article, 'r')
        soup = BeautifulSoup(f_article.read(), 'xml')
        f_article.close()
        contenu = soup.find('BLOC_TEXTUEL').find('CONTENU').text.strip()
        
        # Logique de transformation en Markdown
        lignes = [l.strip() for l in contenu.split('\n')]
        contenu = '\n'.join(lignes)
        
        # - Retrait des <br/> en début et fin (cela semble être enlevé par BeautifulSoup)
        if all([lignes[l].startswith(('<br/>', r'<br />')) for l in range(0, len(lignes))]):
            lignes[i] = re.sub(r'^<br ?/> *', r'', lignes[i])
        if all([lignes[l].endswith(('<br/>', r'<br />')) for l in range(0, len(lignes))]):
            lignes[i] = re.sub(r' *<br ?/>$', r'', lignes[i])
        contenu = '\n'.join(lignes)
        
        # - Markdownisation des listes numérotées
        ligne_liste = [ False ] * len(lignes)
        for i in range(len(lignes)):
            if re.match(r'(?:\d+[°\.\)-]|[\*-]) ', lignes[i]):
                ligne_liste[i] = True
            lignes[i] = re.sub(r'^(\d+)([°\.\)-]) +', r'\1. ', lignes[i])
            lignes[i] = re.sub(r'^([\*-]) +', r'- ', lignes[i])
        contenu = '\n'.join(lignes)
        
        # - Création d’alinea séparés, sauf pour les listes
        contenu = lignes[0]
        for i in range(1, len(lignes)):
            if ligne_liste[i]:
                contenu = contenu + '\n' + lignes[i]
            else:
                contenu = contenu + '\n\n' + lignes[i]
        
        # Enregistrement
        f_markdown = open(chemin_markdown, 'w')
        f_markdown.write(contenu.encode('utf-8'))
        f_markdown.close()
Esempio n. 3
0
def ranger_articles_xml(chemin_base, coll_articles, entree_version_section, entree_texte, entree_version_texte, dates_changement, ensemble_articles, cidTexte):
    
    if coll_articles == None:
        return dates_changement, ensemble_articles
    
    for i in range(len(coll_articles)):
        
        print('({}/{})'.format(i+1, len(coll_articles)), end='')
        sys.stdout.flush()
        
        # Lecture brute des attributs XML
        id = coll_articles[i]['id']
        nom = coll_articles[i].text
        etat_juridique = coll_articles[i]['etat']
        num = coll_articles[i]['num']
        debut = normalise_date(coll_articles[i]['debut'])
        fin = normalise_date(coll_articles[i]['fin'])
        
        # Enregistrement de l’article
        # TODO gérer les mises à jour
        try:
            entree_article = Article.get(Article.id == id)
        except:
            entree_article = Article.create(
                id=id,
                nom=nom,
                etat_juridique=etat_juridique,
                num=num,
                debut=debut,
                fin=fin,
                texte=entree_texte,
                version_section=entree_version_section,
                version_texte=entree_version_texte
            )
        
        # Inscription des dates et articles
        dates_changement |= {debut, fin}
        ensemble_articles |= {entree_article}
        
        nb_chiffres=len('({}/{})'.format(i+1, len(coll_articles)))
        print('\033[' + str(nb_chiffres) + 'D' + (''.join([' ' * nb_chiffres])) + '\033[' + str(nb_chiffres) + 'D', end='')
        sys.stdout.flush()
    
    return dates_changement, ensemble_articles
Esempio n. 4
0
def creer_historique_texte(texte, format, dossier, cache):
    
    # Créer le dossier si besoin
    nom = texte[0]
    cid = texte[1]
    sousdossier = '.'
    path(dossier).mkdir_p()
    path(os.path.join(dossier, 'codes')).mkdir_p()
    path(os.path.join(dossier, 'constitutions')).mkdir_p()
    path(os.path.join(dossier, 'lois')).mkdir_p()
    path(os.path.join(dossier, 'décrets')).mkdir_p()
    path(os.path.join(dossier, 'ordonnances')).mkdir_p()
    if texte[2]:
        identifiant, tmp1 = normalisation_code(nom)
        dossier = os.path.join(dossier, 'codes', identifiant)
        sousdossier = '.'
        path(dossier).mkdir_p()
        path(os.path.join(dossier, sousdossier)).mkdir_p()
        chemin_base = chemin_texte(cid, True)
    fichier = os.path.join(dossier, sousdossier, nom+'.md')
    
    # Créer le dépôt Git
    if not os.path.exists(os.path.join(dossier,'.git')):
        subprocess.Popen(['git', 'init'], cwd=dossier)
    else:
        subprocess.Popen(['git', 'checkout', '--', sousdossier], cwd=dossier)
    
    if os.path.exists(fichier):
        raise Exception('Fichier existant : la mise à jour de fichiers existants n’est pas encore prise en charge.')
    
    # Vérifier que les articles ont été transformés en Markdown ou les créer le cas échéant
    creer_markdown_texte(texte, cache)
    
    # Sélection des versions du texte
    versions_texte = Version_texte.select().where(Version_texte.texte == texte[1])
    
    # Pour chaque version
    # - rechercher les sections et articles associés
    # - créer le fichier texte au format demandé
    # - commiter le fichier
    for (i_version,version_texte) in enumerate(versions_texte):
        
        # Passer les versions 'nulles'
        if version_texte.base is None:
            continue
        
        # Sélectionner les versions d’articles et sections présentes dans cette version de texte, c’est-à-dire celles créées avant et détruites après (ou jamais)
        articles =                                                                     \
            Article.select()                                                           \
                   .where(  (Article.texte == cid)                                     \
                          & (Article.debut <= version_texte.debut)                     \
                          & ((Article.fin >= version_texte.fin)|(Article.fin == None)) \
                         )
        
        versions_sections =                                                                            \
            Version_section.select()                                                                   \
                   .where(  (Version_section.texte == cid)                                             \
                          & (Version_section.debut <= version_texte.debut)                             \
                          & ((Version_section.fin >= version_texte.fin)|(Version_section.fin == None)) \
                         )
        
        # Créer l’en-tête
        date_fr = '{} {} {}'.format(version_texte.debut.day, MOIS2[int(version_texte.debut.month)], version_texte.debut.year)
        if version_texte.debut.day == 1:
            date_fr = '1er {} {}'.format(MOIS2[int(version_texte.debut.month)], version_texte.debut.year)
        contenu = nom + '\n'   \
                  + '\n'   \
                  + '- Date de consolidation : '+date_fr+'\n'            \
                  + '- [Lien permanent Légifrance](http://legifrance.gouv.fr/affichCode.do?cidTexte='+cid+'&dateTexte='+str(version_texte.debut.year)+'{:02d}'.format(version_texte.debut.month)+'{:02d}'.format(version_texte.debut.day)+')\n' \
                  + '\n' \
                  + '\n'
        
        # Créer les sections (donc tout le texte)
        contenu = creer_sections(contenu, 1, None, versions_sections, articles, version_texte, cid, cache)
        
        # Enregistrement du fichier
        f_texte = open(fichier, 'w')
        f_texte.write(contenu.encode('utf-8'))
        f_texte.close()
        
        # Exécuter Git
        subprocess.call(['git', 'add', os.path.join(sousdossier, nom+'.md')], cwd=dossier)
        subprocess.call(['git', 'commit', '--author="Législateur <>"', '--date="'+str(version_texte.debut)+'T00:00:00Z"', '-m', 'Version consolidée au {}'.format(date_fr), '-q', '--no-status'], cwd=dossier)
        
        if version_texte.fin == None:
            logger.info('Version {} enregistrée (du {} à maintenant)'.format(i_version, version_texte.debut))
        else:
            logger.info('Version {} enregistrée (du {} au {})'.format(i_version, version_texte.debut, version_texte.fin))
Esempio n. 5
0
def creer_historique_texte(texte, format, dossier, cache):

    # Créer le dossier si besoin
    nom = texte[0]
    cid = texte[1]
    sousdossier = '.'
    path(dossier).mkdir_p()
    path(os.path.join(dossier, 'codes')).mkdir_p()
    path(os.path.join(dossier, 'constitutions')).mkdir_p()
    path(os.path.join(dossier, 'lois')).mkdir_p()
    path(os.path.join(dossier, 'décrets')).mkdir_p()
    path(os.path.join(dossier, 'ordonnances')).mkdir_p()
    if texte[2]:
        identifiant, tmp1 = normalisation_code(nom)
        dossier = os.path.join(dossier, 'codes', identifiant)
        sousdossier = '.'
        path(dossier).mkdir_p()
        path(os.path.join(dossier, sousdossier)).mkdir_p()
        chemin_base = chemin_texte(cid, True)
    fichier = os.path.join(dossier, sousdossier, nom + '.md')

    # Créer le dépôt Git
    if not os.path.exists(os.path.join(dossier, '.git')):
        subprocess.Popen(['git', 'init'], cwd=dossier)
    else:
        subprocess.Popen(['git', 'checkout', '--', sousdossier], cwd=dossier)

    if os.path.exists(fichier):
        raise Exception(
            'Fichier existant : la mise à jour de fichiers existants n’est pas encore prise en charge.'
        )

    # Vérifier que les articles ont été transformés en Markdown ou les créer le cas échéant
    creer_markdown_texte(texte, cache)

    # Sélection des versions du texte
    versions_texte = Version_texte.select().where(
        Version_texte.texte == texte[1])

    # Pour chaque version
    # - rechercher les sections et articles associés
    # - créer le fichier texte au format demandé
    # - commiter le fichier
    for (i_version, version_texte) in enumerate(versions_texte):

        # Passer les versions 'nulles'
        if version_texte.base is None:
            continue

        # Sélectionner les versions d’articles et sections présentes dans cette version de texte, c’est-à-dire celles créées avant et détruites après (ou jamais)
        articles =                                                                     \
            Article.select()                                                           \
                   .where(  (Article.texte == cid)                                     \
                          & (Article.debut <= version_texte.debut)                     \
                          & ((Article.fin >= version_texte.fin)|(Article.fin == None)) \
                         )

        versions_sections =                                                                            \
            Version_section.select()                                                                   \
                   .where(  (Version_section.texte == cid)                                             \
                          & (Version_section.debut <= version_texte.debut)                             \
                          & ((Version_section.fin >= version_texte.fin)|(Version_section.fin == None)) \
                         )

        # Créer l’en-tête
        date_fr = '{} {} {}'.format(version_texte.debut.day,
                                    MOIS2[int(version_texte.debut.month)],
                                    version_texte.debut.year)
        if version_texte.debut.day == 1:
            date_fr = '1er {} {}'.format(MOIS2[int(version_texte.debut.month)],
                                         version_texte.debut.year)
        contenu = nom + '\n'   \
                  + '\n'   \
                  + '- Date de consolidation : '+date_fr+'\n'            \
                  + '- [Lien permanent Légifrance](http://legifrance.gouv.fr/affichCode.do?cidTexte='+cid+'&dateTexte='+str(version_texte.debut.year)+'{:02d}'.format(version_texte.debut.month)+'{:02d}'.format(version_texte.debut.day)+')\n' \
                  + '\n' \
                  + '\n'

        # Créer les sections (donc tout le texte)
        contenu = creer_sections(contenu, 1, None, versions_sections, articles,
                                 version_texte, cid, cache)

        # Enregistrement du fichier
        f_texte = open(fichier, 'w')
        f_texte.write(contenu.encode('utf-8'))
        f_texte.close()

        # Exécuter Git
        subprocess.call(['git', 'add',
                         os.path.join(sousdossier, nom + '.md')],
                        cwd=dossier)
        subprocess.call([
            'git', 'commit', '--author="Législateur <>"',
            '--date="' + str(version_texte.debut) + 'T00:00:00Z"', '-m',
            'Version consolidée au {}'.format(date_fr), '-q', '--no-status'
        ],
                        cwd=dossier)

        if version_texte.fin == None:
            logger.info('Version {} enregistrée (du {} à maintenant)'.format(
                i_version, version_texte.debut))
        else:
            logger.info('Version {} enregistrée (du {} au {})'.format(
                i_version, version_texte.debut, version_texte.fin))
Esempio n. 6
0
def creer_markdown_texte(texte, cache):

    # Informations de base
    cid = texte[1]
    articles = Article.select(Article.id).where(Article.texte == cid)
    chemin_base = os.path.join(cache, 'xml', chemin_texte(cid))

    # Créer le répertoire de cache
    path(os.path.join(cache, 'markdown')).mkdir_p()
    path(os.path.join(cache, 'markdown', cid)).mkdir_p()

    for article in articles:

        # Si la markdownisation a déjà été faite, passer
        chemin_markdown = os.path.join(cache, 'markdown', cid,
                                       article.id + '.md')
        if os.path.exists(chemin_markdown):
            continue

        # Lecture du fichier
        chemin_article = os.path.join(chemin_base, 'article',
                                      decompose_cid(article.id) + '.xml')
        f_article = open(chemin_article, 'r')
        soup = BeautifulSoup(f_article.read(), 'xml')
        f_article.close()
        contenu = soup.find('BLOC_TEXTUEL').find('CONTENU').text.strip()

        # Logique de transformation en Markdown
        lignes = [l.strip() for l in contenu.split('\n')]
        contenu = '\n'.join(lignes)

        # - Retrait des <br/> en début et fin (cela semble être enlevé par BeautifulSoup)
        if all([
                lignes[l].startswith(('<br/>', r'<br />'))
                for l in range(0, len(lignes))
        ]):
            lignes[i] = re.sub(r'^<br ?/> *', r'', lignes[i])
        if all([
                lignes[l].endswith(('<br/>', r'<br />'))
                for l in range(0, len(lignes))
        ]):
            lignes[i] = re.sub(r' *<br ?/>$', r'', lignes[i])
        contenu = '\n'.join(lignes)

        # - Markdownisation des listes numérotées
        ligne_liste = [False] * len(lignes)
        for i in range(len(lignes)):
            if re.match(r'(?:\d+[°\.\)-]|[\*-]) ', lignes[i]):
                ligne_liste[i] = True
            lignes[i] = re.sub(r'^(\d+)([°\.\)-]) +', r'\1. ', lignes[i])
            lignes[i] = re.sub(r'^([\*-]) +', r'- ', lignes[i])
        contenu = '\n'.join(lignes)

        # - Création d’alinea séparés, sauf pour les listes
        contenu = lignes[0]
        for i in range(1, len(lignes)):
            if ligne_liste[i]:
                contenu = contenu + '\n' + lignes[i]
            else:
                contenu = contenu + '\n\n' + lignes[i]

        # Enregistrement
        f_markdown = open(chemin_markdown, 'w')
        f_markdown.write(contenu.encode('utf-8'))
        f_markdown.close()