Améliorations du serializer de Mozilla
Par Laurentj le lundi, avril 27 2009, 11:42 - Geek-log - Lien permanent
Enfin ! Ça y est ! C'est arrivé dans le trunk samedi ! Mon super gros patch sur le serializer ! Il y a 10 mois j'avais commencé son développement. Je vous rassure, je n'ai pas travaillé pendant ces 10 mois régulièrement sur cette amélioration. Il y a eu beaucoup de temps morts (la faute à pas le temps), et beaucoup d'attente pour les reviews et super-review.
Qu'est ce que cela apporte ? Le support des mêmes flags de l'interface nsIDocumentEncoder pour XHTML/XML que pour HTML. Donc principalement, la possibilité d'avoir enfin du "pretty printing" (indentation, passage à la ligne au bout de X caractères etc..) lors de la serialisation d'un DOM XHTML et XML. Seul un document HTML profitait de cette possibilité. Bien sur, pour XHTML, le pretty printing tient compte de la spécificité de XHTML. Par exemple, pas de pretty printing dans les balises <pre> ou <script>.
Au passage, puisque maintenant le code du pretty printing est commun à HTML/XHTML/XML, j'ai amélioré le pretty printing du HTML. L'indentation n'est plus boguée, les sauts à la ligne se font au bon endroit etc... Ce patch corrige donc d'emblée deux bugs de longues dates, et va en permettre de fermer quelques autres assez rapidement, en espérant ne pas avoir introduit de régression (mais bien sûr j'ai ajouté plein de tests unitaires pour limiter les régressions potentielles).
Et concrètement, ce patch va permettre d'avoir un meilleur enregistrement des pages web éditée dans BlueGriffon, Kompozer, ou tout autre application qui sera basée sur XulRunner 1.9.2 minimum (dont Firefox 4)..
Commentaires
J'ai une question : le fait d'indenter ie d'ajouter des sauts de ligne et des tabs ne rajoute-t-il pas des nœuds texte indésirables et inutiles ?
@tangui : bien entendu, les sauts de lignes et indentation ne sont pas fait n'importe où... Surtout en XML, puisqu'à priori, le serializer n'a pas connaissance du type du contenu.
Par contre, pour la serialisation du HTML/XHTML, il sait où il peut ajouter ou pas des caractères blancs (espaces et/ou sauts de lignes). Par exemple entre des balises comme ul et li, il sait qu'il peut ajouter un noeud texte avec des espaces/sauts de lignes sans souci, même si il n'y en a pas à l'origine. Par contre dans un P ou un SPAN, il ne peut pas ajouter du blanc là où il n'y en avait pas, il peut juste se permettre d'en ajouter là où il y en a déjà. (afficher un espace ou 15000 ne change pas la signification du contenu, mais ajouter un espace là où il n'y en a pas ça le change, donc il ne le fait pas).
Enfin bref, faut pas s'inquiéter, toutes les règles XML/SGML sont à priori respectées (et c'était déjà le cas avant mon patch).
Yessss ! :-)
Merci pour ce boulot, j’avoue que je commençais à en avoir marre de Tidy.
wow ! un gros patch dans moz. ca le fait non ?
bravo laurent !
Je pense qu'il y a vraiment besoin d'une specification sur MDC de ce que fait ce patch. En particulier, tout ce que tu raconte au dessus au sujet des balises ul, li, P, SPAN, pre, script, ou dans le bug sur les entities, PI, CDATA, bref que sur MDC ce soit décrit de manière à peu prêt exhaustive, que quelqu'un qui a besoin de la comprendre dans le détail ne doive pas lire le code.
@jmdesp : euh... ça va servir à quoi ? Quand tu veux sérialiser, tu n'as pas besoin de savoir comment est serialiser chaque balise. C'est du détails d'implémentation des specs XML/HTML/XHTML tout ça... Je veux dire, par exemple, dans la page qui explique comment utiliser XMLHttpRequest il est indiqué comment est envoyé la requète à l'octet prés, ou plus exactement comment fonctionne le protocole HTTP ? non. Et heureusement.
Ceci dit, il manque toutefois une page qui justement indique comment on peut paramétrer la sérialisation (en utilisant l'objet nsIDocumentEncoder). Parce que pour le moment, il y a juste deux pages sur la sérialisation (et ne conçernant qu'XML), qui ne font qu'expliquer comment utiliser XMLSerializer, objet qui n'est pas du tout paramétrable...
* https://developer.mozilla.org/En/XM...
* https://developer.mozilla.org/En/Pa...
bravo !