Re : Hoa_Xyl vient d'apparaître dans le tronc
Hey hey
,
Voici l'implémentation des overlays dans XYL. Il ne manque pas grand chose, le principal est là et ça marche vachement bien (c'est beau à voir, j'vous jure !)
.
L'idée est la suivante.
On a un fichier du genre :
<?xml version="1.0" encoding="utf-8"?>
<?xyl-use href="contacts.xyl"?>
<page>
<p>
<ul id="z" foo="bar" class="ye">
<li>Doudi</li>
<li>Titine</li>
<li>Toto</li>
<li>Tata</li>
</ul>
</p>
<contacts bind="?foo" />
</page>Pas de soucis jusque là, on connaît bien. On retrouve notre <?xyl-use?> (maintenant obligatoirement placé en en-tête) qui devrait sûrement contenir la définition des différents composants (notamment <contacts />). Mais on a ajouté du code XYL écrit en dur : la première ul#z.
Sauf que voilà, cette liste on aimerait bien la modifier. Par exemple : on livre une application qui permet d'embarquer des modules. Prenons un exemple vraiment simple à comprendre : un blog. Et vous êtes le développeur d'un module/extension pour ce blog. Vous voulez dire : « je veux ajouter un élément dans cette liste mais sans avoir à toucher le code de base, sinon, à chaque mise à jour mon travail est foutu ! ». On réfléchit … Comment faire ?
Tada, on a les overlays.
On écrit quoi alors ?
On va écrire un fichier (overlay.xyl par exemple) :
<?xml version="1.0" encoding="utf-8"?>
<overlay>
<ul id="z" tic="toc" class="pee">
<li id="zibzib" position="last() - 2">Azizti</li>
<li>Hobbi</li>
</ul>
</overlay> Ça dit quoi ? On a un overlay. À l'intérieur, on a un élément avec un identifiant. On va chercher cet identifiant dans le document initial. S'il existe, on va faire un merge des deux, donc on va commencer par ajouter les attributs. Ici on notera qu'on aimerait bien que les classes s'additionnent (on a "ye" et "pee" ici, on aimerait que ça donne "ye pee").
Ensuite à l'intérieur, on a d'autres éléments. Le premier comporte un identifiant. On le cherche dans le sous-arbre de z et on ne le trouve pas. Bien, soit. On le positionne alors ! Sa position est : « à partir du dernier moins deux ». Bien. On trouve le dernier élément et on le place 2 éléments avant.
Enfin, le dernier élément n'a pas d'identifiant, ni de position, donc on l'ajoute à la suite des éléments déjà existants.
Ensuite, on va essayer de lier notre document initial avec notre overlay. On s'y prendrait donc de cette façon :
<?xml version="1.0" encoding="utf-8"?>
<?xyl-use href="contacts.xyl"?>
<?xyl-overlay href="overlay.xyl"?>
<page>
<p>
… Vous voyez la différence ? On ajoute <?xyl-overlay?>. Simple.
Et le résultat ce sera quoi ? On va mouliner tout ça et faire un rendu HTML5, soit :
<!DOCTYPE html>
<html>
<body>
<p>
<ul>
<li>Doudi</li>
<li>Titine</li>
<li id="zibzib">Azizti</li>
<li>Toto</li>
<li>Tata</li>
<li>Hobbi</li>
</ul>
</p>
<h1>Foobar</h1>
…On remarque bien que les nouveaux éléments dans le menu ce sont positionnés ! C'est magique
.
Je trouve ce mécanisme vraiment très pratique. Notez que je n'ai rien inventé : j'ai juste implémenté les overlays XUL dans XYL, avec des petits plus au niveau positionnement (les opérations arithmétiques ne sont pas possibles dans XUL).
Il faudrait ajouter un manifest pour faciliter les inclusions des overlays, comme ça on toucherait encore moins au fichier principal. Mais je dois réfléchir à ça, savoir si ce serait aussi pratique que je ne le pense.
Revenons quelques secondes sur l'attribut position.
Il peut prendre des valeurs entières, tout simplement, pour expliciter une position. Ainsi :
<tag position="7" /> est valide.
Mais on peut aussi faire des opérations (arithmétiques du premier ordre sur les naturels), donc l'addition, la soustraction, la multiplication et la division (entière ou flottante. Donc :
<tag position="7 * 7 - 3.5 * 2" />On peut aussi placer notre élément par rapport à un dernier élément, grâce à la fonction last(). On peut donc combiner tout ça comme on veut :
<tag position="last() - last() + 1" /> Oui, autant faire 1 directement, mais ce serait moins drôle
.
Ce qu'il me reste à faire c'est placer un élément par rapport à un identifiant d'un autre (et j'aimerais que les opérations fonctionnent également avec). Un truc du genre : position(someID) + 7 par exemple. Je ne sais pas si la forme serait correcte. Il faut que je regarde par rapport à XPath 2.0 et les CSS Query Selectors pour ne pas faire de bêtises.
Petite note avant de terminer : pour ceux qui ont le doute, on peut utiliser les yield pour produire du code XYL, puis appliquer un overlay sur ce code fraîchement produit, il n'y a aucun problème. Les overlays s'appliquent après computation des yields.
Alors, vous en pensez quoi
?