Créer des documents différents à partir des mêmes sources via Jinja (méthode objet)
This content is not available in your language yet.
Le script Python profiling.py
ci-dessous permet de profiler du contenu à l’aide du puissant moteur de modèle Avec Jinja, vous pouvez définir des objets (audience, plateforme, version, etc.) et inclure ou exclure des blocs de texte selon leurs attributs.
-
Créez le fichier
texte-conditionnel.rst
suivant :Utilisation du texte conditionnel================================={% if public.elec %}.. admonition:: Danger pour les électriciensRisque d'électrocutionNe touchez pas les fils électriques.{% else %}.. admonition:: Danger pour les plombiersRisque de noyadeNe plongez pas dans la piscine.{% endif %} -
Définissez une classe Audience avec deux attributs pour les plombiers et les électriciens :
class Audience:def __init__(self,electrician,plumber):self.elec=electricianself.plum=plumber -
Créez une instance de la classe Audience dont la valeur est vraie pour les électriciens, et fausse pour les plombiers :
user=Audience(True,False) -
Créez et exécutez le script suivant :
#!/usr/bin/pythonclass Audience:def __init__(self,electrician,plumber):self.elec=electricianself.plum=plumberimport jinja2import sysreload(sys)sys.setdefaultencoding('utf8')user=Audience(True,False)env = jinja2.Environment(loader=jinja2.FileSystemLoader('./'))template = env.get_template('texte-conditionnel.rst')string=template.render(public=user)print(string) -
Le contenu du fichier
texte-conditionnel.rst
est écrasé et ne contient plus que les informations destinées aux électriciens. -
Créez une condition pour les publics autres que les éléctriciens ou les plombiers :
Utilisation du texte conditionnel================================={% if public.elec %}.. admonition:: Danger pour les électriciensRisque d'électrocutionNe touchez pas les fils électriques.{% elif public.plum %}.. admonition:: Danger pour les plombiersRisque de noyadeNe plongez pas dans la piscine.{% else %}.. admonition:: Aucun dangerSi vous n'êtes ni plombier, ni électricien, vous ne courezaucun danger.{% endif %} -
Créez une nouvelle classe pour les saisons :
class Season:def __init__(self,winter,spring,summer,autumn):self.win=winterself.spr=springself.sum=summerself.aut=autumn -
Créez des conditions plus complexes :
Utilisation du texte conditionnel================================={% if public.elec %}.. admonition:: Danger pour les électriciensRisque d'électrocutionNe touchez pas les fils électriques.{% elif public.plum and seas.wint %}.. admonition:: Danger pour les plombiersRisque de fractureNe plongez pas dans la piscine gelée.{% elif public.plum and seas.summ %}.. admonition:: Danger pour les plombiersRisque d'hydrocutionNe plongez pas dans l'eau froide lorsqu'il fait chaud.{% elif public.plum and seas.spri or seas.autu %}.. admonition:: Danger pour les plombiersRisque de quelque choseNe plongez pas dans la piscine, on ne sait jamais.{% else %}.. admonition:: Aucun dangerSi vous n'êtes ni plombier, ni électricien, vous ne courezaucun danger.{% endif %} -
Faites varier les valeurs des instances des classes Audience et Season pour filtrer le contenu du fichier
texte-conditionnel.rst
.#!/usr/bin/pythonclass Audience:def __init__(self,electrician,plumber):self.elec=electricianself.plum=plumberclass Season:def __init__(self,winter,spring,summer,autumn):self.wint=winterself.spri=springself.summ=summerself.autu=autumnimport jinja2import sysreload(sys)sys.setdefaultencoding('utf8')user=Audience(False,True)when=Season(False,False,False,True)env = jinja2.Environment(loader=jinja2.FileSystemLoader('./'))template = env.get_template('texte-conditionnel.rst')string=template.render(public=user,seas=when)print(string) -
Utilisez une variante plus lisible au niveau du fichier de contenu :
Il est peut-être plus intuitif d’indiquer dans le fichier de contenu une valeur conviviale sous forme de chaîne de caractères. Surtout si les rédacteurs ne sont pas familiarisés avec la programmation orientée objet, le test d’égalité
==
étant plus parlant pour la plupart des gens.Utilisation du texte conditionnel================================={% if public.personae == "electrician" %}.. admonition:: Danger pour les électriciensRisque d'électrocutionNe touchez pas les fils électriques.{% elif public.personae == "plumber" and public.season == "winter" %}.. admonition:: Danger pour les plombiersRisque de fractureNe plongez pas dans la piscine gelée.{% elif public.personae == "plumber" and public.season == "summer" %}.. admonition:: Danger pour les plombiersRisque d'hydrocutionNe plongez pas dans l'eau froide lorsqu'il fait chaud.{% elif public.personae == "plumber" and public.season == "spring" or public.season == "autumn" %}.. admonition:: Danger pour les plombiersRisque de quelque choseNe plongez pas dans la piscine, on ne sait jamais.{% else %}.. admonition:: Aucun dangerSi vous n'êtes ni plombier, ni électricien, vous ne courezaucun danger.{% endif %}Il est plus économique d’utiliser une seule classe d’objets, même si elle mélange un peu les choux et les carottes (autant dans cet exemple tiré par les cheveux que dans la vraie vie, où l’on mélangerait des publics, des versions, des plateformes, etc.).
#!/usr/bin/pythonclass Audience:def __init__(self,pers,seas):self.personae=persself.season=seasimport jinja2import sysreload(sys)sys.setdefaultencoding('utf8')user=Audience("plumber","winter")env = jinja2.Environment(loader=jinja2.FileSystemLoader('./'))template = env.get_template('texte-conditionnel.rst')string=template.render(public=user)print(string) -
Modifiez votre script pour indiquer le public et la saison en paramètres :
code/profiling.py Utilisation :
Terminal window $ ./profiling.py plumber autumnLes plus attentifs auront remarqué que ce script rend inutile la condition else du fichier de contenu, puisque l’on teste la valeur des paramètres avant son exécution.
Pour permettre le passage de valeurs non prévues et afficher le contenu du bloc else, il faut modifier le code comme suit :
#!/usr/bin/python# coding: utf8class Audience:def __init__(self,pers,seas):self.personae=persself.season=seasimport jinja2import sysreload(sys)sys.setdefaultencoding('utf8')if len(sys.argv) == 3:pubparam=str(sys.argv[1])seasparam=str(sys.argv[2])user=Audience(pubparam,seasparam)env = jinja2.Environment(loader=jinja2.FileSystemLoader('./'))template = env.get_template('texte-conditionnel.rst')string=template.render(public=user)print(string)else:print('Veuillez indiquer le public et la saison')