11548 sujets

JavaScript, DOM et API Web HTML5

Hello!

Je m'amuse à faire un lecteur de flux RSS (distants) en AJAX. Pour l'instant, ça marche plutôt bien.
Mais je me demande comment je dois traiter la partie en CDATA dans la balise description du RSS.
J'utilise les fonctions createElement et createTextNode pour construire l'arbre d'affichage découlant du RSS, mais forcément un createTextNode du contenu de la balise description affiche en mode texte les tags html...

La seule technique que j'ai trouvé est d'utiliser la propriété innerHTML de l'element que j'ai créé pour la description. Mais j'ai cru comprendre que innerHTML c'est le maaaaaaal... c'est vrai?

Voilà... sachant que c'est moi-même qui écrit aussi le RSS, je me demande si c'est ma façon de parser ou ma façon de générer le RSS qui n'est pas bonne? Ou si le innerHTML c'est la bonne solution à mon pb...

Edit> Voici le RSS en question: http://www.foolstep.com/syndication/news-rss.xml

Merci!
Modifié par Creak (10 Jan 2010 - 21:15)
Creak a écrit :
Mais j'ai cru comprendre que innerHTML c'est le maaaaaaal... c'est vrai?

innerHTML entrera dans la cour des standards avec HTML 5. Donc, si c'est le mal, ce n'est plus pour longtemps. Smiley cligne

Pour résoudre ton problème, je vois deux solutions.

La première consiste à utiliser innerHTML.

La seconde, si tu ne veux pas utiliser innerHTML, consiste à te passer des balises CDATA dans ton flux et le meilleur moyen pour y parvenir est de générer ton flux au format Atom, qui gère finement le contenu textuel et les éventuels soucis que peuvent amener un contenu balisé. En effet, le format Atom gère plusieurs types de contenu, et ce aussi bien pour le résumé que pour le contenu complet d'une entrée, types de contenu que voici :
- le type texte (type par défaut) : le texte est dépourvu de tout balisage et les seuls caractères échappés sont les caractères spéciaux <, > et & (d'autres caractères spéciaux peuvent échappés, comme é codé sous la forme é) ;
<content type="text">Lorem ipsum dolor & compagnie</content>

- le type html : le code HTML est échappé sous la forme d'entités XML et les entités HTML sont à nouveau échappées ;
<content type="html"><p>Lorem ipsum dolor &amp; compagnie</p></content>

- le type xhtml : le texte est balisé comme un extrait de code HTML, le tout étant contenu dans un élément div pourvu de l'attribut xmlns pour déclarer l'espace de nom XHTML.
<content type="xhtml">
  <div xmlns="http://www.w3.org/1999/xhtml">
    <p>Lorem ipsum dolor & compagnie</p>
  </div>
</content>

Avec le format Atom, pas d'ambiguïté possible et pas besoin de CDATA (et donc pas besoin d'innerHTML pour afficher du contenu balisé). Smiley smile

Si tu veux en savoir plus sur le format Atom et sa syntaxe, voici quelques explications (en anglais).
Ah bah il se trouve que je génère aussi un flux Atom: http://www.foolstep.com/syndication/news-atom.xml
Et j'utilise justement le type xhtml. J'avais juste complètement oublié ce format! J'étais resté focalisé sur le RSS Smiley smile
Bon, par contre, j'ai cru comprendre que le RSS était quand même le plus répandu. Donc je ne peux pas le laisser de coté pour autant. Du coup, la technique d'affichage la plus simple pour afficher les deux formats est d'utiliser la propriété innerHTML (surtout si tu me dis que ça va devenir un standard Smiley cligne ).

Histoire de voir si j'ai bien compris l'intérêt du format Atom, si mon contenu est typé xhtml, alors le parseur XML reconnaitra sans pb les balises HTML à l'intérieur de la balise "content"? Si c'est le cas, c'est plutôt alléchant! Ca permettrai de gérer plus finement le contenu de tes news. Par exemple, si tu veux éviter d'afficher plus de 150 caractères, avec du CDATA c'est quasiment infaisable vu qu'on risque de couper au milieu d'une balise et, du coup, de générer une erreur de syntaxe...
Je crois que je commence à saisir l'intérêt du format Atom! Smiley smile

Merci beaucoup!

Edit> A vrai dire, après lecture de cet article sur le CDATA: http://www.w3schools.com/xmL/xml_cdata.asp
Je trouve que c'est la solution la plus propre (dans le cadre du RSS évidemment). Car générer un flux avec des &lt;, &gt, &eacute; et des &amp; partout, je trouve pas ça très lisible... Sans parler du fait que les sections CDATA économisent un temps précieux pour le parseur XML qui sait, du coup, qu'il n'y a rien à faire sur toute cette section!
Modifié par Creak (10 Jan 2010 - 22:13)
Creak a écrit :
Bon, par contre, j'ai cru comprendre que le RSS était quand même le plus répandu. Donc je ne peux pas le laisser de coté pour autant.

Le format Atom est reconnu sans difficulté par les navigateurs qui possèdent un lecteur de flux, ainsi que par certains agrégateurs, comme Google Reader ou Netvibes. L'idéal, bien entendu, serait de proposer au moins deux formats de syndication. Smiley cligne
Creak a écrit :
générer un flux avec des &lt;, &gt, &eacute; et des &amp; partout, je trouve pas ça très lisible

J'en conviens ; mais, la plupart du temps, un flux est généré dynamiquement par un langage côté serveur, et puis l'abonné du flux lambda ne s'amuse pas, de toute façon, à regarder le code source du flux ! Smiley langue
Victor BRITO a écrit :

L'idéal, bien entendu, serait de proposer au moins deux formats de syndication. Smiley cligne

C'est déjà ce que je fais Smiley langue

Victor BRITO a écrit :

l'abonné du flux lambda ne s'amuse pas, de toute façon, à regarder le code source du flux ! Smiley langue

Tu marques un point Smiley ravi
Vu que tous les lecteurs RSS doivent utiliser le innerHTML pour afficher la description de l'item, utiliser du texte encoder ou du CDATA revient donc au même, à la différence que le CDATA est plus parser-friendly.

Merci pour toutes ces réponses avisées!
Modifié par Creak (11 Jan 2010 - 00:51)