1

Je veux tout bêtement parser une page en XHTML 1.0 strict pour modifier un peu son comportement (en fait, l'idée c'est de tester un peu le HTML 5 et le XHTML 2 avec les navigateurs, mais sans me casser la tête => je bufferise tout, et je modifie un peu le rendu)
Pour l'instant, je veux juste prendre en entrée le XHTML 1.0, le parser, et le réafficher tel quel (donc, normalement, ça devrait marcher sans souci).

if($xhtml5) { ob_start('ob_flush_transform'); }                       
function ob_flush_transform($buffer) {
        global $xml_output;
        $xml_output = '';
        $xml_parser = xml_parser_create();
        xml_set_element_handler($xml_parser, "transtype_begin", "transtype_end");
        xml_set_character_data_handler($xml_parser, "transtype_content");
        xml_set_default_handler($xml_parser, "transtype_default");
        xml_parse($xml_parser, $buffer);
        xml_parser_free($xml_parser);
        return $xml_output;
}               
function transtype_begin($parser, $name, $attr) {
        global $xml_output;
        $attrs = '';
        foreach($attr as $key => $value) {
                $key = strtolower($key);
                $attrs .= " $key=\"$value\"";
        }
        $xml_output .= "<$name$attrs>\n";
}       
function transtype_end($parser, $name) {
        global $xml_output;
        $name = strtolower($name);
        $xml_output .= "</$name>\n";
}
function transtype_content($parser, $content) {
        global  $xml_output;
        $xml_output .= $content;
}
function transtype_default($parser, $content) {
        global $xml_output;
        $xml_output .= $content;
}

Cependant, dans mon code XHTML $buffer (farpaitement valide) j'ai :
<meta name="copyright" content="&copy; 2008 flan" />
Dans le code généré $xml_output, j'ai
&copy;<meta name="copyright" content=" 2008 flan">
</meta>

Pourquoi le &copy; bouge-t-il ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

2

A priori tu utilises un parser XML dans ton document, mais &copy; n'est pas une entité XML, mais c'est bien une entité XHTML/HTML, Je pense que c'est ça l'erreur.
D'ailleurs tu n'appelles pas la fonction htmlentities dans ton code donc si je ne me trompe pas, c'est buggué.
Dans la version actuelle, &amp;copy; à la place de &copy; devrait fonctionner (mais ton code resterai buggué), et si tu échappes bien les entités dans les attributs avec htmlentities($texte, ENT_QUOTES, 'UTF-8'), alors il te suffira d'utiliser l'encodage UTF-8 pour tout les caractères.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

GoldenCrystal (./2) :
A priori tu utilises un parser XML dans ton document, mais &copy; n'est pas une entité XML, mais c'est bien une entité XHTML/HTML, Je pense que c'est ça l'erreur.
D'ailleurs tu n'appelles pas la fonction htmlentities dans ton code donc si je ne me trompe pas, c'est buggué.
Dans la version actuelle, &amp;copy; à la place de &copy; devrait fonctionner (mais ton code resterai buggué), et si tu échappes bien les entités dans les attributs avec htmlentities($texte, ENT_QUOTES, 'UTF-8'), alors il te suffira d'utiliser l'encodage UTF-8 pour tout les caractères.

Je croyais que le XHTML était du XML pur ? hum Et je ne comprends pas bien pourquoi je devrais échapper des caractères, en l'occurence ? Vu que les seuls < et > (par exemple) qui restent sont ceux qui ont une signification XML, non ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

Autre question, même si ce n'est pas du PHP :

t=UTF-8"); si je fais header("Content-Type: application/xhtml+xml; charseesponseText;, un simple document.getElementById(module).innerHTML = xmlhttp.r va échouer car il me dit que mon document est en lecture seule hum. Si je le supprime, ça marche nickel... Je ne comprends pas trop hum

Au fait, j'ai essayé le code suivant :
        foreach($attr as $key => $value) {
                $key = strtolower($key);
                $value = htmlentities($value);
                $attrs .= " $key=\"$value\"";
        }

Et ça ne marche pas mieux, y a l'air d'avoir pas mal d'entitées XHTML qui ne passent pas hum
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

5

Flanker (./3) :
GoldenCrystal (./2) :
A priori tu utilises un parser XML dans ton document, mais &copy; n'est pas une entité XML, mais c'est bien une entité XHTML/HTML, Je pense que c'est ça l'erreur.
D'ailleurs tu n'appelles pas la fonction htmlentities dans ton code donc si je ne me trompe pas, c'est buggué.
Dans la version actuelle, &amp;copy; à la place de &copy; devrait fonctionner (mais ton code resterai buggué), et si tu échappes bien les entités dans les attributs avec htmlentities($texte, ENT_QUOTES, 'UTF-8'), alors il te suffira d'utiliser l'encodage UTF-8 pour tout les caractères.

Je croyais que le XHTML était du XML pur ? hum Et je ne comprends pas bien pourquoi je devrais échapper des caractères, en l'occurence ? Vu que les seuls < et > (par exemple) qui restent sont ceux qui ont une signification XML, non ?

Oui, XHTML est du XML pur, mais XML ne supporte que 5 entités: &amp; &lt; &gt; &quot; &apos; Ces entités sont indispensables pour que tu puisse insérer les caractères correspondant dans ton code XML, les autres entités sont définies dans le DTD (XHTML 1.0 Strict par exemple) que tu as associé au document.
Et à priori le parseur XML de PHP n'est pas très souple (en fait la documentation est tellement vaue que voilà) donc je ne sais pas du tout comment il gère les entités.
Après quand tu fais marcher le parseur, il va lui automatiquement remplacer &lt; par <, &gt; par > etc... Car c'est le comportement normal.
Donc si tu as <tag>&lt;</tag> il va te donner '<' que tu dois à nouveau échapper avec htmlentities tongue
Et puisqu'à priori tu utilise du code UTF-8 pour le XML il faut bien le spécifier à PHP pour qu'il puisse bien faire son boulot (sauf erreur de ma part il n'est pas nativement utf-8) donc htmlentities($texte, ENT_QUOTES, 'UTF-8'), fonctionnera partout (attributs et texte des balises) même si tu peux être plus précis et changer le ENT_QUOTES selon où tu es dans le flux. (ça fera économiser quelques octets tongue)

Le code comme ça marchera peut-être, je ne sais pas trop ^^
if($xhtml5) { ob_start('ob_flush_transform'); }                       
function ob_flush_transform($buffer) {
        global $xml_output;
        $xml_output = '';
        $xml_parser = xml_parser_create('UTF-8'); // Apparemment c'est par défaut UTF-8 sur certains PHP mais pas tous...
        xml_set_element_handler($xml_parser, "transtype_begin", "transtype_end");
        xml_set_character_data_handler($xml_parser, "transtype_content");
        xml_set_default_handler($xml_parser, "transtype_default");
        xml_parse($xml_parser, $buffer);
        xml_parser_free($xml_parser);
        return $xml_output;
}               
function transtype_begin($parser, $name, $attr) {
        global $xml_output;
        $attrs = '';
        foreach($attr as $key => $value) {
                $key = strtolower($key);
                $value = htmlentities($value, ENT_COMPAT, 'UTF-8');
                $attrs .= " $key=\"$value\"";
        }
        $xml_output .= "<$name$attrs>\n";
}       
function transtype_end($parser, $name) {
        global $xml_output;
        $name = strtolower($name);
        $xml_output .= "</$name>\n";
}
function transtype_content($parser, $content) {
        global  $xml_output;
        $xml_output .= htmlentities($content, ENT_NOQUOTES, 'UTF-8');
}
function transtype_default($parser, $content) {
        global $xml_output;
        $xml_output .= htmlentities($content, ENT_NOQUOTES, 'UTF-8');
}


Sinon de ce que j'avais testé, IE ne digère pas le application/xml+xhtml. Et d'autre part comme tu spécifie un document XML pur, de mémoire firefox acceptait l'utilisation de innerHTML que si le code inséré était du XML valide, mais je ne sais pas les détails pour du xhtml+xml ^^
De toutes façons la façon recommendée est d'utiliser le DOM pour insérer les éléments (par contre à chaque fois que j'ai fait ça j'ai constaté que les nouveaux éléments n'héritaient pas du style défini dans la page donc... je sais pas trop ^^)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

6

Ok, merci pour tout, je vais essayer ça ce soir happy

Pfff c'est quand même bien le bordel, tout ça :/
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

7

faut avouer que tu fais des trucs pas trop standards aussi grin

(mais c'est intéressant, j'avoue!)

8

Bin, en même temps, c'est juste transformer un flux XML en un autre tongue je ne trouve pas ça si étrange comme idée grin

Sinon, j'aurais toujours la possibilité de construire la page différemment suivant le résultat demandé, mais bon, je n'aime pas trop l'idée
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

9

Flanker (./9) :
transformer un flux XML en un autre

cette phrase, ça me fait tilt: t'as pas pensé aux XSL? c'est pas tenable?

(et puis le souci des entités c'est normal, pour qu'elles soient toutes gérées, t'as besoin de la dtd et d'un parser qui sache la prendre en compte)

10

En fait, je ne connais pas du tout XSL, et tout le reste du code est écrit grin Ça m'emmerderait un peu de devoir refaire une grosse partie du site :/
Mais bon, c'est pas con, je vais y jeter un œil, en fait ^^
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

11

ok, si ton temps est précieux vaut mieux ptet pas se perdre dans xsl, sauf si ça te simplifie vraiment la vie.

en gros t'itères des noeuds et t'en réécris d'autre, en se basant sur un doc xml qui décrit le bordel.

voir w3schools la dessus, ça fait des tutos bien faits rapides.

12

bah je crois que je vais finir le reste du site (j'ai encore pas mal de boulot grin) et j'y jetterai un oeil à ce moment-là ^^
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant