Templates itératifs en Python

top

Introduction

Cet article a pour but de présenter l'usage des templates itératifs en Python. Toutes les informations importantes se trouve dans l'article parent que je vous invite à consulter.

top

Opération de remplacement

L'opération de base que doit assurer un système de template est de pouvoir effectuer des remplacements d'une clé par une valeur. Ce mode là est un mode "squelette", c.-à-d. qu'il va être utilisé dans la structure de base d'un site internet.

Par exemple : la page générale du site dans laquelle il y a une entête, un menu et un contenu. Le squelette va comporter toute la structure XHTML avec les trois éléments de contenu à remplir.

Code

Template


<h3><!--%titre%--></h3>
<p class="description">
	<!--%description%-->
</p>
<address>
	<!--%adresse%-->
</address>
	

Données


data = {
	'titre' : Titre
	'adresse' : Rue des Catalans 38, 2800 Les Bois
	'description' : Une <strong>description</strong> selon la <em>loi</em>.
}
	

Résultat



Titre

Une description selon la loi.

Rue des Catalans 38, 2800 Les Bois

HTML


<h3>Titre</h3>
<p class="description">
	Une <strong>description</strong> selon la <em>loi</em>.
</p>
<address>
	Rue des Catalans 38, 2800 Les Bois
</address>
	
top

Boucle

La boucle, second élément indispensable, dès qu'il s'agit d'interagir avec une banque de données. Cet élément n'ajoute pas beaucoup de complexité mais améliore grandement les possiblités d'utilisations.

Exemple d'utilisation : un fil RSS contenant les dernières nouvelles/modifications d'un weblog où les éléments de la boucle proviendrait d'une base de données SQL. Ci-dessous l'exemple affiche un menu. Vous noterez la présence d'un if dont l'usage est expliqué au point suivant.

Attention : si deux (ou plus) boucles ont le même nom, la seconde prendra le contenu de la première. En jouant avec ça, vous trouverez le moyen simple de générer un même contenu dans une page sans se fatiguer.

Code

Template


<ol><!--%loop:menu%-->
	<li>
		<a href="<!--%url%-->" <!--%if:['titre'] != ""%-->
			title="<!--%titre%-->"<!--%endif%-->
			><!--%texte%--></a>
	</li><!--%endloop%-->
</ol>
	

Données


list = [
	{'url': 'http://www.lzi.ch', 'titre': 'Plop !', 'texte': 'LolZ'},
	{'url': 'http://www.dosimple.ch', 'texte': 'doSimple'},
]
	

Résultat

  1. LolZ
  2. doSimple

HTML


<ol>
	<li>
		<a href="http://www.lzi.ch" 
			title="Plop !"
			>LolZ</a>
	</li>
	<li>
		<a href="http://www.dosimple.ch" 
			>doSimple</a>
	</li>
</ol>
	
top

Instruction conditionnelle

Quand il s'agit d'amener un peu plus de flexibilité au niveau du résultat difficile de faire l'impasse sur les instructions conditionnelles (if).

Ci-dessous, un exemple d'affiche l'information sur le nombre de commentaires de manière française (en évitant le trop vu et disgracieux 0 commentaire(s)).

Code

Template


<p><!--%if:['compteur'] == 0%-->
	Aucun commentaire
<!--%elseif:['compteur'] == 1%-->
	Un commentaire
<!--%elseif:['compteur'] == 2%-->
	Deux commentaires
<!--%else%-->
	<!--%compteur%--> commentaires
<!--%endif%--></p>
	

Données


data = {
	'compteur' : 2
}
	

Résultat

Deux commentaires

HTML


<p>
	Deux commentaires
</p>
	
top

Récursivité

Le meilleur est gardé pour la fin, la récursivité. L'outil indispensable pour afficher une arborescence de fichiers, la carte d'un site ou autre. Mais cette efficacité n'est pas évidente à manipuler et demande de ne pas s'y jeter à la légère. Un nœud de l'arbre se forme ainsi : ({valeurs},[sous-branches]) alors qu'une feuille (fin de l'arbre qui ne possède pas de branches) ainsi : ({valeurs},).

Un conseil, jetez un œil à la version utilisant PHP qui peut vous aider à comprendre le doux mix entre les listes et les dictionnaires.

Code

Template


<!--%recursion:biglist%-->
<ul><!--%recursion:loop%-->
	<li>
	<span style="<!--%if:['strong']%-->font-weight:bold;<!--%endif%--><!--%if:['em']==1%-->text-style:italic;<!--%endif%-->">
	<!--%nom%--></span><!--%recursion:body%--></li><!--%recursion:endloop%-->
</ul><!--%endrecursion%-->
	

Données


list = [
	({'nom': 'Une'},),
	({'nom': 'tres'},
		[
			({'nom': 'belle'},
				[
					({'nom': 'liste','strong' : 1, 'em' : 1},)
				]
			),
			({'nom': 'et'},
				[
					({'nom': 'cool', 'em' : 1},)
				]
			),
			({'nom': 'mais','strong':1},
				[
					({'nom': 'aussi'}, 
						[
							({'nom': 'génial.','em':1},)
						]
					)
				]
			)
		]
	)
]
	

Résultat

HTML



<ul>
	<li>
	<span style="">
	Une</span></li>
	<li>
	<span style="">
	tres</span>
<ul>
	<li>
	<span style="">
	belle</span>
<ul>
	<li>
	<span style="font-weight:bold;text-style:italic;">
	liste</span></li>
</ul></li>
	<li>
	<span style="">
	et</span>
<ul>
	<li>
	<span style="text-style:italic;">
	cool</span></li>
</ul></li>
	<li>
	<span style="font-weight:bold;">
	mais</span>
<ul>
	<li>
	<span style="">
	aussi</span>
<ul>
	<li>
	<span style="text-style:italic;">
	génial.</span></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
	

[Python Powered], [Open Source]

Le 13 avril 2005, par Yoan Blanc, doSimple.ch