Tim Tepaße: HTML in Feeds

Beitrag lesen

Hallo Ingo,

Dann gibts aber vom FeedValidator eine Warnung, dass in den <description> HTML-Code nix zu suchen hat.

Einfach so reingepasteter HTML-Code darf da nicht rein, ja.

Ich habe auch schon versucht, die Tag-Klammern zu maskieren.
Aber dann bemängelt er immer noch das a-Tag.

Wenn ich jetzt Deinen Feed mit dem Feedvalidator des W3C validiere, kommt ein (relativ unbedeutender) Fehler und eine Warnung, aber kein Fehler in Bezug auf den Link – Du hast diesen offenbar rausgenommen?

meine Frage ist nun, ob es überhaupt "erlaubt" ist, in einem RSS-Feed Bilder zu verlinken. Und wenn ja, wie mache ich das am besten?

Früher war als Inhalt des description-Elementes nur reiner Text erlaubt. Irgendwann hat der Autor der RSS-„Spezifikation“ sich entschieden, dass HTML-Inhalt toll wäre, das Default-Inhalts-Modell wurde dann von „reiner Text“ auf „HTML“ geändert. Da er aber mit XML-Namensräumen auf Kriegsfuss stand, muss man das HTML maskieren, damit die HTML-Elemente nicht mit den XML-Elementen in Konflikt geraten. Dafür gibt „von offizieller Seite“ folgende Möglichkeiten:

a) Die XML-relevanten Zeichen mit Entities kodieren, bereits bestehende Entities doppelt maskieren:

~~~xml <description>
  &lt;p&gt;In XML gibt es nur fünf definierte Entities:
  &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;,
  &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;apos;&lt;/code&gt; und
  &lt;code&gt;&amp;quot;&lt;/code&gt;.&lt;/p&gt;
  </description>

  
b) Alles in einen CDATA-Block packen. Dieser sagt dem XML-Prozessor im wesentlichen „Lese diesen Inhalt nicht als XML sondern reiche es einfach so weiter“:  
  
  `<description><![CDATA[Dies ist <abbr title="...">HTML</abbr>]]></description>`{:.language-xml}  
  
  
Etwas habe ich bisher verschwiegen: Das Inhaltsmodell des description-Elementes ist nicht „HTML“, wie gerade behauptet. Tatsächlich ist es „Text oder HTML und ich sage Dir nicht was“. D.h. es ist vollkommen erlaubt, auch nur Text in das description-Element zu packen. Manchmal soll es ja vorkommen, dass man auch Kleiner- und Größer-Zeichen in seinem Text verwenden will. Dafür schlägt die „offizielle Seite“ folgende Variantionen vor:  
  
c) Die XML-relevanten Zeichen zu maskieren, wie es in XML Brauch ist:  
  
  `<description>Für alle a ∈ [1, 10], b ∈ [11, 20] gilt: a &lt; b</description>`{:.language-xml}  
  
d) CDATA-Bereiche zu verwenden und darin die relevanten Zeichen zu maskieren, denn es handelt sich bei den Inhalt des CDATA-Elementes ja um „HTML“:  
  
  `<description><![CDATA[Wer nutzt eigentlich das &lt;bdo&gt;-Element?]]></description>`{:.language-xml}  
  
  
Ein RSS-Reader hat nun nach dem Akt des XML-Parsens (und dem dadurch entstehenden Ersetzens von "&lt;" und "&gt;" durch "<" und ">") mehrere Möglichkeiten, wie er den Inhalt des description-Elementes verarbeiten soll:  
  
• Als reinen Text  
• Als reinen Text mit zufälligerweise darin enthaltenen Kleiner- bzw. Größerzeichen  
• Als HTML-Quellcode  
• Als HTML-Quellcode mit zufälligerweise darin enthaltenen maskierten Kleiner- bzw. Größerzeichen.  
  
(Letztere beiden Möglichkeiten sind eigentlich gleich, muss man gerechterweise sagen.)  
  
U.a. deswegen greifen moderne Feedreader oftmals gerne zum Feed im konkurrierenden Format [Atom](http://atomenabled.org/developers/syndication/), wenn sie denn die Auswahl zwischen RSS und Atom haben. Der IE 7 macht dieses meines Wissens bei dem Akt des Feed Autodiscovery. In Atom muss man HTML auch noch maskieren, aber man schreibt wenigstens dran, was im jeweiligen Element enthalten ist und wie es verarbeitet werden soll, so dass der Feedreader nicht raten muss. Das sieht dann so aus:  
  
a) Für reinen Text:  
  
  `<title type="text">Die Geheimnisse des &lt;description&gt;-Elementes</summary>`{:.language-xml}  
  
b) Für HTML:  
  
  `<summary type="html">Dies ist &lt;abbr title="How To Make Love"&gt;HTML&lt;abbr&gt;</summary>`{:.language-xml}  
  
c) Bei vorhandenem echten XHTML kann man richtige XML-Namensräume verwenden:  
  
  ~~~xml
<content type="xhtml">  
  <div xmlns="http://www.w3.org/1999/xhtml">  
    <h1>Benannte Zeichenreferenzen</h1>  
    <p>Die International Organization for Standardization (ISO) hat für folgende  
     Zeichen aus dem Zeichensatz Latin 1 bereits Entities bereit gestellt:</p>  
    <table>  
      <tr><th>Unicode Nummer</th><th>Entity</th><th>Bedeutung</th></tr>  
      <tr><td>A0</td><td>&amp;nbsp;</td><td>Geschütztes Leerzeichen</td></tr>  
      ...  
    </table>  
  </div>  
  </content>

Das div-Element wird vom Atom-Standard benötigt. Wenn man den Namensraum geschickt einbindet, wie ich das gerade hier getan habe, kann man sein (wohlgeformtes) XHTML einfach so reinkippen, ohne jedes Element mit einem Präfix auszustatten.

Dieser Ausflug in die atomare Welt hilft Dir ja nicht mit Deinem Problem, 'tschuldige. Was ich an Deiner Stelle machen würde? Den HTML-Quelltext in CDATA-Bereiche packen. Das erspart einem eventuelle Sorgen mit doppelter Entity-Maskierung und dem Problem des Erkennens des Feedreaders, ob der Inhalt nun „reiner Text“ oder „maskiertes HTML“ ist. CDATA ist im RSS-Kontext ein sehr wahrscheinlicher, wenn auch nicht eindeutiger Hinweis auf „HTML“, also sicherer.

Beachte übrigens auch, dass dieses maskierte HTML in RSS nur für das Element description gilt, alle anderen Elemente wie title dürfen nur reinen Text enthalten.

Tim