Hey
,
Un changeset important hier soir : l'ajout de modèles dans des éléments XML. C'est une notion qui vient d'HTML 5, avec les model contents. On y trouve flow content, embedded content, phrasing content etc. Le phrasing model content est intéressant car c'est en partie ce qui fait qu'HTML n'est pas du XML. En effet, écrire :
<foo>
abc
<bar>def</bar>
ghi
</foo>
est de l'HTML correct mais surtout pas de l'XML-strict.
Et pourquoi est-ce gênant dans notre cas ? Parce qu'on aimerait bien comprendre la « syntaxe HTML » avec Hoa_Xml non ? Par exemple pour XYL (Hoa_Xyl hérite de Hoa_Xml), on aimerait ajouter des composants/éléments de sémantiques (semantics components) comme en HTML, à savoir par exemple :
<p>The <em>cake</em> is a <strong>lie</strong>!</p>
Sachez petit(e)s ami(e)s geek(e)s que c'est impossible à interpreter avec SimpleXML. SimpleXML qui lui est la base de Hoa_Xml. En fait, Hoa_Xml ne fait qu'(énormément ')enrichir SimpleXML et permet de le hacker au maximum (sans pour autant perdre en vitesse et en mémoire).
SimpleXML va réussir à tout retrouver (The, is a et !) mais ce sera sur des cas particuliers. Il faut déjà connaître la structure du document manipuler pour y arriver.
C'est alors que j'ai ajouté la méthode Hoa_Xml_Element_Basic::readAsPhrasingModel(2) (tadaa).
Cette méthode va passer par le DOM pour transformer les textes entre les balises en élément <__text> (par défaut) avec un espace de nom particulier ('' par défaut). Ce sont respectivement le second et le premier paramètre.
Ainsi, on uniformise tout et on est capable de faire ce qu'on veut sans se soucier de ce qu'on manipule.
Voici un exemple :
<?php
require_once '/var/hoa/Core.php';
import('StringBuffer.Read') and load();
import('Xml.Read') and load();
$in = new Hoa_StringBuffer_Read();
$in->initializeWith(
'<?xml version="1.0" encoding="utf-8"?>' . "\n" .
'<foo xmlns="foobar">' . "\n" .
' <p>The <em>cake</em> is a <strong>lie</strong>!</p>' . "\n" .
'</foo>'
);
$xml = new Hoa_Xml_Read($in);
var_dump(
$xml->p,
$xml->p->useNamespace('foobar')->selectChildElements(),
$xml->p->readAsPhrasingModel('foobar')
);
qui affichera :
object(Hoa_Xml_Element_Read)#25 (2) {
["em"]=>
string(4) "cake"
["strong"]=>
string(3) "lie"
}
array(2) {
[0]=>
object(Hoa_Xml_Element_Read)#28 (1) {
[0]=>
string(4) "cake"
}
[1]=>
object(Hoa_Xml_Element_Read)#29 (1) {
[0]=>
string(3) "lie"
}
}
array(5) {
[0]=>
object(Hoa_Xml_Element_Read)#33 (1) {
[0]=>
string(4) "The "
}
[1]=>
object(Hoa_Xml_Element_Read)#32 (1) {
[0]=>
string(4) "cake"
}
[2]=>
object(Hoa_Xml_Element_Read)#34 (1) {
[0]=>
string(6) " is a "
}
[3]=>
object(Hoa_Xml_Element_Read)#35 (1) {
[0]=>
string(3) "lie"
}
[4]=>
object(Hoa_Xml_Element_Read)#36 (1) {
[0]=>
string(1) "!"
}
}
L'affichage de SimpleXML est un peu compliqué à lire mais il se comprend bien.
Du coup, on a une interface Hoa_Xml_Element_Model_Phrasing pour marquer des éléments concrets (a contrario de abstrait). Pratique pour XYL par exemple. Dans tous les cas, lors de la génération d'un arbre concret, si l'élément comporte l'interface Hoa_Xml_Element_Model_Phrasing, alors ses enfants seront construits en utilisant readAsPhrasingModel() et non selectChildElements(). Bref, le traitement sera automatique en somme.
Voilà pour les avancements. Du coup, XYL va se voir prochainement ajouter une tripottée d'élément sémantique
.
Enfin, pour les curieux, voici le (tout petit mais utile) diff : http://hg.hoa-project.net/Central/rev/f545beb5a9bf.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »