eaiovnaovbqoebvqoeavibavo 3 ǁaW\@s>dZddlZddlZddlZejddkr4eZeZne Ze ZddZ Gddde Z Gdd d e eZGd d d eZGd d d eZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZejdZejdZejd Zd!d"Zd#d$Z d%d&Z!dNd(d)Z"d*d+Z#d,d-Z$d.d/Z%Gd0d1d1e&Z'Gd2d3d3e'Z(Gd4d5d5Z)d6d7Z*e*d8Z+e*d9Z,e*d:Z-e*d;Z.e*d<e*d=d>Z/ejd?j0Z1eje)j2ej3j0Z4ejd@j0Z5e6edAr ej7dBdCZ8ndDdEZ8dFdGZ9dHdIZ:dJdKZ;GdLdMdMeZsz4FunctionalPseudoElement.__repr__..)rr r$r%)rrrr rs z FunctionalPseudoElement.__repr__cCsdd|jDS)NcSsg|] }|jqSr)type)r'r(rrr r)sz:FunctionalPseudoElement.argument_types..)r%)rrrr argument_typessz&FunctionalPseudoElement.argument_typescCs"|jj\}}}|d7}|||fS)Nr)r"r)rrrr rrr rsz#FunctionalPseudoElement.specificityN)r r rrrrr+rrrrr r}s rc@s0eZdZdZddZddZddZdd Zd S) Functionz( Represents selector:name(expr) cCs||_t||_||_dS)N)r"r r$r%)rr"r$r%rrr rs zFunction.__init__cCs$d|jj|j|jdd|jDfS)Nz %s[%r:%s(%r)]cSsg|] }|jqSr)r&)r'r(rrr r)sz%Function.__repr__..)rr r"r$r%)rrrr rszFunction.__repr__cCsdd|jDS)NcSsg|] }|jqSr)r*)r'r(rrr r)sz+Function.argument_types..)r%)rrrr r+szFunction.argument_typescCs"|jj\}}}|d7}|||fS)Nr)r"r)rrrr rrr rszFunction.specificityN)r r rrrrr+rrrrr r,s r,c@s(eZdZdZddZddZddZdS) Pseudoz# Represents selector:ident cCs||_t||_dS)N)r"r ident)rr"r.rrr rszPseudo.__init__cCsd|jj|j|jfS)Nz %s[%r:%s])rr r"r.)rrrr rszPseudo.__repr__cCs"|jj\}}}|d7}|||fS)Nr)r"r)rrrr rrr rszPseudo.specificityN)r r rrrrrrrrr r-sr-c@s(eZdZdZddZddZddZdS) Negationz. Represents selector:not(subselector) cCs||_||_dS)N)r" subselector)rr"r0rrr rszNegation.__init__cCsd|jj|j|jfS)Nz%s[%r:not(%r)])rr r"r0)rrrr rszNegation.__repr__cCs6|jj\}}}|jj\}}}||||||fS)N)r"rr0)ra1b1c1a2b2c2rrr rszNegation.specificityN)r r rrrrrrrrr r/sr/c@s(eZdZdZddZddZddZdS) Attribz> Represents selector[namespace|attrib operator value] cCs"||_||_||_||_||_dS)N)r" namespaceattriboperatorr&)rr"r8r9r:r&rrr rs zAttrib.__init__cCs\|jrd|j|jf}n|j}|jdkrz %s[%r %s %r])rCrr r"r0)rZcombrrr r*s  zCombinedSelector.__repr__cCs6|jj\}}}|jj\}}}||||||fS)N)r"rr0)rr1r2r3r4r5r6rrr r2szCombinedSelector.specificityN)r r rrrrrrrr rA#srAz%^[ \t\r\n\f]*([a-zA-Z]+)[ \t\r\n\f]*$z6^[ \t\r\n\f]*([a-zA-Z]*)#([a-zA-Z0-9_-]+)[ \t\r\n\f]*$z?^[ \t\r\n\f]*([a-zA-Z]*)\.([a-zA-Z][a-zA-Z0-9_-]*)[ \t\r\n\f]*$cCstj|}|r$tt|jddgStj|}|dk r\ttt|jdpHdd|jdgStj|}|dk rttt|jdpdd|jdgSt t |}||_ t t |S)aParse a CSS *group of selectors*. If you don't care about pseudo-elements or selector specificity, you can skip this and use :meth:`~GenericTranslator.css_to_xpath`. :param css: A *group of selectors* as an Unicode string. :raises: :class:`SelectorSyntaxError` on invalid selectors. :returns: A list of parsed :class:`Selector` objects, one for each selector in the comma-separated group. r)r=N)_el_rematchrr<group_id_rer? _class_rer! TokenStreamtokenizesourcelistparse_selector_group)ZcssrGstreamrrr parseEs    rQccs@|jx2tt|V|jdkr6|j|jq Pq WdS)NDELIM,)rRrS)skip_whitespacerparse_selectorpeeknext)rPrrr rOos  rOcCst|\}}xl|j|j}|d kr(P|r8td||jdddrZ|jj}|jnd}t|\}}t|||}qW||fS) NEOFrRrSz4Got pseudo-element ::%s not at the end of a selector+>~rDrXNrRrS)r\r])parse_simple_selectorrTrVris_delimrWr&rA)rPresultrrVrCZ next_selectorrrr rUys"    rUFc Cs|jt|j}|j}|jdks,|dkrv|jdkrB|jj}n |jd}|jdkrl|j|j}q~|}d}nd}}t||}d}x|j}|jdks|j ddd d s|r|d krP|rt d ||jd krt ||jj}q|d!kr|jt ||j }q|d"kr,|jt||}q|d#krL|j|jd$kr|j|j }|jd%kr|jt|t|}q|j }|jd&krt|}q|jd'krt||}q|j|j|jdkr:|rt dt|dd\} } |j} | rt d| | jf| d(kr.t d| ft|| }nt||t|}qt d|fqWt|j|krt d|jf||fS))NIDENTrRr>|SrXrSrYrZr[)z4Got pseudo-element ::%s not at the end of a selectorHASH.[:( first-line first-letterbeforeafternotzGot nested :not()T)inside_negationz+Got pseudo-element ::%s inside :not() at %szExpected ')', got %szExpected selector, got %s)rRr>)rRrb)rcrX)rRrd)rRrf)rRrg)rRrh)rRrh)rRri)rjrkrlrm)rRri)rRrd)rTlenusedrVr*rWr&next_ident_or_starr<r_rr?r! next_ident parse_attribrparse_argumentsr_unicoder-r^posr/r,) rProZselector_startrVr8r=r`rr.ZargumentZargument_pseudo_elementrWrrr r^s                 r^cCsVg}xL|j|j}|jd ks(|d kr4|j|q|d kr@|Std|fqWdS)NraSTRINGNUMBERrRrY-rdzExpected an argument, got %s)rarxryrRrYrRrz)r{r|)rRrd)rTrWr*appendr)rPr%rWrrr rus  rucCsj|j|j}|dkr6|jdkr6td|jf|jdkrz|j|jdkrhd}|jd}q|}|j}d}nd}}|dkr|j|j}|dkrt|||ddS|dkrd}nD|jdd d d dd o|jdkr|jd}|jntd |f|j|j}|j dkr0td|f|j|j}|dkrXtd|ft|||||jS)NrRrbzExpected '|', got %s=z|=]r;^$r>r[!zOperator expected, got %srarxz Expected string or ident, got %szExpected ']', got %s)rRrb)rRrb)rRr~)rRr)rRr~)rRr~)rarx)rRr) rTrrrVrrWrsr7r_r&r*)r"rPr9r8oprWr&rrr rtsN          rtcCsx|D]}|jdkrtdqWdjdd|Dj}|dkrDdS|d krPdS|d kr\dSd |krpd t|fS|jd d\}}|sd}n&|d ks|d krt|d}nt|}|sd }nt|}||fS)zv Parses the arguments for :nth-child() and friends. :raises: A list of tokens :returns: :``(a, b)`` rxz$String tokens not allowed in series.rcss|] }|jVqdS)N)r&)r'r(rrr +szparse_series..ZoddrErZevenrnrzrY1)rEr)rEr)rr)r* ValueErrorjoinstripintsplit)tokensr(srrrrr parse_series s,    rc@s@eZdZddZddZddZeejdZ eejdZ d S) TokencCstj|||f}||_|S)N)tuple__new__rw)clsZtype_r&rwobjrrr rFsz Token.__new__cCsd|j|j|jfS)Nz<%s '%s' at %i>)r*r&rw)rrrr rKszToken.__repr__cGs|jdko|j|kS)NrR)r*r&)rvaluesrrr r_NszToken.is_delimrrN) r r rrrr_propertyr: itemgetterr*r&rrrr rEs rc@seZdZddZddZdS)EOFTokencCstj|dd|S)NrX)rr)rrwrrr rVszEOFToken.__new__cCsd|j|jfS)Nz <%s at %i>)r*rw)rrrr rYszEOFToken.__repr__N)r r rrrrrrr rUsrc@s<eZdZdZedZdeZdZdeefZdeefZdS) TokenMacrosz&\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?z|\\[^\n\r\f0-9a-f]z\\(?:\n|\r\n|\r|\f)|z [^\0-\177]z[_a-z0-9-]|%s|%sz [_a-z]|%s|%sN) r r runicode_escapeescapeZ string_escapeZnonasciiZnmcharZnmstartrrrr r`s  rcCstj|tttjjS)N)recompilevarsr IGNORECASErG)patternrrr _compilehsrz [ \t\r\n\f]+z[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)z#(?:%(nmchar)s)+z -?(?:%(nmstart)s)(?:%(nmchar)s)*z!([^\n\r\f\\']|%(string_escape)s)*z!([^\n\r\f\\"]|%(string_escape)s)*)'"z\\(.)z\\(?:\n|\r\n|\r|\f) methodcallerrHrcCs |jdS)Nr)rH)rGrrr _replace_simple}srcCs&t|jdd}|tjkrd}t|S)Nri)rrHsys maxunicode_unichr)rGZ codepointrrr _replace_unicodes rcCstt|}tt|}|S)N)_sub_unicode_escaper_sub_simple_escaper)r&rrr unescape_idents  rccs d}t|}x||krt||d}|rBtdd|V|j}qt||d}|r~tttt|j }td||V|j}qt ||d}|rtttt|j dd}td||V|j}q||}|t kr^t |||dd}|st d|j}||krt d ||||kr,t d |tttttd |j }td ||V|d}qt||d}|r|j }td ||V|j}q|d}|||dkr|jd|}|dkr|}q|d7}qtd|||V|d7}qW||kst t|VdS)Nr)rwrcrDrarrez)Should have found at least an empty matchzUnclosed string at %szInvalid string at %srrxryrEz/*z*/rR)rp_match_whitespacerend _match_identrrrrrH _match_hash_match_string_by_quoterBr_sub_newline_escape _match_numberfindr)rrwZlen_srGr&ZquoteZend_posZpos2rrr rLsl            rLc@s>eZdZdddZddZddZdd Zd d Zd d ZdS)rKNc CsTg|_t||_||_d|_d|_y|jj|_Wntk rN|jj |_YnXdS)NF) rqiterrrMpeeked_peekingrW next_tokenAttributeError__next__)rrrMrrr rs zTokenStream.__init__cCs<|jr d|_|jj|j|jS|j}|jj||SdS)NF)rrqr}rr)rrWrrr rWs zTokenStream.nextcCs|js|j|_d|_|jS)NT)rrr)rrrr rVs zTokenStream.peekcCs&|j}|jdkr td|f|jS)NrazExpected ident, got %s)rWr*rr&)rrWrrr rss zTokenStream.next_identcCs6|j}|jdkr|jS|dkr$dStd|fdS)NrarRr>zExpected ident or '*', got %s)rRr>)rWr*r&r)rrWrrr rrs zTokenStream.next_ident_or_starcCs|j}|jdkr|jdS)Nrc)rVr*rW)rrVrrr rTs zTokenStream.skip_whitespace)N) r r rrrWrVrsrrrTrrrr rKs    rK)F)=rrrr: version_infoZunicodervZunichrrstrchrr Exceptionr SyntaxErrorrobjectrr!rr,r-r/r7r<r?rArrFrIrJrQrOrUr^rurtrrrrrrrrrrrsubrrIrrhasattrrrrrrLrKrrrr  sh ;#  *  S-%     A