#!/usr/bin/env python22

# Autor   : Tjabo Kloppenburg <tjabo@unix-ag.org>
# Datum   : 15. Mai 2002
# Zweck   : Eine Klasse zum simplen Parsen von RDF-Files mit News drin.
# Ergebnis: Eine Liste mit Tupeln: [(title,link), ...]


import re
import urllib

# ------------------------------------------------------------------------------
class RDFLinks:
  """
  class RDFLinks: Eine simple Klasse zum Parsen eines RDF-News-Files mit Titeln und Links.
  
  Autor   : Tjabo Kloppenburg <tjabo@unix-ag.org> (15. Mai 2002)
  
  Beispiel:
  
    rdf = RDFLinks( 'http://www.heise.de/tp/news.rdf' )
    top_five = rdf.getLinks( 5 )
    for tupel in top_five:
      print "<a href='%s'>%s</a>" % ( tupel[1], tupel[0] )
      
    oder:
    for in in range( 5 ):
      rdf.printLink( i )
  """
  
  def __init__( self, fname ):
    """
    Erstellt neues RDF-Objekt aus dem RDF-File hinter der angegebenen Url.
    """
    self.links = []
    title = ""
    link  = ""
  
    re_item    = re.compile( "^<item>$" , re.IGNORECASE )
    re_title   = re.compile( "^<title>([^<]+)</title>$" , re.IGNORECASE )
    re_link    = re.compile( "^<link>([^<]+)</link>$" , re.IGNORECASE )
    re_enditem = re.compile( "^</item>$" , re.IGNORECASE )
  
    f = urllib.urlopen( fname )
    in_item = 0
    for line in f.readlines():
      line = line.strip()
      if not in_item:
        if re_item.match( line ):
          in_item = 1
      else:
        s = re_title.search( line )
        if not s == None:
          title = s.group(1)

        s = re_link.search( line )
        if not s == None:
          link = s.group(1)
          
        if re_enditem.match( line ):
          t = (title,link)
          self.links.append( t )
          in_item = 0

    f.close()
    self.count = len(self.links)
  
  
  def getLinks( self, num=-1 ):
    """
    Liefert die ersten num Tupel der Ergebnisliste, als [(title0,link0),(title1,link1),...]:
      top_five = rdf.getLinks( 5 )
    """
    if num > 0:
      return self.links[0:num]
    return self.links

  def printLink( self, num, with_br=1 ):
    """
    Gibt einen Link-Tupel als A-HREF-Link aus, Optional nicht mit einem <BR>:
      for i in range(5):
        rdf.printLink( i )  # ...( i, 0 ) -> keine <BR>s.
    """
    if num <= self.count:
      br = ""
      if with_br: br="<br>"
      print "<a href='%s'>%s</a>%s" % ( self.links[num][1], self.links[num][0], br )
    
# end class --------------------------------------------------------------------

if __name__ == "__main__":
  print RDFLinks.__doc__
  print "dir( RDFLinks ):"
  print dir( RDFLinks )

  print
  print "Example: Telepolis"
  rdf = RDFLinks( "http://www.heise.de/tp/news.rdf" )
  for i in range(5):
    rdf.printLink( i )

  print
  
