U
    pX†Z:9  ã                   @   sr  d Z dZdZdZed d eeeƒ¡ ZddlZddl	Z	e	j
d dkrXeZdd	lmZ n2zdd	lmZ W n  ek
rˆ   dd	lmZ Y nX G d
d„ dƒZi fdd„Zdd„ Zdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG d d!„ d!ƒZG d"d#„ d#ƒZG d$d%„ d%ƒZG d&d'„ d'ƒZG d(d)„ d)eƒZG d*d+„ d+eƒZ dS ),z:PyRSS2Gen - A Python library for generating RSS 2.0 feeds.Ú	PyRSS2Gen)é   r   é    z(Andrew Dalke <dalke@dalkescientific.com>ú-Ú.r   Né   )ÚStringIOc                   @   s    e Zd Zddd„Zddd„ZdS )	ÚWriteXmlMixinú
iso-8859-1c                 C   s6   ddl m} | ||¡}| ¡  |  |¡ | ¡  d S )Nr   )Úsaxutils)Zxml.saxr
   ZXMLGeneratorÚstartDocumentÚpublishÚendDocument)ÚselfZoutfileÚencodingr
   Úhandler© r   ú-/home/novalis_dt/novalis.org/cgi/PyRSS2Gen.pyÚ	write_xml   s
    
zWriteXmlMixin.write_xmlc                 C   s   t ƒ }|  ||¡ | ¡ S ©N)r   r   Úgetvalue)r   r   Úfr   r   r   Úto_xml%   s    zWriteXmlMixin.to_xmlN)r	   )r	   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   
r   c                 C   sJ   t |tƒs|d kr<|  ||¡ |d k	r0|  |¡ |  |¡ n
| | ¡ d S r   )Ú
isinstanceÚ
basestringÚstartElementÚ
charactersÚ
endElementr   )r   ÚnameÚobjÚdr   r   r   Ú_element+   s    
r#   c                 C   s   |d krd S t | ||ƒ d S r   )r#   )r   r    r!   r   r   r   Ú_opt_element7   s    r$   c                 C   sX   ddddddddg|   ¡  | jd	d
ddddddddddg| jd  | j| j| j| jf S )zVconvert a datetime into an RFC 822 formatted date

    Input date must be in GMT.
    z#%s, %02d %s %04d %02d:%02d:%02d GMTÚMonÚTueÚWedÚThuÚFriÚSatÚSunÚJanÚFebÚMarÚAprÚMayÚJunÚJulÚAugÚSepÚOctÚNovÚDecr   )ÚweekdayÚdayÚmonthÚyearÚhourÚminuteÚsecond)Údtr   r   r   Ú_format_date=   s$         ÿÿ   ûr@   c                   @   s$   e Zd ZdZi Zdd„ Zdd„ ZdS )Ú
IntElementzÄimplements the 'publish' API for integers

    Takes the tag name and the integer value to publish.
    
    (Could be used for anything which uses str() to be published
    to text for XML.)
    c                 C   s   || _ || _d S r   )r    Úval)r   r    rB   r   r   r   Ú__init__]   s    zIntElement.__init__c                 C   s0   |  | j| j¡ | t| jƒ¡ | | j¡ d S r   )r   r    Úelement_attrsr   ÚstrrB   r   ©r   r   r   r   r   r   `   s    zIntElement.publishN©r   r   r   Ú__doc__rD   rC   r   r   r   r   r   rA   T   s   rA   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDateElementz¯implements the 'publish' API for a datetime.datetime

    Takes the tag name and the datetime to publish.

    Converts the datetime to RFC 2822 timestamp (4-digit year).
    c                 C   s   || _ || _d S r   )r    r?   )r   r    r?   r   r   r   rC   l   s    zDateElement.__init__c                 C   s   t || jt| jƒƒ d S r   )r#   r    r@   r?   rF   r   r   r   r   o   s    zDateElement.publishN©r   r   r   rH   rC   r   r   r   r   r   rI   e   s   rI   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚCategoryzPublish a category elementNc                 C   s   || _ || _d S r   )ÚcategoryÚdomain)r   rL   rM   r   r   r   rC   u   s    zCategory.__init__c                 C   s,   i }| j d k	r| j |d< t|d| j|ƒ d S )NrM   rL   )rM   r#   rL   ©r   r   r"   r   r   r   r   x   s    

zCategory.publish)NrJ   r   r   r   r   rK   s   s   
rK   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCloudzPublish a cloudc                 C   s"   || _ || _|| _|| _|| _d S r   ©rM   ÚportÚpathÚregisterProcedureÚprotocol)r   rM   rQ   rR   rS   rT   r   r   r   rC   €   s
    zCloud.__init__c              
   C   s,   t |dd | jt| jƒ| j| j| jdœƒ d S )NÚcloudrP   )r#   rM   rE   rQ   rR   rS   rT   rF   r   r   r   r   ‡   s    ûzCloud.publishNrJ   r   r   r   r   rO   ~   s   rO   c                   @   s&   e Zd ZdZi Zddd„Zdd„ ZdS )ÚImagezPublish a channel ImageNc                 C   s(   || _ || _|| _|| _|| _|| _d S r   )ÚurlÚtitleÚlinkÚwidthÚheightÚdescription)r   rW   rX   rY   rZ   r[   r\   r   r   r   rC   ’   s    zImage.__init__c                 C   s    |  d| j¡ t|d| jƒ t|d| jƒ t|d| jƒ | j}t|tƒrRt	d|ƒ}t
|d|ƒ | j}t|tƒrxt	d|ƒ}t
|d|ƒ t
|d| jƒ | d¡ d S )NÚimagerW   rX   rY   rZ   r[   r\   )r   rD   r#   rW   rX   rY   rZ   r   ÚintrA   r$   r[   r\   r   )r   r   rZ   r[   r   r   r   r   ›   s    



zImage.publish)NNNrG   r   r   r   r   rV      s        ÿ
	rV   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	ÚGuidzŠPublish a guid

    Defaults to being a permalink, which is the assumption if it's
    omitted.  Hence strings are always permalinks.
    r   c                 C   s   || _ || _d S r   )ÚguidÚisPermaLink)r   r`   ra   r   r   r   rC   ¶   s    zGuid.__init__c                 C   s0   i }| j rd|d< nd|d< t|d| j|ƒ d S )NÚtruera   Úfalser`   )ra   r#   r`   rN   r   r   r   r   ¹   s
    
zGuid.publishN)r   rJ   r   r   r   r   r_   °   s   
r_   c                   @   s$   e Zd ZdZi Zdd„ Zdd„ ZdS )Ú	TextInputz=Publish a textInput

    Apparently this is rarely used.
    c                 C   s   || _ || _|| _|| _d S r   )rX   r\   r    rY   )r   rX   r\   r    rY   r   r   r   rC   Ç   s    zTextInput.__init__c                 C   sT   |  d| j¡ t|d| jƒ t|d| jƒ t|d| jƒ t|d| jƒ | d¡ d S )NÚ	textInputrX   r\   r    rY   )r   rD   r#   rX   r\   r    rY   r   rF   r   r   r   r   Í   s    zTextInput.publishNrG   r   r   r   r   rd   Á   s   rd   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	EnclosurezPublish an enclosurec                 C   s   || _ || _|| _d S r   ©rW   ÚlengthÚtype)r   rW   rh   ri   r   r   r   rC   Ø   s    zEnclosure.__init__c                 C   s$   t |dd | jt| jƒ| jdœƒ d S )NÚ	enclosurerg   )r#   rW   rE   rh   ri   rF   r   r   r   r   Ü   s    þÿzEnclosure.publishNrJ   r   r   r   r   rf   Ö   s   rf   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSourcez7Publish the item's original source, used by aggregatorsc                 C   s   || _ || _d S r   )r    rW   )r   r    rW   r   r   r   rC   å   s    zSource.__init__c                 C   s   t |d| jd| jiƒ d S )NÚsourcerW   )r#   r    rW   rF   r   r   r   r   è   s    zSource.publishNrJ   r   r   r   r   rk   ã   s   rk   c                   @   s$   e Zd ZdZi Zdd„ Zdd„ ZdS )Ú	SkipHourszHPublish the skipHours

    This takes a list of hours, as integers.
    c                 C   s
   || _ d S r   )Úhours)r   rn   r   r   r   rC   ñ   s    zSkipHours.__init__c                 C   s>   | j r:| d| j¡ | j D ]}t|dt|ƒƒ q| d¡ d S )NÚ	skipHoursr<   )rn   r   rD   r#   rE   r   )r   r   r<   r   r   r   r   ó   s
    
zSkipHours.publishNrG   r   r   r   r   rm   ë   s   rm   c                   @   s$   e Zd ZdZi Zdd„ Zdd„ ZdS )ÚSkipDayszDPublish the skipDays

    This takes a list of days as strings.
    c                 C   s
   || _ d S r   )Údays)r   rq   r   r   r   rC      s    zSkipDays.__init__c                 C   s:   | j r6| d| j¡ | j D ]}t|d|ƒ q| d¡ d S )NÚskipDaysr9   )rq   r   rD   r#   r   )r   r   r9   r   r   r   r     s
    
zSkipDays.publishNrG   r   r   r   r   rp   ú   s   rp   c                   @   sX   e Zd ZdZddiZi Zdddddddedddddddddfdd„Zdd	„ Zd
d„ Z	dS )ÚRSS2z“The main RSS class.

    Stores the channel attributes, with the "category" elements under
    ".categories" and the RSS items under ".items".
    Úversionz2.0Nz%http://blogs.law.harvard.edu/tech/rssc                 C   s”   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
d krBg }
|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|d krŠg }|| _d S r   )rX   rY   r\   ÚlanguageÚ	copyrightÚmanagingEditorÚ	webMasterÚpubDateÚlastBuildDateÚ
categoriesÚ	generatorÚdocsrU   Úttlr]   Úratingre   ro   rr   Úitems)r   rX   rY   r\   ru   rv   rw   rx   ry   rz   r{   r|   r}   rU   r~   r]   r   re   ro   rr   r€   r   r   r   rC     s0    zRSS2.__init__c                 C   sü  |  d| j¡ |  d| j¡ t|d| jƒ t|d| jƒ t|d| jƒ |  |¡ t|d| j	ƒ t|d| j
ƒ t|d| jƒ t|d	| jƒ | j}t|tjƒr¤td
|ƒ}t|d
|ƒ | j}t|tjƒrÌtd|ƒ}t|d|ƒ | jD ] }t|tƒrôt|ƒ}| |¡ qÞt|d| jƒ t|d| jƒ | jd k	r4| j |¡ | j}t| jtƒrRtd|ƒ}t|d|ƒ | jd k	rv| j |¡ t|d| jƒ | jd k	rœ| j |¡ | jd k	r´| j |¡ | j d k	rÌ| j  |¡ | j!D ]}| |¡ qÒ| "d¡ | "d¡ d S )NÚrssZchannelrX   rY   r\   ru   rv   rw   rx   ry   rz   r|   r}   r~   r   )#r   Ú	rss_attrsrD   r#   rX   rY   r\   Úpublish_extensionsr$   ru   rv   rw   rx   ry   r   ÚdatetimerI   rz   r{   r   rK   r   r|   r}   rU   r~   r^   rA   r]   r   re   ro   rr   r€   r   )r   r   ry   rz   rL   r~   Úitemr   r   r   r   H  sV    







zRSS2.publishc                 C   s   d S r   r   rF   r   r   r   rƒ     s    zRSS2.publish_extensions)
r   r   r   rH   r‚   rD   Ú_generator_namerC   r   rƒ   r   r   r   r   rs   	  s.   è
69rs   c                
   @   s.   e Zd ZdZi Zd	dd„Zdd„ Zdd„ ZdS )
ÚRSSItemzPublish an RSS ItemNc                 C   sd   |d kr|d krt dƒ‚|| _|| _|| _|| _|d kr<g }|| _|| _|| _|| _|	| _	|
| _
d S )Nz4must define at least one of 'title' or 'description')Ú	TypeErrorrX   rY   r\   Úauthorr{   Úcommentsrj   r`   ry   rl   )r   rX   rY   r\   r‰   r{   rŠ   rj   r`   ry   rl   r   r   r   rC   ‹  s     ÿzRSSItem.__init__c                 C   sö   |  d| j¡ t|d| jƒ t|d| jƒ |  |¡ t|d| jƒ t|d| jƒ | jD ] }t	|t
ƒrlt|ƒ}| |¡ qVt|d| jƒ | jd k	rœ| j |¡ t|d| jƒ | j}t	|tjƒrÆtd|ƒ}t|d|ƒ | jd k	rè| j |¡ | d¡ d S )	Nr…   rX   rY   r\   r‰   rŠ   r`   ry   )r   rD   r$   rX   rY   rƒ   r\   r‰   r{   r   r   rK   r   rŠ   rj   r`   ry   r„   rI   rl   r   )r   r   rL   ry   r   r   r   r   ©  s*    





zRSSItem.publishc                 C   s   d S r   r   rF   r   r   r   rƒ   Å  s    zRSSItem.publish_extensions)
NNNNNNNNNN)r   r   r   rH   rD   rC   r   rƒ   r   r   r   r   r‡   ˆ  s             ö
r‡   )!rH   r   Ú__version__Ú
__author__ÚjoinÚmaprE   r†   r„   ÚsysÚversion_infor   Úior   Ú	cStringIOÚImportErrorr   r#   r$   r@   rA   rI   rK   rO   rV   r_   rd   rf   rk   rm   rp   rs   r‡   r   r   r   r   Ú<module>   s<   !