Ñò
ŽÛVMc           @   sý   d  Z  d d k Z d d k Z d d k l Z d d k l Z l Z d d k l	 Z	 d „  Z
 d „  Z d „  Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e Z d S(   sÌ  
Syndication feed generation library -- used for generating RSS, etc.

Sample usage:

>>> from django.utils import feedgenerator
>>> feed = feedgenerator.Rss201rev2Feed(
...     title=u"Poynter E-Media Tidbits",
...     link=u"http://www.poynter.org/column.asp?id=31",
...     description=u"A group Weblog by the sharpest minds in online media/journalism/publishing.",
...     language=u"en",
... )
>>> feed.add_item(
...     title="Hello",
...     link=u"http://www.holovaty.com/test/",
...     description="Testing."
... )
>>> fp = open('test.rss', 'w')
>>> feed.write(fp, 'utf-8')
>>> fp.close()

For definitions of the different versions of RSS, see:
http://diveintomark.org/archives/2004/02/04/incompatible-rss
iÿÿÿÿN(   t   SimplerXMLGenerator(   t   force_unicodet
   iri_to_uri(   t   datetime_safec   
      C   sÁ   d } d } t  i |  ƒ }  | |  i ƒ  } | |  i d } |  i d | | f ƒ } |  i oV |  i i |  ƒ } | i d d | i d } t	 | d ƒ \ } }	 | d | |	 f S| d Sd  S(   Nt   Jant   Febt   Mart   Aprt   Mayt   Junt   Jult   Augt   Sept   Octt   Novt   Dect   Mont   Tuet   Wedt   Thut   Frit   Satt   Suni   s   %s, %%d %s %%Y %%H:%%M:%%S i   i<   s	   %+03d%02ds   -0000(   R   R   R   R   R   R	   R
   R   R   R   R   R   (   R   R   R   R   R   R   R   (
   R   t   new_datetimet   weekdayt   montht   strftimet   tzinfot	   utcoffsett   dayst   secondst   divmod(
   t   datet   monthsR   t   dowR   t   time_strt   offsett   timezonet   hourt   minute(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   rfc2822_date    s    
c         C   s   t  i |  ƒ }  |  i oe |  i d ƒ } |  i i |  ƒ } | i d d | i d } t | d ƒ \ } } | d | | f S|  i d ƒ Sd  S(   Ns   %Y-%m-%dT%H:%M:%Si   i<   s
   %+03d:%02ds   %Y-%m-%dT%H:%M:%SZ(   R   R   R   R   R   R   R   R   (   R    R#   R$   R%   R&   R'   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   rfc3339_date3   s    
c         C   s   t  i  |  ƒ } t | d | d i d ƒ d ƒ } | d } | d } d } | d j	 o  d t i | ƒ i d	 ƒ } n d
 | | | | f S(   s^   
    Creates a TagURI.

    See http://diveintomark.org/archives/2004/05/28/howto-atom-id
    t   hostnamei   t   :i    i   i   t    s   ,%ss   %Y-%m-%du   tag:%s%s:%s/%sN(   t   urlparset   getattrt   splitt   NoneR   R   R   (   t   urlR    t	   url_splitR*   t   patht   fragmentt   d(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   get_tag_uri?   s    #

 t   SyndicationFeedc           B   s¤   e  Z d  Z d d d d d d d d d d d „
 Z d d d d d d d d d d d „
 Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z RS(   sG   Base class for all syndication feeds. Subclasses should provide write()c         K   s#  d „  } |	 o+ g  } |	 D] } | t  | ƒ q ~ }	 n | d  j	 o t  | ƒ } n h | | ƒ d 6t | ƒ d 6| | ƒ d 6| | ƒ d 6| | ƒ d 6| | ƒ d 6t | ƒ d 6| | ƒ d	 6|	 p d d
 6t |
 ƒ d 6| | ƒ d 6| p | d 6| d 6|  _ |  i i | ƒ g  |  _ d  S(   Nc         S   s   t  |  d  t ƒS(   t   strings_only(   R   t   True(   t   s(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   <lambda>V   s    t   titlet   linkt   descriptiont   languaget   author_emailt   author_namet   author_linkt   subtitlet
   categoriest   feed_urlt   feed_copyrightt   idt   ttl(    (   R   R0   R   t   feedt   updatet   items(   t   selfR<   R=   R>   R?   R@   RA   RB   RC   RD   RE   RF   t	   feed_guidRH   t   kwargst
   to_unicodet   _[1]t   c(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   __init__S   s*    	+c         K   s  d „  } | o+ g  } | D] } | | | ƒ q ~ } n | d j	 o t | ƒ } n h | | ƒ d 6t | ƒ d 6| | ƒ d 6| | ƒ d 6| | ƒ d 6t | ƒ d 6| d 6| | ƒ d	 6| |	 ƒ d
 6|
 d 6| p d d 6| | ƒ d 6| d 6} | i | ƒ |  i i | ƒ d S(   sß   
        Adds an item to the feed. All args are expected to be Python Unicode
        objects except pubdate, which is a datetime.datetime object, and
        enclosure, which is an instance of the Enclosure class.
        c         S   s   t  |  d  t ƒS(   R8   (   R   R9   (   R:   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR;   w   s    R<   R=   R>   R@   RA   RB   t   pubdatet   commentst	   unique_idt	   enclosureRD   t   item_copyrightRH   N(    (   R0   R   R   RJ   RK   t   append(   RL   R<   R=   R>   R@   RA   RB   RS   RT   RU   RV   RD   RW   RH   RN   RO   RP   RQ   t   item(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   add_itemn   s*    		+
c         C   s   t  |  i ƒ S(   N(   t   lenRK   (   RL   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt	   num_items   s    c         C   s   h  S(   sx   
        Return extra attributes to place on the root (i.e. feed/channel) element.
        Called from write().
        (    (   RL   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   root_attributes’   s    c         C   s   d S(   sd   
        Add elements in the root (i.e. feed/channel) element. Called
        from write().
        N(    (   RL   t   handler(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   add_root_elements™   s    c         C   s   h  S(   sZ   
        Return extra attributes to place on each item (i.e. item/entry) element.
        (    (   RL   RY   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   item_attributes    s    c         C   s   d S(   sF   
        Add elements on each item (i.e. item/entry) element.
        N(    (   RL   R^   RY   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   add_item_elements¦   s    c         C   s
   t  ‚ d S(   sŠ   
        Outputs the feed in the given encoding to outfile, which is a file-like
        object. Subclasses should override this.
        N(   t   NotImplementedError(   RL   t   outfilet   encoding(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   write¬   s    c         C   s3   d d k  l  } | ƒ  } |  i | | ƒ | i ƒ  S(   sE   
        Returns the feed in the given encoding as a string.
        iÿÿÿÿ(   t   StringIO(   Rf   Re   t   getvalue(   RL   Rd   Rf   R:   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   writeString³   s    	c         C   st   g  } |  i  D]& } | d d j	 o | | d q q ~ } t | ƒ d j o | i ƒ  | d St i i ƒ  Sd S(   s€   
        Returns the latest item's pubdate. If none of them have a pubdate,
        this returns the current date/time.
        RS   i    iÿÿÿÿN(   RK   R0   R[   t   sortt   datetimet   now(   RL   RP   t   it   updates(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   latest_post_date¼   s
    =
	N(    (   t   __name__t
   __module__t   __doc__R0   RR   RZ   R\   R]   R_   R`   Ra   Re   Rh   Rn   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR7   Q   s    								t	   Enclosurec           B   s   e  Z d  Z d „  Z RS(   s   Represents an RSS enclosurec         C   s&   | | |  _  |  _ t | ƒ |  _ d S(   s2   All args are expected to be Python Unicode objectsN(   t   lengtht	   mime_typeR   R1   (   RL   R1   Rs   Rt   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRR   Ê   s    (   Ro   Rp   Rq   RR   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRr   È   s   t   RssFeedc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   application/rss+xmlc         C   s}   t  | | ƒ } | i ƒ  | i d |  i ƒ  ƒ | i d |  i ƒ  ƒ |  i | ƒ |  i | ƒ |  i | ƒ | i d ƒ d  S(   Nu   rssu   channel(	   R    t   startDocumentt   startElementt   rss_attributesR]   R_   t   write_itemst   endChannelElementt
   endElement(   RL   Rc   Rd   R^   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRe   Ñ   s    
c         C   s   h |  i  d 6d d 6S(   Nu   versionu   http://www.w3.org/2005/Atomu
   xmlns:atom(   t   _version(   RL   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRx   Û   s    c         C   sN   xG |  i  D]< } | i d |  i | ƒ ƒ |  i | | ƒ | i d ƒ q
 Wd  S(   Nu   item(   RK   Rw   R`   Ra   R{   (   RL   R^   RY   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRy   ß   s
    
 c         C   sK  | i  d |  i d ƒ | i  d |  i d ƒ | i  d |  i d ƒ | i  d d  h d d	 6|  i d
 d 6ƒ |  i d d  j	 o | i  d |  i d ƒ n x% |  i d D] } | i  d | ƒ qª W|  i d d  j	 o | i  d |  i d ƒ n | i  d t |  i ƒ  ƒ i d ƒ ƒ |  i d d  j	 o | i  d |  i d ƒ n d  S(   Nu   titleR<   u   linkR=   u   descriptionR>   u	   atom:linku   selfu   relRE   u   hrefR?   u   languageRD   u   categoryRF   u	   copyrightu   lastBuildDates   utf-8RH   u   ttl(   t   addQuickElementRI   R0   R(   Rn   t   decode(   RL   R^   t   cat(    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR_   å   s    ( %c         C   s   | i  d ƒ d  S(   Nu   channel(   R{   (   RL   R^   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRz   ô   s    (   Ro   Rp   Rt   Re   Rx   Ry   R_   Rz   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRu   Ï   s   	
			t   RssUserland091Feedc           B   s   e  Z d  Z d „  Z RS(   u   0.91c         C   sU   | i  d | d ƒ | i  d | d ƒ | d d  j	 o | i  d | d ƒ n d  S(   Nu   titleR<   u   linkR=   R>   u   description(   R}   R0   (   RL   R^   RY   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRa   ù   s    (   Ro   Rp   R|   Ra   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR€   ÷   s   t   Rss201rev2Feedc           B   s   e  Z d  Z d „  Z RS(   u   2.0c         C   s  | i  d | d ƒ | i  d | d ƒ | d d  j	 o | i  d | d ƒ n | d o1 | d o& | i  d	 d
 | d | d f ƒ nQ | d o | i  d	 | d ƒ n. | d o" | i  d | d h d d 6ƒ n | d d  j	 o' | i  d t | d ƒ i d ƒ ƒ n | d d  j	 o | i  d | d ƒ n | d d  j	 o | i  d | d ƒ n | d d  j	 o | i  d | d ƒ n | d d  j	 oA | i  d d h | d i d 6| d i d 6| d i d 6ƒ n x" | d D] } | i  d | ƒ qíWd  S(   Nu   titleR<   u   linkR=   R>   u   descriptionRA   R@   u   authors   %s (%s)u
   dc:creatoru    http://purl.org/dc/elements/1.1/u   xmlns:dcRS   u   pubDates   utf-8RT   u   commentsRU   u   guidRH   u   ttlRV   u	   enclosureR,   u   urlu   lengthu   typeRD   u   category(   R}   R0   R(   R~   R1   Rs   Rt   (   RL   R^   RY   R   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRa     s4    "' (   Ro   Rp   R|   Ra   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR   ÿ   s   t	   Atom1Feedc           B   sA   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s"   application/atom+xml; charset=utf8u   http://www.w3.org/2005/Atomc         C   sZ   t  | | ƒ } | i ƒ  | i d |  i ƒ  ƒ |  i | ƒ |  i | ƒ | i d ƒ d  S(   Nu   feed(   R    Rv   Rw   R]   R_   Ry   R{   (   RL   Rc   Rd   R^   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRe   )  s    
c         C   sC   |  i  d d  j	 o h |  i d 6|  i  d d 6Sh |  i d 6Sd  S(   NR?   u   xmlnsu   xml:lang(   RI   R0   t   ns(   RL   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR]   1  s    c         C   sù  | i  d |  i d ƒ | i  d d h d d 6|  i d d 6ƒ |  i d	 d  j	 o, | i  d d h d
 d 6|  i d	 d 6ƒ n | i  d |  i d ƒ | i  d t |  i ƒ  ƒ i d ƒ ƒ |  i d d  j	 o– | i d h  ƒ | i  d |  i d ƒ |  i d d  j	 o | i  d |  i d ƒ n |  i d d  j	 o | i  d |  i d ƒ n | i d ƒ n |  i d d  j	 o | i  d |  i d ƒ n x/ |  i d D]  } | i  d d h | d 6ƒ q¢W|  i d d  j	 o | i  d |  i d ƒ n d  S(   Nu   titleR<   u   linkR,   u	   alternateu   relR=   u   hrefRE   u   selfu   idRG   u   updateds   utf-8RA   u   authoru   nameR@   u   emailRB   u   uriRC   u   subtitleRD   u   categoryu   termRF   u   rights(   R}   RI   R0   R)   Rn   R~   Rw   R{   (   RL   R^   R   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR_   7  s*    (,% c         C   sN   xG |  i  D]< } | i d |  i | ƒ ƒ |  i | | ƒ | i d ƒ q
 Wd  S(   Nu   entry(   RK   Rw   R`   Ra   R{   (   RL   R^   RY   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRy   M  s
    
 c         C   s7  | i  d | d ƒ | i  d d h | d d 6d d 6ƒ | d	 d  j	 o' | i  d
 t | d	 ƒ i d ƒ ƒ n | d d  j	 o‡ | i d h  ƒ | i  d | d ƒ | d d  j	 o | i  d | d ƒ n | d d  j	 o | i  d | d ƒ n | i d ƒ n | d d  j	 o | d } n t | d | d	 ƒ } | i  d | ƒ | d d  j	 o" | i  d | d h d d 6ƒ n | d d  j	 oH | i  d d h d d 6| d i d 6| d i d 6| d i	 d 6ƒ n x, | d D]  } | i  d d h | d 6ƒ qæW| d  d  j	 o | i  d! | d  ƒ n d  S("   Nu   titleR<   u   linku    R=   u   hrefu	   alternateu   relRS   u   updateds   utf-8RA   u   authoru   nameR@   u   emailRB   u   uriRU   u   idR>   u   summaryu   htmlu   typeRV   R,   u	   enclosureu   lengthRD   u   categoryu   termRW   u   rights(
   R}   R0   R)   R~   Rw   R{   R6   R1   Rs   Rt   (   RL   R^   RY   RU   R   (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyRa   S  s:    %'"
 (	   Ro   Rp   Rt   Rƒ   Re   R]   R_   Ry   Ra   (    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyR‚   $  s   				(   Rq   Rj   R-   t   django.utils.xmlutilsR    t   django.utils.encodingR   R   t   django.utilsR   R(   R)   R6   t   objectR7   Rr   Ru   R€   R   R‚   t   DefaultFeed(    (    (    sD   /usr/local/lib/python2.6/dist-packages/django/utils/feedgenerator.pyt   <module>   s   			w(%\