Les données

Quand on parle de génération dynamique, ça sous entend qu'il y a des données quelques part. Le format de données structurées compris par défaut par XUL est le RDF qui est aussi du XML. Pour les données qui viennent d'autres sources, comme une base de données, ca sera un autre billet :) . Plus d'information sur le format RDF sur xulfr.org ou carrément sur la-grange.net.

Par exemple, si je veux afficher les données dans une boîte :

<box datasources="bisounours.rdf" ref="urn:bisounours">
...
</box>
  • datasources est l'URL du fichier
  • ref est l'URN du noeud qu'on veut afficher (voir explication sur les espaces de noms)

Voilà la source RDF.

Les gabarits

Il faut maintenant générer ce qu'il y a à l'intérieur. On va simplement faire un gabarit (template) de ce qui doit se répéter. Il faut donc écrire un squelette avec des variables comme dans la logique d'un langage côté serveur. Mais ceux qui ont l'habitude de faire ca savent très bien que c'est pas si simple, il y a souvent des exceptions, des comparaisons à faire, des conditions à vérifier. C'est à ce niveau là que ca devient complexe.

Pour l'instant, on en est là :

<box datasources="bisounours.rdf" ref="urn:bisounours">
	<template>
	...
	</template>
</box>

Les règles

Donc, dans un gabarit, il y a des règles. Elles permettent de filtrer l'affichage. En fait, la syntaxe complète est plutot lourde parce qu'elle permet de filtrer très précisément. C'est pour ca qu'il existe une syntaxe simplifiée.

Syntaxe simplifiée

Si on veut simplement afficher tous les enregistrements :

<box datasources="bisounours.rdf" ref="urn:bisounours">
	<template>
		<label uri="rdf:*" value="rdf:urn:bisounours#name"/>
	</template>
</box>
  • uri="rdf:*" indique la partie qui doit etre générée
  • rdf:urn:bisounours#name représente l'information à afficher

Et maintenant avec une règle :

<box datasources="bisounours.rdf" ref="urn:bisounours" xmlns:bisounours="urn:bisounours:rdf#">
	<template>
		<rule bisounours:generation="1">
			<label uri="rdf:*" value="rdf:urn:bisounours#name"/>
		</rule>
	</template>
</box>

J'ai besoin de filtrer le champ generation, alors je déclare l'espace de nom bisounours. On filtre grace à des attributs de la balise <rule>. Ici j'affiche tous les bisounours de première génération.

Ce sont juste des exemples, la syntaxe simplifiée ne se résume pas qu'à ca. Plus de détails sur xulfr.org.

Syntaxe complète

Je ne vais pas expliquer cette syntaxe là, ca serait trop long. Je pense même qu'elle mérite un billet à part, et mon but c'est surtout de présenter les aspects de XUL, pas de faire des tutoriaux. Si vous êtes arrivé jusqu'ici sans avoir eu peur, vous pouvez lire ca.

Conclusion

Il y a vraiment de tout dans XUL. Lorsque j'ai lu la documentation sur la syntaxe complète des gabarits, ma première réaction était : "c'est quoi ce bordel ?". Et puis, ca commence à rentrer et c'est pas si compliqué. C'était surtout lié au format RDF qui est un format complexe quand on découvre, mais en fin de compte, il rempli plutot bien son rôle quand on lit pourquoi il a été inventé.

Je fini par un exemple de ce que ca sera avec une requête SQLite qui a l'air beaucoup plus compréhensible parce que je manipule ce genre de données depuis longtemps. Je pense même que lorsque mozStorage sera par défaut dans XulRunner, la plupart des gens utiliseront ca (c'est mon avis) :) .

PS: Plus d'infos sur les bisounours