示例#1
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()
示例#2
0
def lire_code_xml(cle, cache):

    if not cle[2]:
        return

    cidTexte = cle[1]
    chemin_base = os.path.join(cache, 'xml', chemin_texte(cidTexte))
    if not os.path.exists(chemin_base):
        raise Exception()

    # Lire les informations sur le texte
    ranger_texte_xml(chemin_base, cidTexte, 'code')
示例#3
0
def lire_code_xml(cle, cache):
    
    if not cle[2]:
        return
    
    cidTexte = cle[1]
    chemin_base = os.path.join(cache, 'xml', chemin_texte(cidTexte))
    if not os.path.exists(chemin_base):
        raise Exception()
    
    # Lire les informations sur le texte
    ranger_texte_xml(chemin_base, cidTexte, 'code')
示例#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))
示例#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))
示例#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()