Ticket #359 (closed defect: fixed)
Formatage des caractères spéciaux HTML
Reported by: | sacha | Owned by: | olivier |
---|---|---|---|
Priority: | normal | Milestone: | 2.1 |
Component: | module:core | Version: | 2.0 RC2 |
Severity: | normal | Keywords: | |
Cc: |
Description
Comme signalé par Mirovinben, il y a un petit soucis dans l'affichage de l'extrait du contenu des billets dans la balise meta description, le contenu HTML est supprimé mais certaines entités HTML (ici, le guillemet double) ne le sont pas - ce qui rend le code non-conforme au XHTML.
Le patch ci-joint est sensé corriger ces problèmes. Pour procéder correctement, on supprime d'abord les balises HTML, on interprète les entités HTML (pour ne pas les couper en plein milieu, et pour que la coupure corresponde exactement au nombre de caractères affichés, càd que & contera pour 1 caractère au lieu de 5), on coupe la chaîne, puis enfin on encode les caractères spéciaux HTML pour afficher le résultat.
Change History
comment:2 follow-up: ↓ 3 Changed 17 years ago by olivier
Sauf que cut_string ne va jamais couper une entité au milieu puisque qu'il coupe aux espaces. Un simple encode_html="1" est suffisant. Je l'ajoute tout à l'heure.
comment:3 in reply to: ↑ 2 Changed 17 years ago by sacha
Replying to olivier:
Sauf que cut_string ne va jamais couper une entité au milieu puisque qu'il coupe aux espaces. Un simple encode_html="1" est suffisant. Je l'ajoute tout à l'heure.
Très juste. Mais j'ai voulu prévoir une situation peu probable, mais qui m'est arrivée dans un autre contexte, où cut_string ne peut pas couper la chaîne à côté de l'espace, car celui-ci se trouve trop loin par rapport à la limite de coupure.
comment:4 Changed 17 years ago by olivier
- Status changed from new to assigned
J'en reste donc à un ajout de encode_html="1" parce que, à ce stade, il n'est pas question que je supprime des méthodes publiques ou change des procédures utilisées un peu partout :)
comment:5 Changed 17 years ago by olivier
- Status changed from assigned to closed
- Resolution set to fixed
comment:6 Changed 17 years ago by sacha
- Status changed from closed to reopened
- Resolution fixed deleted
Oui mais malheureusement non, on se retrouve avec des caractères échappés deux fois.
Input boîte de saisie du billet : → Simple billet de test : 1 < 2 ; " ; & Output HTML : → <p>Simple billet de test : 1 < 2 ; " ; &</p> Output META "description" dès r2221 : → Simple billet de test&nbsp;: 1 &lt; 2&nbsp;; "&nbsp;; &amp; Output META "description" avec mon patch : → Simple billet de test : 1 < 2 ; " ; &
Les méthodes publiques, on peut les garder, par contre global_filter n'est utilisé qu'une seule fois dans class.dc.template. Il n'y aura pas non plus de problèmes de cache car les fichiers template ont été modifiés. Mais c'est toi qui voit, c'est juste une suggestion ;)
Autrement il y a une autre solution, c'est d'échapper le guillemet dès l'enregistrement du billet, peut-être avec ceci dans class.dc.blog.php aux alentours de la ligne 1259 :
$exerpt_xhtml = str_replace('"','"e;',$excerpt_xhtml); $content_xhtml = str_replace('"','"e;',$content_xhtml);
Cela fonctionne quelque soit le "Text formater" utilisé. Le seul inconvéniant c'est que le problème va persister avec les anciens billets.
J'envoie le patch par mail, Trac affiche une erreur interne.