RSS feed reader door M.S.Ter Haseborg (versie 0.0 30-03-2007)

Inleiding

Daar ik het gevoel heb dat het idee van een RSS wel eens tijd besparend kan zijn .
Heb ik mij een klein beetje hierin verdiept .
Het idee , althans wat ik er van mee gekregen heb , is dat er een bestand wordt gemaakt waarin de nieuwste toegevoegde/veranderde informatie in wordt vermeld .
De bedoeling is dat er gelijk met de verandering van je WEB site deze ook vermeld worden in het RSS bestand .

Het RSS formaat is een XML beschrijving . Er is een minimum wat verplicht is en meer dan de helft is facultatief .
Verplicht is :

feed                : <rss> kannaalbeschrijving </rss>
kannaalbeschrijving : <channel> aanhef items [items].. </channel>
aanhef              : <title> 'text' </title>
                      <link> 'URL home page' </link>
                      <description> 'wie is dit' </descriptions>
items               : <item> title url beschrijving [ datum ] </item>
title               : <title> 'waar gaat het over' </title>
url                 : <link> 'je url waar het onderwerp staat' </link>
beschrijving        : <description> 'korte of lange toelichting' <description>
datum               : <pubDate> 'datum moet formeel in Fri, 23 May 2007 10.00.00 +000' </pubDate>

Paar opmerkingen hierbij :
Het mij onbekent of je meer <channel> in een <rrs> kunt hebben .
De <description> doet men heel verschillend , soms niets of de eerste regel of ook wel het hele artikel.
Dit laatste meestal bij z.g.n. 'blog's' .
Bedenk wel dat een RSS een geverifieerde XML code moet bevatten , dat houdt in dat je een beschrijving wil doen met HTML je dit moet omsluiten met .

Je kunt een RSSfeed aanklikken in je browers maar dan krijg de XML beschrijving van de feed te zien , hetgeen niet voor iedereen even handig zal zijn .
Daarom zijn er programma's gemaakt die een RSSfeed iets leesbaarder afbeelden .

Een aantal heb ik er van bekeken .
RSSowl maakt gebruik van java en werkt zowel onder Linux als Windows .
(Ofschoon onder Windows98 het wel steeds ertoe lijd dat je niet meer kunt afsluiten .)
Zie ook HOEZOrss .
Wat ik mij afvroeg of je niet een wat simpler programmatje kon maken die je gewoon de in de feed aanwezige informatie geeft .

Programma opzet

De opzet valt uiteen in vier delen .

  1. ophalen en lezen van de RSSfeeds
  2. konverteren van de gelezen (XML)feeds naar een platte text bestand met alleen die informatie waarin je geinteresseerd bent .
  3. vastellen wat nu eigenlijk de nog niet gelezen/nieuwe informatie .
  4. afbeelden van de gekregen informatie .

Lezen RSSfeed's

Daartoe heb ik een bestand gemaakt dat RSSFEED.TXT heet en een cvs formaat heeft bestaande uit 3 velden .
Teweten 'naamfeed','URLfeed',feedIndex (hetgeen 1 regel text is) .
Nu worden uit alle regel de URLfeed en de feedIndex gehaald en d.m.v. 'wget' gelezen .
v.b. wget -o feedIndex[i].log -O feedIndex[i].txt URLfeeds[i] .
Nu zijn behalve log bestanden zijn de verkregen feeds nu feedIndex.txt genaamd .
Waarbij Index een tamelijk willekeurig nummer mag zijn .
(Ik heb wget gebruikt omdat deze de namen goed oplost , beter dan mijn eigen clientreader)

Konverteren

Daar er vanalles en nogwat in een RSSfeed kan zitten heb ik bedacht om eruit tehalen datgene waarvan ik het gevoel heb iets mee te kunnen .
Dit 'uittreksel' te schrijven naar bestanden feedIndex.new welke regel georinteerde bestanden zijn .
De eerste 4 regels bevatten de 'aanhef' (zie hier boven) en voorieder 'item' worden 5 regels gebruikt .
De regels van de aanhef bestaan uit :

  1. alles-gelezen-flag
  2. titel
  3. link
  4. beschrijving
  5. datum enwel die van als die bestaat .

De 5 regels van een item bestaan uit:

  1. titel
  2. link
  3. beschrijving
  4. datum enwel die van als die bestaat .
  5. leesflag

De manier om deze gegevens uit de RSSfeed tehalen wordt gedaan met een Lexicalscanner .
Aangenomen dat de feed correct is (verifyd) dan kun je heel grof gebruik maken van de begin en eind <tag>'s .
Ik heb gezien dat in de beschrijving , <description> ,er weleens tab's en cr/lf worden gebruikt .
In de huidige versie heb ik alle cr/lf verwijder en de tab's aan de linker en rechter zijde van een beschrijving verwijderd .

De datum die men mee geeft voldoen meestal niet aan de gevraagde standaard zodat het lastig is er iets mee te doen .

De leesflag wordt op 0 gezet ten teken 'niet gelezen' en tevens de 'alles-gelezen-flag'.

Bepaal gelezen feed's

De vorige keer dat de gevens zijn gemaakt staan deze in feedIndex.rss .
Als die er niet is dan wordt nu feedIndex.new gecopieerd naar feedIndex.rss en zijn we klaar .

copier .rss naar .bak
Bepaal voor iedere item uit .new of deze voorkomt in .bak .
Zoja copier het item uit .bak naar .rss .
Zoniet copier het item uit .new naar .rss .
Hiermee wordt berijkt dat item die niet meer actief zijn worden verwijderd en item die al gelezen zijn bewaard blijven .

Afbeelden

Behalve dat het afbeelden overzichtelijk en bedienning functioneel moet zijn is de presentatie ervan erg smaak afhankelijk .
Daar het hier gaat om Internet informatie heb ik om de afbeelding te verzorgen gebruik gemaakt van server/client techniek .
Met dien verstande dat de client je webbrowser is en de server een programmatje is de vragen van je webbrowser beantwoord . (Waarschijnlijk werkt dit ook als je b.v. apache gebruikt , nog niet getest )

Voor de afbeelding hebt ik 4 frames(windows) genomen .
Twee boven (over gehele breedte van het beeld) voor programma versie e.d. en een voor de opdrachten .
Twee onder (over de lengte van het resterende beeld) in waarin links een lijst met aanwezige RSSfeed's staan en rechts staan dan de bijbehorende item's of wel het gehele item (verkregen m.b.v. de item link) .
Het hoofd frame heet rssframe.html (misschien niet handig gekozen beter index.html ?)
Het eerste (bovenste) frame staat 'title.html' het frame daaronder 'knopframe.html' .
Daaronder aan de linkerkant heet het frame 'index' en aan de rechterkant heet het 'rss' .

Intro -> jbn feed -> jbn item ->

De twee opdrachten zijn 'Quit' en 'Herlaad RSS Feed's' en later toegevoegd is 'Markeer alles gelezen' .
Quit stop het programma , beter gezegd de server (weet niet hoe in browser het venster kan sluiten) .
Herlaad RSS Feed's haalt alle feeds op vanaf het internet .
Markeer alles gelezen markerd alle item's van een feed als gelezen .

Bij het opstarten wordt gelijk de browser aangeroepen met de begin waarden die staan in 'rssframe.html' .
Heeft een feed nog ongelezen item's dan wordt deze in 'bold' afgebeeld .
Door op een (links staande) feednaam te klikken wordt aan de server gevraagd om de bijbehoren item uit feedIndex.rss tehalen en naar frame 'rss' te sturen . De niet gelezen item worden als 'bold' afgebeeld .

Op een van de items klikken , haalt het item op en beeld het af in frame 'rss' en zet de leesflag op 'gelezen' .
Door de browser 'terug' tegebruiken kun je een frame terug .
Als alle items gelezen zijn wordt de feed weer normaal weergegeven .
Om dit teberijken wordt gebruikt gemaakt van een truuk uit java om twee frame te kunnen laden .

Uitleiding

Er zijn nogal wat test's ingebouw alsmede dubbele file's welke mocht het goed blijken te werken wel weer weg mogen .
Er zijn hele waslijsten commando te bedenken . Alleen vraag ik mij waarom nog meer ? . Het doel is immers om snel te zien wat er voor nieuws is gekomen !

De programma zijn in PEU geschreven .

pserver.exw  = server
RSSREAD.EX   = leest alle feed's opnieuw
RSSDISPL.EXW = commando uitvoerder en beeldopmaakt
RSS.E        = bevat de routine om XML -> platte regels
                     de routine leesflag te testen
Externe routines zijn:
readf.e     = vrij formaat lezen (en schrijven)
lexi.e      = lexical scanner

De bijbehoren html bestanden zijn
rssframe.html = defineers de frame layout .
title.html    = titel van het programma
knopframe.html= opdracht akties
open.html     = opening pagina in frame rss

Menno S. Ter Haseborg (31-03-2007)