mò
êkãAc           @   sÒ  d  Z  d k Z d k Z d k Z d k Z d k Z y d k l Z Wn  e	 j
 o d k l Z n Xh  d d <d d <d d <d	 d
 <Z
 d d Z h  d e i d ƒ <d e i e ƒ <d e i d ƒ <Z d6 Z d7 Z d8 Z d Z d Z d Z d Z h  e d <Z h  e h  d d <<e d <Z h  e d <Z h  e h  d d <<e d <Z h  e h  d d <<e h  d d <<d e e f <d e e f <d e e f <d e d f <Z h  e h  d d <d d <<d e e f <d e e f <d e e f <d  e e f <d e e f <Z h  e h  d d <<e h  d d! <<d" e d f <Z h  e h  d d <d# d <<e h  d d <<d e e f <d e e f <d e e f <d  e e f <d e e f <d$ e e f <Z h  d% e e f <Z d& „  Z d' „  Z  d( „  Z! e i d) ƒ Z" d* „  Z# d+ e i$ i% i& f d, „  ƒ  YZ' d- e' f d. „  ƒ  YZ( d/ e' f d0 „  ƒ  YZ) d d1 „ Z* d2 „  Z+ e, d3 „ Z- d4 „  Z. e/ d5 j o e. ƒ  n d S(9   s}   
RSS 1.1 Validator
Author: Sean B. Palmer, inamidst.com
License: GPL 2; share and enjoy!
Nearby: http://inamidst.com/rss1.1/
N(   s   StringIOt   rsss   http://purl.org/net/rss1.1#t   rdfs+   http://www.w3.org/1999/02/22-rdf-syntax-ns#t   xmls$   http://www.w3.org/XML/1998/namespacet   xsds!   http://www.w3.org/2001/XMLSchema#s7   ^(([a-zA-Z][0-9a-zA-Z+\-\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+s7   $\.\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\.\-_!~*'()%]+)?$s
   xsd:strings   (?m)^.*$s
   xsd:anyURIs   xsd:languages   ^[a-z]+(?:-[a-z0-9]+)*$s   Optional Attributess   Mandatory Attributest   Contentt   *t   ?t   1s   xml:langs   rdf:parseTypeu   Resources	   rss:titles   rss:links   rss:urls	   rdf:abouts   rss:descriptions	   rss:imageu
   Collections   rss:items   xml:bases	   rss:itemss   rss:Channelc         C   sO   |  i } |  i } t g  } |  i ƒ  D] } | | | ƒ | | ƒ f q& ~ ƒ S(   N(	   t   attrst   getNameByQNamet   namet   getValueByQNamet   valuet   dictt   _[1]t	   getQNamest   n(   R   R
   R   R   R   (    (    t   validator.pyt   dictizeG   s    		c         C   sz   |  i d ƒ d j p t d ‚ n |  i d d ƒ \ } } t i | ƒ o t t | ƒ t | ƒ f Sn t	 d | ‚ d  S(   Nt   :i   s,   Expecting a QName with a single colon in it.s   Prefix %s unknown.(
   t   tagt   countt
   ValueErrort   splitt   prefixR
   t
   namespacest   has_keyt   unicodet	   Exception(   R   R   R
   (    (    R   t
   tagToQNameL   s    c         C   sw   |  \ } } | i d ƒ } | i d ƒ } x9 t i ƒ  D]+ \ } } | | j o d | | f Sq7 q7 Wt d | ‚ d  S(   Ns   utf-8s   %s:%ss   Namespace %s unknown.(   t   uriR
   t   encodeR   t	   iteritemst   pfxt   nsR   (   t   .0R   R
   R!   R"   (    (    R   t
   qnameToTagT   s    s   (?mi)^\s*<h3>\s*errorc         C   sk   d } h  d |  <d d <} t i | t i | ƒ ƒ } | i ƒ  } | i	 ƒ  t
 i | ƒ o t Sn t S(   Ns*   http://www.w3.org/RDF/Validator/ARPServlett   RDFt   EMBEDDED_RDFR   (   R   t   st   datat   urllibt   urlopent	   urlencodet   ut   readt   resultt   closet   r_errort   searcht   Falset   True(   R'   R   R,   R.   R(   (    (    R   t   validateRDF^   s    
t	   RSSParserc           B   sn   t  Z d  d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z RS(   Nc         C   s¢   | p d  |  _  d  |  _ d  |  _ h  |  _ g  |  _ t |  _ d |  _	 d |  _
 d t t g  d g g |  _ t i i i i |  ƒ |  i  o |  i |  i  ƒ n d  S(   Ni    t   /t    (   R   t   Nonet   selfR(   t   buffert   aboutst   anyR2   t	   nestedAnyt   warningst   errorst   schemat   Onet   stackR   t   saxt   handlert   ContentHandlert   __init__t   validateURI(   R9   R   (    (    R   RF   i   s    							
 c         C   s   d G| GHd  S(   Ns   NOTE:(   t   msg(   R9   RH   (    (    R   t   notez   s    c         C   s&   |  i d 7_ t i d I| IJd  S(   Ni   s   WARNING:(   R9   R>   t   syst   stderrRH   (   R9   RH   (    (    R   t   warning}   s    c         C   s=   |  i d 7_ t i d I| Id t IJt i d ƒ d  S(   Ni   s   ERROR:s   %r(   R9   R?   RJ   RK   RH   t   placet   exit(   R9   RH   (    (    R   t   error   s    c         C   só   | |  _  t i |  i  ƒ } | i ƒ  } | i d ƒ og | d } | i d ƒ o |  i	 d ƒ qž | i d ƒ o |  i
 d ƒ qž d | } |  i
 | ƒ n | i ƒ  } | |  _ | i ƒ  | |  _ t | ƒ |  _ |  i i d ƒ |  i ƒ  d  S(   Ns   Content-Types   application/rss+xmls   Recommended media type used.s   application/rdf+xmls    application/rss+xml is preferreds"   %s is NOT a recommended media typei    (   R   R9   R)   R*   R,   t   infoR   t	   mediatypet
   startswithRI   RL   RH   R-   R(   R:   R/   t   StringIOt   seekt   validate(   R9   R   RP   RQ   R,   RH   R(   (    (    R   RG   ‰   s$    	

	
	c         C   së   t  i i ƒ  } | i d t d ƒ | i t  i i i d ƒ y | i t  i i i	 d ƒ Wn8 t  i i
 i t  i i
 i f j
 o t i d IJn X| i |  ƒ y | i |  i ƒ Wn/ t  i i
 i j
 o } |  i d | ƒ n Xd  S(   NR   i   s   Warning: prefixes errors   XML Parser Error: %s(   R   RC   t   make_parsert   parsert   start_namespace_declR   t
   setFeatureRD   t   feature_namespacest   feature_namespace_prefixest   _exceptionst   SAXNotSupportedExceptiont   SAXNotRecognizedExceptionRJ   RK   t   setContentHandlerR9   t   parseR:   t   SAXParseExceptiont   eRO   (   R9   Rb   RW   (    (    R   RU   Ÿ   s     & c         C   s:   t  } x) |  i d D] } | | d \ } } q W| | S(   Ni   i    (   R@   t
   schemaPartR9   RB   t	   stackItemt   cardinalityR   (   R9   R   Rd   Rc   Re   (    (    R   t	   getSchema­   s
     c         C   s~  | \ } } t | ƒ } | d  j o
 | } n | t d j o d | j o |  i	 d ƒ n t
 d ƒ } | i | ƒ oC | | } |  i i | ƒ o |  i d | ƒ q½ t |  i | <n y t | | f ƒ } Wn d } n X|  i d d } | i | ƒ oD|  i d d	 i | ƒ |  i d d	 i | ƒ } | | d } | t j o. | d j o! d
 | | f }
 |  i |
 ƒ qY| t j o. | d j o! d | | f }
 |  i |
 ƒ qY| t j ol | o |  i d d	 | } n | o/ | | g | j o d | }
 |  i |
 ƒ qD|  i d | ƒ qY|  i d | ƒ n |  i d | ƒ | d j o; |  i i t ƒ t |  i ƒ d j o t |  _  n d  Sn |  i! | ƒ \ } } |  i i | | | g  d g ƒ xIt# t$ f D];} | i | ƒ o%x"| | i& ƒ  D]\ } } t
 | ƒ } | i | ƒ oÂ t* | t+ ƒ oN | | | j o! d | | f }
 |  i |
 ƒ qï|  i d | ƒ | | =qt, | } | i. }	 | i/ | | ƒ p! d | |	 f }
 |  i |
 ƒ q|  i d | ƒ | | =q	| t# j o |  i d | ƒ q	q	WqâqâW| oR xO | i0 ƒ  D]= } y t | ƒ } Wn t2 | ƒ } n X|  i d | ƒ q5Wn d  S(   NR    R   s3   Elements in the rss namespace should be prefixless.s	   rdf:abouts   Repeat rdf:about value: %sR   iÿÿÿÿi   i   s%   Expected ZeroOrOne %s but now have %ss   Expected One %s but now have %ss#   Found a %s not grouped with others.s   Validated %s successfully.s   Element %s is not allowed here.R7   s   @%s's value must be: %rs!   Validated plain @%s successfully.s   @%s's value must match: %rs"   Validated dtyped @%s successfully.s   %s attribute is mandatorys   Attribute %s not allowed here.(3   R"   R
   R   t   rawattrsR   R   R8   R   R9   RL   R   t   rdfaboutR   t   aboutURIR;   RO   R3   R$   t   fulltagRB   t   parentSchemat   appendR   Re   t	   ZeroOrOneRH   RA   t
   ZeroOrMoret   prevRI   R<   t   lenR=   Rf   Rc   t   manAttrst   optAttrst   _attrsR    t   keyR   t   attrkeyt
   isinstanceR   t	   datatypest   regexpt   patternt   matcht   iterkeyst   attrtagt   str(   R9   t   .2R   Rg   R"   R
   Rt   Rc   R   Ry   RH   Rs   Ru   R|   Rk   Ri   Rx   Re   R   R   Ro   Rj   Rh   (    (    R   t   startElementNS³   s    

  
 
  
	!   c         C   s4   |  i o& |  i o |  i d d c | 7<n d  S(   Niÿÿÿÿ(   R9   RB   R<   t   chars(   R9   R€   (    (    R   t
   characters  s    c         C   s  |  i o |  i i ƒ  d  Sn |  i d d } |  i d d } |  i d d } |  i d d } |  i i ƒ  | d j o d  Sn x| | i ƒ  D]n }
 |
 t
 t t f j oR | |
 \ } } | i |
 ƒ } | t j o" | d j o |  i d |
 ƒ q q’ q’ Wd }	 | i t ƒ o× | t } t | t ƒ oX | i |	 ƒ | i |	 ƒ j o$ d	 } |  i | | | | f ƒ qí|  i d
 | ƒ qt | } | i } | i | i |	 ƒ ƒ p$ d } |  i | | | | f ƒ q|  i d
 | ƒ n& | i |	 ƒ o |  i d | ƒ n d  S(   Niÿÿÿÿi    i   i   i   R   s   Expected to find a %ss    	
s&   Expected %s's content to be %r; got %rs   Validated %s's contents)   Expected %s's content to match %r; got %rs#   Expected %s to have no text content(   R9   R<   t   popRB   t   elementNameRc   t   elementChildrent   elementContentR{   Rt   Rr   Rq   t   contentR   Re   R   RA   RO   t   wsR   t   contentValueRv   R   t   stripRH   Rw   Rx   Ry   Rz   RI   (   R9   t   qnameR   Rƒ   Rˆ   Ry   R„   Rc   R…   R‡   Rt   Rx   Re   RH   R   (    (    R   t   endElementNS  sB    
  

	c         C   s²   |  i o¤ y d k l } Wn  t j
 o |  i d ƒ q® Xd k l } y | |  i ƒ } Wn/ t
 i i i | f j
 o |  i d ƒ q® X|  i d ƒ |  i d ƒ n d  S(   N(   s   TripleStores/   Couldn't import rdflib: only Tentatively Valid!(   s   Errors"   RDF validation with rdflib failed!s)   RDF validation with rdflib was successfuls)   Only Tentatively Valid since rdflib is NV(   R9   R=   t   rdflib.TripleStoret   TripleStoret   ImportErrorRL   t   rdflib.exceptionst   ErrorR   t   GR   RC   R\   Ra   RO   RI   (   R9   R   R‘   R   (    (    R   t   endDocument2  s    
  (   t   __name__t
   __module__R8   RF   RI   RL   RO   RG   RU   Rf   R   R   R‹   R’   (    (    (    R   R5   h   s   							U		&t   CGIRSSParserc           B   s   t  Z d „  Z RS(   Nc         C   s   d  S(   N(    (   R9   RH   (    (    R   RI   B  s    (   R“   R”   RI   (    (    (    R   R•   A  s   t   QuietRSSParserc           B   s#   t  Z d „  Z d „  Z d „  Z RS(   Nc         C   s   d  S(   N(    (   R9   RH   (    (    R   RI   F  s    c         C   s   |  i d 7_ d  S(   Ni   (   R9   R>   (   R9   RH   (    (    R   RL   I  s    c         C   s   |  i d 7_ d  S(   Ni   (   R9   R?   (   R9   RH   (    (    R   RO   L  s    (   R“   R”   RI   RL   RO   (    (    (    R   R–   E  s   		c         C   s@   | d  j o t ƒ  } n
 | ƒ  } | i |  ƒ | i | i f S(   N(   RW   R8   R5   t   pRG   R   R>   R?   (   R   RW   R—   (    (    R   RU   O  s
    	c             s   d  k  }  t i t _ |  i ƒ  ‰  ‡  d †  ˆ  _ ˆ  d ƒ } d GHHd G| GHt | d t	 ƒ\ } } d | GHd | GHH| o	 d GHn d	 GHd  S(
   Nc            s   ˆ  |  i S(   N(   t   formR'   R   (   R'   (   R˜   (    R   t   <lambda>Z  s    R   s   Content-Type: text/plains   Validation results forRW   s   Warnings: %ss
   Errors: %ss"   This document is NOT valid RSS 1.1s+   This document is tentatively valid RSS 1.1!(   t   cgiRJ   t   stdoutRK   t   FieldStorageR˜   t   __call__R   RU   R•   R>   R?   (   Rš   R?   R˜   R>   R   (    (   R˜   R   t   doCGIV  s    					c         C   sÿ   d k  } | i  d ƒ } | i ƒ  d } xœ | D]” } | GHt | d t ƒ\ } } | d j o
 t	 } n t
 } | i d ƒ o | } n | o |  p d G| GHn d } q/ |  p d G| GHq/ q/ W|  o | o	 d	 GHn |  o	 d
 GHn t i | ƒ d S(   s   Quis custodiet ipsos custodes?Ns
   test/*.rssi    RW   s	   test/neg-s   FAIL:i   s   Pass:s   FAIL: some tests faileds   Pass: all tests passed(   t   globt   testst   sortt   exitcodet   fnRU   R–   R>   R?   R3   R2   RR   t   quietRJ   RN   (   R¤   R    R?   R>   RŸ   R£   R¢   (    (    R   t   testg  s2     	
 
 
 	 	c          C   sŽ   t  i i d ƒ o t ƒ  nm t t i ƒ d j oQ t i d }  |  d j o t ƒ  qŠ |  d j o t d t	 ƒ qŠ t
 |  ƒ n t GHd  S(   Nt   SCRIPT_NAMEi   s   --tests   -qtR¤   (   t   ost   environR   Rž   Rp   RJ   t   argvR   R¥   R3   RU   t   __doc__(   R   (    (    R   t   main‚  s    t   __main__(   s   Optional Attributes(   s   Mandatory Attributes(   R   (0   Rª   RJ   R§   t   reR)   t   xml.saxR   t	   cStringIORS   RŽ   R   t	   patAnyURIt   compileRw   Rr   Rq   R†   Rn   Rm   RA   R8   t   Anyt   urlt   descriptiont   linkt   titlet   imaget   itemt   itemst   ChannelR@   R   R   R$   R0   R4   RC   RD   RE   R5   R•   R–   RU   Rž   R2   R¥   R«   R“   (%   RU   Rn   R0   R·   Rr   Rº   R   R¶   R•   Rž   R)   R†   R­   R4   R$   R¥   R«   R@   R´   R–   R°   RJ   R   Rµ   R   Rw   Rq   RS   R³   R¹   RA   R¸   R   Rm   R5   R§   R²   (    (    R   R      sL   - *
<!!fl9					
Ù
		