Da ich kein perl-Profi bin, sind folgende Codes vielleicht nicht unbedingt die effizientesten. Ich bin für Hinweise zur Straffung der Codes dankbar. Vielleicht können wir diesen Punkt dann vollständig in die Doku einbauen?
RSS bietet die Möglichkeit, über normierte Formate kurze Inhalte im Internet zur Verfügung zu stellen. Man kann das natürlich kompakter und flexibler (mehr Felder) über csv-erzeugende Templates erreichen, der Nachteil ist aber, dass diese Daten nur mit einem aud die Datenstruktur spezifischen Code verarbeitet werden kann. Da RSS normiert ist, genügt die einmalige Einrichtung eines Lesecodes um eine Vielzahl von News-Feeds lesen zu können.
Eine gute Übersicht über RSS bietet die Harvard School of Law unter http://blogs.law.harvard.edu/tech/rss
Hier die einzelnen Codes:
1. Erstellen eines RSS 0.91 News-Feeds aus einer baseportal-Datenbank mittels Template:
Anmerkungen:
- Erste Zeile: perl-Befehl wichtig sonst erkennen die Browser nicht, dass es sich um XML handelt. Ohne Zeilenumbruch gleich zur xml-Definition, sonst wird die Seite ebenfalls nicht korrekt gelesen.
- Einfach die Texte zwischen den XML-Tags ersetzen.
- lastBuildDate: hier muss ein Datum im GMT-Format angegeben werden. Der erwähnte Perl-code erzeugt diesen mit dem jetzigen Zeitpunkt.
- beim Loop beginnt die Ausgabe der einzelnen Einträge. Dieses Beispiel stellt die Einträge eines Veranstaltungskalender dar, deren Bestandteile in die wenigen Felder des Newsfeeds zusammengefasst werden. Die Variablen habe ich in diesem Teil stehengelassen: <titel> = Titel der Nachricht bzw. der Veranstaltung. <description> = Angezeigte Zusammenfassung, die max. 100 Zeichen betragen darf/soll. <link> = Link auf die Detailseite des gewählten Eintrags auf dem eigenen Internetauftritt (in diesem Fall die Detailansicht einer Veranstaltung.
<perl>$_header="Content-type: text/xml\n\n";</perl><?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="0.91"><channel>
<title>Titel des News-Feeds</title>
<link>Vollständige URL des Internetauftritts, nicht des News-Feeds</link>
<description>Kurze Beschreibung inkl. Nutzungsbedingungen und evtl. Wiederholen des Links</description>
<language>Sprache mit standardisierten Kürzeln, z.B. de oder fr</language>
<lastBuildDate><perl>out datum("jetzt","rfc"), " GMT"</perl></lastBuildDate>
<copyright>Copyright: (C) Ihr Name oder Ihre organisation oder Ihre Firma</copyright>
<image>
<title>Entspricht dem alt-tag für Bilder in HTML. Soll als sehr kurzen Titel formuliert werden, da dieser Text bei fehlendem oder unerwünschtem Bild als Titel des Feeds fungiert.</title>
<url>Vollständige Adresse des Bildes</url>
<link>Vollständige URL auf die das Bild verweisen soll, also meistens Ihre Homepage</link>
</image>
<loop db=../iogneu/main sort=Datum1 Datum1\<=+3&Datum2\>=jetzt code=perl>
out <<EOF;
<item>
<title>$Titel</title>
EOF
if ( $Datum2 ne $Datum1 ) {$datumer=$Datum1." - ".$Datum2;}
else {$datumer=$Datum1;}
if ( $Zeit ne "" ) {$datumer=$datumer." - ".$Zeit.", Uhr";}
out <<EOF;
<description>$datumer. $$Typ ($Typ), $Ort ($Land).</description>
<link>http://islekerart.org/cgi-bin/baseportal.pl?htx=/iogneu/details_DE&Id==$_id&db=main</link>
</item>
EOF
</loop>
</channel>
</rss>
2. Lesen, Verarbeiten und Darstellung eines News-Feeds in einem baseportal-Template
Der Code ist soweit dokumentiert, dass er verständlich sein sollte.
<html>
<head>
<title>ISLEKer art - RSS Events-Reader direkt über baseportal & perl</title>
<style type="text/css">
<!--
body,p,div { font-family:arial,helvetica,sans-serif;font-size:8pt }
-->
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
function winOpen(url, breite, hoehe) {
// Errechnet Koordinaten, um das Popup zentriert zu platzieren
links = (screen.width/2)-(breite/2);
oben = (screen.height/2)-(hoehe/2);
window.open(url,"popup","height="+hoehe+",width="+breite+",status = no,toolbar = no,menubar = no,location = no,resizable = no,titlebar = no,scrollbars = no,copyhistory = yes,dependent=yes,fullscreen = no,top ="+oben+",left ="+links);
}
//-->
</script>
</head>
<body bgcolor="#C0C0C0">
<h4>
|<a href="http://www.islekerart.org/cgi-bin/baseportal.pl?htx=/rss/rss_events_perl_read&feeder=IOG">ISLEKer art Events</a>|<br>
|<a href="http://www.islekerart.org/cgi-bin/baseportal.pl?htx=/rss/rss_events_perl_read&feeder=BBC">BBC News Science/Nature</a>|
</h4>
<table width="142" border="0" style="border-width:1px;border-color:green;border-style:solid;" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
<tr><td width="100%">
<!-- Bis hier Anfangsteil der Seite inkl. 'Container-Tabelle', in der die News rein sollen -->
<!-- Ab hier wird der Teil aus dem RSS gelesen und layoutiert ausgegeben -->
<perl>
### Einlesen des RSS-Files und in Hauptbestandteile spliten : ###
### 1. Infos zum News-Channels 2. Bild des News-Channels 3. Einzelne Einträge ###
if ($feeder eq "IOG" || $feeder eq "") {$rss_url="http://www.islekerart.org/cgi-bin/baseportal.pl?htx=/rss/rss_events_today";}
elsif ($feeder eq "BBC") {$rss_url="http://news.bbc.co.uk/rss/newsonline_world_edition/science/nature/rss091.xml";}
$rss=get "$rss_url";
$rss =~ /<channel>/;
$split1=$';
$split1 =~ /<\/channel>/;
$split2=$`;
$split2 =~ /<item>/;
$part1=$`;
$part2=$&.$';
$part1 =~ /<image>/;
$part1head1=$`;
$part1head2=$&.$';
### Header-Daten Variablen zuordnen ###
while($part1head1=~ m#<(title|link|description|language|lastBuildDate|copyright)>(.*?)</\1>#gim) {
if($1 eq "title") { $head_title=$2; }
elsif($1 eq "link") { $head_link=$2; }
elsif($1 eq "description") { $head_description=$2; }
elsif($1 eq "language") { $head_language=$2; }
elsif($1 eq "lastBuildDate") { $head_lastBuildDate=$2; }
elsif($1 eq "copyright") { $head_copyright=$2; }
}
### Image-Daten Variablen zuordnen ###
while($part1head2=~ m#<(title|url|link)>(.*?)</\1>#gim) {
if($1 eq "title") { $img_title=$2; }
elsif($1 eq "url") { $img_url=$2; }
elsif($1 eq "link") { $img_link=$2; }
}
### Ausgabe des Bildes und/oder des Titels samt Verlinkung zur Homepage des Anbieters ###
if ($img_url ne "")
{
out "<a href='$img_link' target='_blank'><img border='0' src='$img_url' align='middle' alt='$img_title' width='140'></a><br><font size='1'>$head_title</font><br>";
}
else {out "<font size='1'>$head_title</font><br>";}
### Öffnen der 'Container-Tabelle' für die einzelnen Einträge/News ###
out "<table width='100%' border='0' cellpadding='2'><tr><td>";
out "<p><div style='overflow:auto; width:140px; height:400px;text-align:left;'>";
### On the fly -Identifizierung und Direktausgabe der News-Bestandteile ###
while($part2=~ m#<(title|description|link)>(.*?)</\1>#gim)
{
if($1 eq "title") { $item_title=$2; $neu=0;}
elsif($1 eq "description") { $item_description=$2; $neu=0; }
elsif($1 eq "link") { $item_link=$2; $neu=1; }
if ($neu==1)
{
### Einstellungen des Links je nach der Detailseite die aufgerufen wird ###
if($feeder eq "IOG") {$javas1="javascript:winOpen('";$javas2="', 400, 500)";}
else {$javas1="";$javas2="";}
$itlink=$javas1.$item_link.$javas2;
out "<b><a href=\"$itlink\"";
if($feeder ne "IOG") {out " target='_blank'";}
out ">$item_title</a></b><br>";
out "<small>$item_description</small><br><br>";
}
}
out "</div></p></td></tr></table>";
</perl>
<!-- Ende der RSS-Ausgabe und Restteil der Seite -->
</td></tr></table>
</body></html>