Show
Ignore:
Timestamp:
07/07/08 13:39:57 (21 months ago)
Author:
JensDiemer
Message:

Update RSS plugin: Used feedparser by Mark Pilgrim:  http://feedparser.org
 http://feedparser.googlecode.com/svn/trunk/LICENSE

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/pylucid/PyLucid/plugins_internal/RSS/RSS.py

    r1634 r1656  
    22 
    33""" 
    4 PyLucid Plugin 
    5 Blendet RSS-Daten von einem anderen Server in die CMS-Seite ein. 
    6 Bsp.: 
    7 <lucidFunction:RSS>http://sourceforge.net/export/rss2_projnews.php?group_id=146328</lucidFunction> 
     4    PyLucid RSS plugin 
     5    ~~~~~~~~~~~~~~~~~~ 
    86 
    9 Last commit info: 
    10 ---------------------------------- 
    11 $LastChangedDate$ 
    12 $Rev$ 
    13 $Author$ 
     7    Include external RSS Feeds directly into a CMS page. 
     8    Used feedparser by Mark Pilgrim: http://feedparser.org 
     9    http://feedparser.googlecode.com/svn/trunk/LICENSE 
    1410 
    15 Created by Jens Diemer 
     11    Last commit info: 
     12    ~~~~~~~~~~~~~~~~~ 
     13    $LastChangedDate$ 
     14    $Rev$ 
     15    $Author$ 
    1616 
    17 license: 
    18     GNU General Public License v2 or above 
    19     http://www.opensource.org/licenses/gpl-license.php 
    20  
     17    :copyleft: 2007 by the PyLucid team, see AUTHORS for more details. 
     18    :license: GNU GPL v3 or above, see LICENSE for more details. 
    2119""" 
    2220 
    2321__version__= "$Rev$" 
    2422 
    25 import xml.dom.minidom 
    26 import md5, sys, os, urllib, time 
     23import time 
    2724 
    2825import socket 
     
    3431 
    3532from PyLucid.system.BasePlugin import PyLucidBasePlugin 
    36 from PyLucid.system.response import SimpleStringIO 
     33from PyLucid.tools import feedparser 
     34 
    3735from django.core.cache import cache 
    38  
    39  
     36from django.utils.safestring import mark_safe 
    4037 
    4138class RSS(PyLucidBasePlugin): 
    4239 
    43     info_txt = '<small class="RSS_info">\n\t%s\n</small>\n' 
     40    def _debug(self, url, feed): 
     41        from pprint import pformat 
     42        self.response.write("<h2>RSS debug for '%s':</h2>\n" % url) 
     43        self.response.write("<pre>\n") 
     44        self.response.write(pformat(feed)) 
     45        self.response.write("</pre>\n") 
    4446 
    45     def lucidTag(self, url, title=None): 
    46  
     47    def lucidTag(self, url, debug=False, title=None): 
    4748#        rss_page = cache.get(url) 
    4849#        if rss_page: 
     
    5455 
    5556        try: 
    56             rss_data = urllib.urlopen(url) 
     57            feed = feedparser.parse(url) 
    5758        except Exception, e: 
    5859            self.response.write( 
     
    6364#            cache.set(url, rss_page) 
    6465 
    65         server_response = time.time() - start_time 
     66        duration = time.time() - start_time 
    6667 
    67         start_time = time.time() 
    68         r = RSS_Maker() 
    69         data = r.feed(rss_data) 
    70         paser_duration = time.time() - start_time 
     68        if debug: 
     69            self._debug(url, feed) 
    7170 
    7271        context = { 
    7372            "url": url, 
    74             "title": title, 
    75             "entries": data, 
    76             "server_response": server_response, 
    77             "paser_duration": paser_duration, 
     73            "feed": feed, 
     74            "duration": duration, 
    7875        } 
    7976        self._render_template("RSS", context)#, debug=True) 
    8077 
    81  
    82 #_____________________________________________________________________________ 
    83  
    84 DEFAULT_NAMESPACES = ( 
    85     None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0 
    86     'http://purl.org/rss/1.0/', # RSS 1.0 
    87     'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90 
    88 ) 
    89 DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',) 
    90  
    91 class RSS_Maker(object): 
    92  
    93     def feed(self, rss_data): 
    94         """ 
    95         Diese Funktion wird direkt vom Modul-Manager ausgeführt. 
    96         """ 
    97         rssDocument = xml.dom.minidom.parse(rss_data) 
    98  
    99         entries = [] 
    100         for node in self.getElementsByTagName(rssDocument, 'item'): 
    101             entry_data = { 
    102                 "title_link": self.get_txt(node, "link", "#"), 
    103                 "title": self.get_txt(node, "title", None), 
    104                 "date": self.get_txt(node, "date", None), 
    105                 "description": self.get_txt(node, "description", None), 
    106             } 
    107             entries.append(entry_data) 
    108         return entries 
    109  
    110  
    111     def getElementsByTagName(self, node, tagName, 
    112             possibleNamespaces=DEFAULT_NAMESPACES 
    113         ): 
    114         for namespace in possibleNamespaces: 
    115             children = node.getElementsByTagNameNS(namespace, tagName) 
    116             if len(children): return children 
    117         return [] 
    118  
    119     def node_data( self, node, tagName, 
    120             possibleNamespaces=DEFAULT_NAMESPACES 
    121         ): 
    122         children = self.getElementsByTagName(node, tagName, possibleNamespaces) 
    123         node = len(children) and children[0] or None 
    124         return node and "".join( 
    125             [child.data.encode("utf_8") for child in node.childNodes] 
    126         ) or None 
    127  
    128     def get_txt(self, node, tagName, default_txt=""): 
    129         """ 
    130         Liefert den Inhalt >tagName< des >node< zurück, ist dieser nicht 
    131         vorhanden, wird >default_txt< zurück gegeben. 
    132         """ 
    133         return self.node_data(node, tagName) or self.node_data( 
    134             node, tagName, DUBLIN_CORE 
    135         ) or default_txt 
    136  
    137