PlanetXML

Patch für Serendipities rss.php

Einige meiner Blog-Einträge enthalten HTML-Entities, z.B. zur Kodierung von Umlauten. In den RSS und Atom Feeds sind diese Entities allerdings nicht bekannt und verursachen so eine Fehlermeldung vom XML Parser. Um dieses Problem zu beheben habe ich die rss.php so modifiziert, dass den Feeds eine passende Doctype Deklaration vorangestellt wird.

Beim Testen mit dem Feed Validator stellte sich dann noch heraus dass die Namespace Angabe Fehlerhaft war und ein rdf:about Attribut beim channel Element fehlte. Der komplette Patch ist an angehängt.

--- ../../serendipity-0.8.3/serendipity/rss.php Thu Aug  4 08:49:22 2005
+++ rss.php     Mon Sep  5 14:14:03 2005
@@ -1,4 +1,4 @@
-<?php # $Id: rss.php,v 1.47 2005/08/04 08:49:21 garvinhicking Exp $
+<?php # $Id: rss.php,v 1.48 2005/08/19 10:50:36 garvinhicking Exp $
 # Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
 # All rights reserved.  See LICENSE file for licensing details

@@ -9,6 +9,104 @@
 $description     = $serendipity['blogDescription'];
 $title           = $serendipity['blogTitle'];
 $comments        = FALSE;
+$entities        = <<<HERE
+<!ENTITY nbsp   "&#160;">
+<!ENTITY iexcl  "&#161;">
+<!ENTITY cent   "&#162;">
+<!ENTITY pound  "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen    "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect   "&#167;">
+<!ENTITY uml    "&#168;">
+<!ENTITY copy   "&#169;">
+<!ENTITY ordf   "&#170;">
+<!ENTITY laquo  "&#171;">
+<!ENTITY not    "&#172;">
+<!ENTITY shy    "&#173;">
+<!ENTITY reg    "&#174;">
+<!ENTITY macr   "&#175;">
+<!ENTITY deg    "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2   "&#178;">
+<!ENTITY sup3   "&#179;">
+<!ENTITY acute  "&#180;">
+<!ENTITY micro  "&#181;">
+<!ENTITY para   "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil  "&#184;">
+<!ENTITY sup1   "&#185;">
+<!ENTITY ordm   "&#186;">
+<!ENTITY raquo  "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc  "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml   "&#196;">
+<!ENTITY Aring  "&#197;">
+<!ENTITY AElig  "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc  "&#202;">
+<!ENTITY Euml   "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc  "&#206;">
+<!ENTITY Iuml   "&#207;">
+<!ENTITY ETH    "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc  "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml   "&#214;">
+<!ENTITY times  "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc  "&#219;">
+<!ENTITY Uuml   "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN  "&#222;">
+<!ENTITY szlig  "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc  "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml   "&#228;">
+<!ENTITY aring  "&#229;">
+<!ENTITY aelig  "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc  "&#234;">
+<!ENTITY euml   "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc  "&#238;">
+<!ENTITY iuml   "&#239;">
+<!ENTITY eth    "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc  "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml   "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc  "&#251;">
+<!ENTITY uuml   "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn  "&#254;">
+<!ENTITY yuml   "&#255;">
+HERE;

 if ( empty($version) ) {
     list($version) = serendipity_discover_rss($_GET['file'], $_GET['ext']);
@@ -118,6 +216,9 @@
 switch ($version) {
 case '0.91':
     print <<<HEAD
+<!DOCTYPE rss[
+$entities
+]>
 <rss version="0.91">
 <channel>
 <title>$title</title>
@@ -149,6 +250,9 @@
     }

     print <<<HEAD
+<!DOCTYPE rdf:RDF[
+$entities
+]>
 <rdf:RDF {$entries['display_dat']}
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:admin="http://webns.net/mvcb/"
@@ -156,8 +260,8 @@
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
-   xmlns="http://my.netscape.com/rdf/simple/0.9/">
-<channel>
+   xmlns="http://purl.org/rss/1.0/">
+<channel rdf:about="{$serendipity['baseURL']}">
     <title>$title</title>
     <link>{$serendipity['baseURL']}</link>
     <description>$description</description>
@@ -171,8 +275,6 @@
     </items>
 </channel>

-{$additional_fields['image_rss1.0_rdf']}
-
 HEAD;
 break;

@@ -191,6 +293,9 @@
     }

     print <<<HEAD
+<!DOCTYPE rss[
+$entities
+]>
 <rss version="2.0"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:admin="http://webns.net/mvcb/"
@@ -226,6 +331,9 @@
     }

     print <<<HEAD
+<!DOCTYPE feed[
+$entities
+]>
 <feed version="0.3"
    xmlns="http://purl.org/atom/ns#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"