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
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, 'bases-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(), 'bases-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()
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
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, 'bases-xml') if os.path.exists(os.path.join(chemin_base, chemin_texte(cid, True, True))): chemin_base = os.path.join(chemin_base, chemin_texte(cid, True, True)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, True, False))): chemin_base = os.path.join(chemin_base, chemin_texte(cid, True, False)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, False, True))): chemin_base = os.path.join(chemin_base, chemin_texte(cid, False, True)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, False, False))): chemin_base = os.path.join(chemin_base, chemin_texte(cid, False, False)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, True, True) + '.xml')): chemin_base = os.path.join(chemin_base, chemin_texte(cid, True, True)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, True, False) + '.xml')): chemin_base = os.path.join(chemin_base, chemin_texte(cid, True, False)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, False, True) + '.xml')): chemin_base = os.path.join(chemin_base, chemin_texte(cid, False, True)) elif os.path.exists( os.path.join(chemin_base, chemin_texte(cid, False, False) + '.xml')): chemin_base = os.path.join(chemin_base, chemin_texte(cid, False, False)) else: raise Exception() # 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()
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))
def creer_historique_texte(texte, format, dossier, cache): # Créer le dossier si besoin sousdossier = '.' cid = texte[1] nom = texte[0] or cid path(dossier).mkdir_p() entree_texte = Texte.get(Texte.cid == cid) if entree_texte.nature in ('code', 'loi', 'ordonnance'): if not os.path.exists(os.path.join(dossier, entree_texte.nature + 's')): os.makedirs(os.path.join(dossier, entree_texte.nature + 's')) sousdossier = entree_texte.nature + 's' elif entree_texte.nature == 'decret': if not os.path.exists(os.path.join(dossier, u'décrets')): os.makedirs(os.path.join(dossier, u'décrets')) sousdossier = 'décrets' elif entree_texte.nature == 'arrete': if not os.path.exists(os.path.join(dossier, u'arrêtés')): os.makedirs(os.path.join(dossier, u'arrêtés')) sousdossier = 'arrêtés' if texte[2]: identifiant, nom_fichier = normalisation_code(nom) sousdossier = os.path.join('codes', identifiant) path(os.path.join(dossier, sousdossier)).mkdir_p() chemin_base = chemin_texte(cid, True) else: sousdossier = os.path.join(sousdossier, nom) nom_fichier = cid dossier = os.path.join(dossier, sousdossier) sousdossier = '.' if not os.path.exists(dossier): os.makedirs(dossier) fichier = os.path.join(dossier, nom_fichier + '.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 date_base_legi = '{} {} {} {}:{}:{}'.format('18', 'juillet', '2014', '11', '30', '10') # TODO changer cela subprocess.call( ['git', 'add', os.path.join(sousdossier, nom_fichier + '.md')], cwd=dossier) subprocess.call([ 'git', 'commit', '--author="Législateur <>"', '--date="' + str(version_texte.debut) + 'T00:00:00Z"', '-m', 'Version consolidée au {}\n\nVersions :\n- base LEGI : {}\n- programme Archéo Lex : {}' .format(date_fr, date_base_legi, version_archeolex), '-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))