Skip to content

Commit

Permalink
Abstraction des différentes fonctionnalités
Browse files Browse the repository at this point in the history
Les fonctionnalités abstraites sont :
* la syntaxe, actuellement seule la syntaxe Markdown est implémentée
* l’organisation des fichiers, actuellement deux organisations sont implémentées :
  un fichier unique ou un article par fichier
* le stockage, actuellement seul le stockage sur fichier est implémenté

Dans le futur, un stockage en Git-pack pourra être fait via l’abstraction
de stockage (cf #51).
  • Loading branch information
Seb35 committed Feb 25, 2018
1 parent 9a499ae commit d17332e
Show file tree
Hide file tree
Showing 10 changed files with 587 additions and 22 deletions.
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,32 @@ Ce programme a été initialement (début août 2014) développé en 5 jours ave
15. mise en production d’un service web qui mettrait à jour quotidiennement les dépôts Git
16. création d’un site web permettant la visualisation des modifications, proposerait des liens RSS, etc. de façon similaire à [La Fabrique de la Loi](http://www.lafabriquedelaloi.fr), à [Légifrance](http://legifrance.gouv.fr), aux sites du [Sénat](http://www.senat.fr) ou de l’[Assemblée nationale](http://www.assemblee-nationale.fr) (cf point 11)

### Nouvelle interface

```
from __future__ import unicode_literals
import marcheolex.exports, legi.utils, datetime
from marcheolex.FabriqueArticle import FabriqueArticle
# Syntaxe utilisée
md = marcheolex.exports.Markdown()
# Organisation des fichiers utilisée
fu = marcheolex.exports.FichierUnique()
fu.syntaxe = md
fu.fichier = 'truc'
fu.extension = '.md'
# Stockage des fichiers utilisé
sf = marcheolex.exports.StockageFichiers()
sf.organisation = fu
db = legi.utils.connect_db('/home/seb35/2-projets/archéo-lex/archéo-lex-dev/cache/sql/legi.sqlite')
fa = FabriqueArticle( db, sf, True )
fa.obtenir_texte_article( 3, 'LEGIARTI000030127268', datetime.date(1970,1,1), datetime.date(2038,1,1), 'VIGUEUR')
```


Informations complémentaires
----------------------------
Expand Down
46 changes: 24 additions & 22 deletions marcheolex/FabriqueArticle.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,30 +39,35 @@
from marcheolex.utilitaires import comp_infini
from marcheolex.utilitaires import comp_infini_strict
from marcheolex.utilitaires import comp_infini_large
from marcheolex.exports.Syntaxes import Syntaxes
from marcheolex.exports.Markdown import Markdown

class FabriqueArticle:

db = None
cache = None
depr_cache = ''
articles = {}
def __init__( self, db, stockage, cache = None, depr_cache = '' ):

def __init__( self, db, cache = None, depr_cache = None ):
"""
:param db:
Base de donnée.
:param cache:
boolean Utilisation d’un cache mémoire
"""
self.db = db

FabriqueArticle.db = db
FabriqueArticle.stockage = stockage

self.cache = cache
self.depr_cache = depr_cache
self.articles = {}


def effacer_cache():

self.articles = {}


def obtenir_texte_article( self, niveau, id, debut_vigueur_texte, fin_vigueur_texte, etat_vigueur_section ):

"""
Obtenir le texte d’un article donné par un id.
Expand All @@ -78,27 +83,28 @@ def obtenir_texte_article( self, niveau, id, debut_vigueur_texte, fin_vigueur_te
(string, datetime.date, datetime.date) - (texte, debut_vigueur, fin_vigueur) Texte de l’article, dates de début et fin de vigueur.
"""

# Rédaction du titre - TODO abstraire ceci
marque_niveau = ''
for i in range(niveau):
marque_niveau = marque_niveau + '#'

if id not in self.articles:

article = self.db.one("""
article = FabriqueArticle.db.one("""
SELECT id, section, num, date_debut, date_fin, bloc_textuel, cid
FROM articles
WHERE id = '{0}'
""".format(id))
id, section, num, date_debut, date_fin, bloc_textuel, cid = article
date_debut = datetime.date(*(time.strptime(date_debut, '%Y-%m-%d')[0:3]))
if date_fin == '2999-01-01':
date_fin = None
else:
date_fin = datetime.date(*(time.strptime(date_fin, '%Y-%m-%d')[0:3]))

chemin_markdown = os.path.join(self.depr_cache, 'markdown', cid, id + '.md')
if os.path.exists( chemin_markdown ):
if self.depr_cache and os.path.exists( chemin_markdown ):
f_article = open(chemin_markdown, 'r')
texte_article = f_article.read().decode('utf-8')
f_article.close()
else:
raise Exception
md = Markdown()
texte_article = md.transformer_depuis_html( bloc_textuel )

self.articles[id] = (texte_article, date_debut, date_fin)

Expand All @@ -115,14 +121,10 @@ def obtenir_texte_article( self, niveau, id, debut_vigueur_texte, fin_vigueur_te
if not self.cache:
self.effacer_cache()

# TODO abstraire ceci selon le format de sortie
texte_article = '' \
+ marque_niveau + ' Article' + (' ' + num.strip() if num else '') + '\n' \
+ '\n' \
+ texte_article + '\n' \
+ '\n' \
+ '\n'
# Enregistrement
niveaux = [ False ] * niveau
texte_retourne = self.stockage.ecrire_ressource( id, niveaux, num.strip() if num else '', '', texte_article )

return (texte_article, date_debut, date_fin)
return (texte_retourne, date_debut, date_fin)

# vim: set ts=4 sw=4 sts=4 et:
98 changes: 98 additions & 0 deletions marcheolex/exports/FichierUnique.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
#
# Archéo Lex – Pure Histoire de la Loi française
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# the LICENSE file for more details.

# Imports
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from . import Organisations
from . import Syntaxes


class FichierUnique( Organisations ):

"""
Tout le texte est écrit dans le même fichier.
Ce fichier doit être inscrit dans la propriété 'fichier' de la classe.
"""

fichier = ''
extension = ''
texte = ''

def obtenir_nom_fichier( self, id, parents, num, titre ):

"""
Obtenir le nom du fichier où écrire la ressource donnée en paramètres.
:param id:
(string) ID de la ressource.
:param parents:
(liste de strings) Niveaux parents de la ressource.
:param num:
(string) Numéro de la ressource par rapport aux autres de même niveau.
:param titre:
(string) Titre de la ressource.
:returns:
(string|None) Emplacement du fichier ou None pour ne pas écrire la ressource.
"""

if not self.fichier:
raise Exception()

return self.fichier + self.extension

def ecrire_ressource( self, id, parents, num, titre, texte ):

"""
:param id:
(string) ID de la ressource.
:param parents:
(liste de strings) Niveaux parents de la ressource.
:param num:
(string) Numéro de la ressource par rapport aux autres de même niveau.
:param titre:
(string) Titre de la ressource.
:param texte:
(string|None) Texte de la ressource.
:returns:
(string) Texte de la ressource.
"""

if not self.syntaxe:
raise Exception()

if id[4:8] == 'ARTI':
if num:
titre = 'Article ' + num
else:
titre = 'Article (non-numéroté)'
titre_formate = self.syntaxe.obtenir_titre( parents, titre )
texte = self.texte + titre_formate + texte + '\n\n'
elif id[4:8] == 'SCTA':
titre_formate = self.syntaxe.obtenir_titre( parents, titre )
texte = self.texte + titre_formate + '\n\n'
else:
raise Exception()

return texte

def ecrire_texte( self ):

"""
Écrire le fichier la version du texte.
"""

pass


# vim: set ts=4 sw=4 sts=4 et:
83 changes: 83 additions & 0 deletions marcheolex/exports/Markdown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
#
# Archéo Lex – Pure Histoire de la Loi française
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# the LICENSE file for more details.

# Imports
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import re
from . import Syntaxes


class Markdown( Syntaxes ):

def transformer_depuis_html( self, html ):

"""
Transformer un texte en Markdown à partir du HTML.
:param html:
(string) HTML à transformer.
:returns:
(string|None) Texte équivalent en Markdown.
"""

# Transformation des <br/> en <p>
texte = html
if texte == None:
texte = ''
texte = re.sub(r'<br ?\/>', '\n', texte)
texte = re.sub(r'<p>(.*?)<\/p>', r'\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'\n\n+', '\n\n', texte)

# Retrait des espaces blancs de fin de ligne
texte = '\n'.join([l.strip() for l in texte.split('\n')])
texte = texte.strip()

# - Markdownisation des listes numérotées
#lignes = texte.split('\n')
#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])

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

return texte

def obtenir_titre( self, parents, texte ):

"""
Obtenir le titre dans la syntaxe représentée.
:param parents:
(liste de strings) Niveaux parents de la ressource. :param texte:
(string) Texte du titre.
:returns:
(string|None) Texte du titre dans la syntaxe représentée.
"""

marque_niveau = ''
for i in range( len(parents) ):
marque_niveau = marque_niveau + '#'

return marque_niveau + ' ' + texte + '\n\n'


# vim: set ts=4 sw=4 sts=4 et:
71 changes: 71 additions & 0 deletions marcheolex/exports/Organisations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
#
# Archéo Lex – Pure Histoire de la Loi française
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# the LICENSE file for more details.

# Imports
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function


class Organisations:

syntaxe = None

def obtenir_nom_fichier( self, id, parents, num, titre ):

"""
Obtenir le nom du fichier où écrire la ressource donnée en paramètres.
:param id:
(string) ID de la ressource.
:param parents:
(liste de strings) Niveaux parents de la ressource.
:param num:
(string) Numéro d’ordre de la ressource par rapport aux autres de même niveau.
:param titre:
(string) Titre de la ressource.
:returns:
(string|None) Emplacement du fichier ou None pour ne pas écrire la ressource.
"""

raise NotImplementedError

def ecrire_ressource( self, id, parents, titre, texte ):

"""
Écrire la ressource en cours.
:param id:
(string) ID de la ressource.
:param parents:
(liste de strings) Niveaux parents de la ressource.
:param num:
(string) Numéro de la ressource par rapport aux autres de même niveau.
:param titre:
(string) Titre de la ressource.
:param texte:
(string|None) Texte de la ressource.
:returns:
(string) Texte de la ressource.
"""

raise NotImplementedError

def ecrire_texte( self ):

"""
Écrire le fichier la version du texte.
"""

pass


# vim: set ts=4 sw=4 sts=4 et:
Loading

0 comments on commit d17332e

Please sign in to comment.