
    &th                        d dl mZ ddlmZ ddlmZ ddlmZ d dlmZ d dl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlZddlZddlZddlZddlZej        dk    rddlmZ nddlmZ  G d de          ZeefZd Zd Z e            Z d Z!ddZ"d Z# G d de$          Z% e%            Z&[% G d de$          Z' G d de(          Z) e!e)           dS )   )JQueryTranslator    )recursive_repr)	urlencode)urljoin)
url_opener)extract_textdeepcopy)escape)etreeN)      r   )OrderedDictc                   4    e Zd Z e            d             ZdS )r   c                     | s| j         j        dS | j         j        dt          |                                           dS )zod.__repr__() <==> repr(od)z()())	__class____name__dictitemsselfs    c/var/www/html/mycamper/aliexpress-site/backend/venv/lib/python3.11/site-packages/pyquery/pyquery.py__repr__zOrderedDict.__repr__   sL      ;!%!8!8!8::#~666TZZ\\8J8J8J8JKK    N)r   
__module____qualname__r   r    r   r   r   r      s;        				L 	L 
		L 	L 	Lr   r   c                 p    t          j        |           j                                        }d |D             S )Nc                 <    g | ]}|j         |j        k    |j        S r    )kindPOSITIONAL_OR_KEYWORDname.0ps     r   
<listcomp>zgetargspec.<locals>.<listcomp>)   s3     2 2 2qv000 F000r   )inspect	signature
parametersvaluesfuncargss     r   
getargspecr1   '   sA    T""-4466D2 2D 2 2 2 2r   c                 D    t                               | j                   | S )z4decorator for methods who required a camelcase alias)_camel_case_aliasesaddr   )r/   s    r   with_camel_case_aliasr5   -   s    DM***Kr   c           	         t           D ]}t          |                    d                    }|d         d                    d |dd         D                       z   }t	          | |          }t          j        |j        |j        ||j	                  }d|j
        z  |_        t          | ||                    d|                      dS )z add camelcase aliases to PyQuery_r    c                 6    g | ]}|                                 S r    )titler&   s     r   r)   z,build_camel_case_aliases.<locals>.<listcomp>:   s     "@"@"@17799"@"@"@r   r   Nz-Alias for :func:`~pyquery.pyquery.PyQuery.%s`)r3   listsplitjoingetattrtypesFunctionType__code____globals____defaults__r   __doc__setattr__get__)PyQueryaliaspartsr%   r/   fs         r   build_camel_case_aliasesrK   6   s    $ 9 9U[[%%&&Qx"''"@"@eABBi"@"@"@AAAw&&t}d.>#T%68 8 <t}M	qyyw7788889 9r   c                    t          | d          rt          | j        d          rd}nd}|R|	  t          t          |          |           }n]# t          j        $ rK t          | d          r|                     d            t          t          j        |          |           }Y nw xY wt          |t          j	                  r|
                                gS |gS |dk    rt          t          |          }n|d	k    rt          t          j        |          }nd|d
k    rddlm} t          ||          }nG|dk    rddlm} t          ||          }n*|dk    rt          j        j        }nt          d|z             ||           }t          |t                     r|S t          |t          j	                  r|
                                gS ||gS g S )z/use html parser if we don't have clean xml
    read__call__parse
fromstringNseekr   xmlhtmlhtml5)html5parsersoup)
soupparserhtml_fragmentszNo such parser: "%s")hasattrrM   r>   r   XMLSyntaxErrorrQ   lxmlrS   
isinstance_ElementTreegetroot	lxml.htmlrU   rW   fragments_fromstring
ValueErrorr;   )contextparsercustom_parsermethresultrU   rW   s          r   rP   rP   C   s    w GGL*$E$E >;---g66' ; ; ;7F++ $LLOOO1D11'::; &%"455  (())xu__#E400MMv#DIt44MMw------#K66MMv,,,,,,#J55MM''' I:MM3f<===]7##F&$ 	FE.	/	/   !!		x	s   A AB*)B*c                 0     | |d | j         j                  S N)rA   co_argcountr.   s     r   callbackrj   p   s    40t}00122r   c                       e Zd Zd ZdS )	NoDefaultc                     dS )zclean representation in Sphinxz<NoDefault>r    r   s    r   r   zNoDefault.__repr__u   s    }r   N)r   r   r   r   r    r   r   rl   rl   t   s#            r   rl   c                   *    e Zd ZdZeefdZd Zd ZdS )FlexibleElementz property to allow a flexible apic                 0    || _         || _        || _        d S rh   )pgetpsetpdel)r   rq   rr   rs   s       r   __init__zFlexibleElement.__init__   s    					r   c                 F      G  fddt                     } |            S )Nc                   J    e Zd ZdZ fdZexZxZxZZ fdZ	e	Z
fdZdS ))FlexibleElement.__get__.<locals>._elementzOreal element to support set/get/del attr and item and js call
            stylec                 &     j         g|R i |S rh   )rq   )propr0   kwargsinstancer   s      r   rN   z2FlexibleElement.__get__.<locals>._element.__call__   s%     ty;D;;;F;;;r   c                 h    j         t          ur                     |          S t                      rh   )rs   
no_defaultNotImplementedError)ry   r%   r{   r   s     r   __delitem__z5FlexibleElement.__get__.<locals>._element.__delitem__   s0    9J..99Xt444-///r   c                 "    dj         j        z  S )Nz<flexible_element %s>)rq   r   )ry   r   s    r   r   z2FlexibleElement.__get__.<locals>._element.__repr__   s    .1CCCr   N)r   r   r   rD   rN   __getattr____getitem____setattr____setitem__r   __delattr__r   )r{   r   s   r   _elementrw      s         < < < < < <DLLKL+Lk0 0 0 0 0 0
 &KD D D D D D Dr   r   )object)r   r{   klassr   s   ``  r   rF   zFlexibleElement.__get__   sV    	D 	D 	D 	D 	D 	D 	D 	Dv 	D 	D 	D  xzzr   c                 j    | j         t          ur|                      ||           d S t                      rh   )rr   r}   r~   )r   r{   values      r   __set__zFlexibleElement.__set__   s5    9J&&IIh&&&&&%'''r   N)r   r   r   rD   r}   rt   rF   r   r    r   r   ro   ro   ~   sQ        **",:    
  &( ( ( ( (r   ro   c                      e Zd ZdZeZd ZdXdZd Zd Z	e
j        Ze
j        Zd Zd ZdYd
Zd Zd Zd Zd Zd Zd Zed             Zed             ZdZdZdYdZdYdZdYdZd Zd Zd Z e!dYd            Z"e!dYd            Z#d Z$e!dYd            Z%dYdZ&dYd Z'dYd!Z(dYd"Z)d# Z*d$ Z+d% Z,d& Z-d' Z.d( Z/d) Z0d* Z1ed+             Z2d, Z3d- Z4d. Z5e!d/             Z6 e7e5e60          Z5e8fd1Z9e8fd2Z:e!d3             Z;e!d4             Z<e!d5             Z=e!d6             Z>d7 Z? e7e?e?8          Z?d9 Z@d: ZAe8fd;ZBe8fd<ZCe!d[d>            ZDe8fd?ZEd@ ZFdA Ze!dB             ZGdC ZHe!dD             ZIdE ZJe!dF             ZKdG ZLe!dH             ZMdI ZNe!dJ             ZOe!dK             ZPe!dL             ZQdM ZRdN ZSe8fdOZT G dP dQeU          ZV eV            ZWe!dR             ZXdS ZYe!dT             ZZe!dU             Z[edV             Z\dYdWZ]d	S )\rG   zThe main class
    c                 n   d }g }d | _         |                    dd           | _        d|v r|                    d          | _        nt          | _        d|v r|                    d          | _        n`| j        dv r|                     d          | _        n;| j        t          ur| j        j        | _        n|                     d          | _        |                    dd           | _        |rd	|v r+t          |d	         |	                    d
                    }ntd|v r^|                    d          }d|v r|                    d          } ||fi |}nt          ||          }| j        sd| _        || _         nt          d|z            t          || j                  }t          |d          r(	 |                                 nM# t          $ r Y n@w xY wn:t          x}}t!          |          }	|	dk    r	|d         }n|	dk    r|\  }}nt          d          t#          |t$                    r&	 t          || j                  }nt# t          $ r  w xY wt#          || j                  r|d d          }nEt#          |t(                    r|}n-t#          |t*          j                  r|g}nt/          |          |rV|t          urM|                     |          }
g }|D ]1}|                    |                    |
| j                             2|}t(                              | |           d S )Nrc   parentcss_translator)rR   T)xhtmlF
namespacesfilenameencodingr   urlopenerrS   zInvalid keyword arguments %scloser   r      z,You can't do that. Please, provide argumentsr   )	_base_urlpoprc   _parentr}   _translator_translator_classr   opengetr   ra   rP   rY   r   	Exceptionlenr\   
basestringr   r;   r   _Element	TypeError_css_to_xpathextendxpathrt   )r   r0   rz   rS   elementsr   r   selectorrb   lengthr   resultstags                r   rt   zPyQuery.__init__   s   jj400v!::h//DLL%DLv%%%zz*:;;D[H$$#55D5AAD\++#|7D#55E5BBD **\488 ?	#V##F:.%+ZZ
%;%;= = =&jj''v%%#ZZ11F!6#0000DD%c622D{ )"(DK!$ !?&!HIII!$44HtW%% JJLLLL    D ",+HwYYF{{q'1$(!'' BD D D ':.. ))'4;??HH    GT^44 )"111:GT** )"GU^44 )#9(((  #HJ66**844# F FCNN		%DO	DDF F F F"dH%%%%%s   7G 
GG8I Idescendant-or-self::c                 d    |                     dd          }| j                            ||          S )Nz[@[)replacer   css_to_xpath)r   r   prefixs      r   r   zPyQuery._css_to_xpath   s0    ##D#..,,Xv>>>r   c                 R    |                     d| j                    | j        |i |S )Nr   )
setdefaultr   r   )r   r0   rz   s      r   _copyzPyQuery._copy  s1    ,888t~t.v...r   c                 L   t          |          }|dk    rt          d          |d         dk    r|                     g           S t          |          dk    r<t          |d         t                    r!|d                             d          s|| fz  } | j        |d| i|}|S )z&return a new PyQuery instance
        r   z$You must provide at least a selectorr8   r   <r   )r   ra   r   r\   str
startswith)r   r0   rz   r   rf   s        r   rN   zPyQuery.__call__  s     TQ;;CDDD7b==::b>>!IINN47C(( G&&s++  TGODT9$9&99r   c                     t          || j                  sJ |                     | d d          |d d          z             S rh   )r\   r   r   r   others     r   __add__zPyQuery.__add__  sA    %00000zz$qqq'E!!!H,---r   c                 n    t          || j                  sJ |                     |dd                    | S )z"Extend with another PyQuery objectN)r\   r   _extendr   s     r   r   zPyQuery.extend  s9    %00000U111Xr   Nc              #   j   K   |r | |          pg }n| }|D ]}|                      ||           V  dS )al  Iter over elements. Return PyQuery objects:

            >>> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
            >>> [i.text() for i in d.items('span')]
            ['foo', 'bar']
            >>> [i.text() for i in d('span').items()]
            ['foo', 'bar']
            >>> list(d.items('a')) == list(d('a').items())
            True
        r   N)r   )r   r   elemselems       r   r   zPyQuery.items$  sa        	DNN(bEEE 	0 	0D**T$*//////	0 	0r   c                     	 | d                                          }t          j                            |           n# t          $ r Y nw xY w| S )a  Remove xhtml namespace:

            >>> doc = PyQuery(
            ...         '<html xmlns="http://www.w3.org/1999/xhtml"></html>')
            >>> doc
            [<{http://www.w3.org/1999/xhtml}html>]
            >>> doc.xhtml_to_html()
            [<html>]
        r   )getroottreer[   rS   xhtml_to_html
IndexErrorr   roots     r   r   zPyQuery.xhtml_to_html6  s`    	*7&&((D I##D))))  	 	 	D	 s   < 
A	A	c                    	 | d                                          }|                    d          D ]B}|j                            d          r&|j                            dd          d         |_        Cn# t
          $ r Y nw xY w| S )zRemove all namespaces:

            >>> doc = PyQuery('<foo xmlns="http://example.com/foo"></foo>')
            >>> doc
            [<{http://example.com/foo}foo>]
            >>> doc.remove_namespaces()
            [<foo>]
        r   z{*}*{}r   )r   iterr   r   r<   r   )r   r   els      r   remove_namespaceszPyQuery.remove_namespacesH  s    	57&&((D ii'' 5 56$$S)) 5V\\#q11!4BF5  	 	 	D	 s   A5 5
BBc                 @    d                     d | D                       S )zxml representation of current nodes::

            >>> xml = PyQuery(
            ...   '<script><![[CDATA[ ]></script>', parser='html_fragments')
            >>> print(str(xml))
            <script>&lt;![[CDATA[ ]&gt;</script>

        r8   c                 D    g | ]}t          j        |t                     S r   r   tostringr   r'   es     r   r)   z#PyQuery.__str__.<locals>.<listcomp>d  s'    FFFAq3777FFFr   r=   r   s    r   __str__zPyQuery.__str__[  s%     wwFFFFFGGGr   c                 @    d                     d | D                       S )z#xml representation of current nodesr8   c                 D    g | ]}t          j        |t                     S r   r   r   s     r   r)   z'PyQuery.__unicode__.<locals>.<listcomp>h  s7     ( ( ( C888 ( ( (r   r   r   s    r   __unicode__zPyQuery.__unicode__f  s4    xx ( ("&( ( ( ) ) 	)r   c                 @    d                     d | D                       S )zhtml representation of current nodes::

            >>> html = PyQuery(
            ...   '<script><![[CDATA[ ]></script>', parser='html_fragments')
            >>> print(html.__html__())
            <script><![[CDATA[ ]></script>

        r8   c                 Z    g | ](}t           j                            |t                     )S r   )r[   rS   r   r   r   s     r   r)   z$PyQuery.__html__.<locals>.<listcomp>t  s=     ( ( ( ++A+<< ( ( (r   r   r   s    r   __html__zPyQuery.__html__k  s6     xx ( ("&( ( ( ) ) 	)r   c                    g }	 | D ]}|                     d          }|r+dd                    |                    d                    z   pd}|                     d          }|rd|z   pd}|                    d|j        ||d           d	d
                    |          z   dz   S # t
          $ r t                              |           cY S w xY w)Nclass. r8   id#r   >r   z, ])r   r=   r<   appendr   AttributeErrorr;   r   )r   rr   cr   s        r   r   zPyQuery.__repr__w  s    		' 7 7FF7OO6# 6 66<"VVD\\_C"H*rvvrr11156666$))A,,'#-- 	' 	' 	'==&&&&&	's   B#B( ($CCc                     | j         t          ur| j         d                                         S | d                                         S )z$return the xml root element
        r   )r   r}   r   r   s    r   r   zPyQuery.root  s?     <z))<?..000Aw""$$$r   c                 :    | j         }|| j         j        j        S dS )z4return the xml encoding of the root element
        N)r   docinfor   r   s     r   r   zPyQuery.encoding  s'     y9$-- r   Fc                 F   ||}nL|                      |d          }g }|D ]1}|                    |                    || j                             2|r|                                 |r"|}g }|D ]}	|	|vr|                    |	           |                     ||           S )z]Filters the selection set only, as opposed to also including
           descendants.
        Nzself::r   r   )r   r   r   r   reverser   r   )
r   r   r   r   uniquer   r   r   result_listitems
             r   _filter_onlyzPyQuery._filter_only  s     GG&&x::EG M Msyy4?yKKLLLL 	OO 	)!KG# ) )w&&NN4(((zz'$z///r   c                 F    |                      |d | D             d          S )Nc                 ^    g | ]*}|                                 |                                 +S rh   )	getparentr   s     r   r)   z"PyQuery.parent.<locals>.<listcomp>  s-    FFFqAKKMM,EQ[[]],E,E,Er   Tr   r   r   r   s     r   r   zPyQuery.parent  s6      FFDFFF !   	r   c                 B    |                      |d | D                       S )Nc                 ^    g | ]*}|                                 |                                 +S rh   )getpreviousr   s     r   r)   z PyQuery.prev.<locals>.<listcomp>  s-    JJJammoo.IQ]]__.I.I.Ir   r   r   s     r   prevzPyQuery.prev  s1      JJdJJJL L 	Lr   c                 B    |                      |d | D                       S )Nc                 ^    g | ]*}|                                 |                                 +S rh   )getnextr   s     r   r)   z PyQuery.next.<locals>.<listcomp>  s-    BBBQ!))++*AQYY[[*A*A*Ar   r   r   s     r   nextzPyQuery.next  s1      BB$BBBD D 	Dr   c              #      K   | D ]:} t          ||                      }||V   t          ||                      }|;d S rh   )r>   )r   methodr   currents       r   	_traversezPyQuery._traverse  se       	5 	5A(ga((**G%2''62244 %	5 	5r   c              #      K   | D ]b}g }|                                 }|+|                    |           |                                 }|+|                                 |D ]}|V  cd S rh   )r   r   r   )r   r   	this_listr  js        r   _traverse_parent_topdownz PyQuery._traverse_parent_topdown  s       	 	AIkkmmG%  )))!++-- %   	 	r   c                 @    d |                      d          D             S )Nc                     g | ]}|S r    r    r   s     r   r)   z%PyQuery._next_all.<locals>.<listcomp>  s    555a555r   r  r  r   s    r   	_next_allzPyQuery._next_all  s"    554>>)445555r   c                 R    |                      ||                                           S )z
        >>> h = '<span><p class="hello">Hi</p><p>Bye</p><img scr=""/></span>'
        >>> d = PyQuery(h)
        >>> d('p:last').next_all()
        [<img>]
        >>> d('p:last').nextAll()
        [<img>]
        )r   r  r   s     r   next_allzPyQuery.next_all  s$       4>>+;+;<<<r   c           	          |                      |d t          j        fd|                                                                           D                       S )z
        >>> h = '''
        ... <h2>Greeting 1</h2>
        ... <p>Hello!</p><p>World!</p>
        ... <h2>Greeting 2</h2><p>Bye!</p>
        ... '''
        >>> d = PyQuery(h)
        >>> d('h2:first').nextUntil('h2')
        [<p>, <p>]
        c                     g | ]	}|D ]}|
S r    r    )r'   qr   s      r   r)   z&PyQuery.next_until.<locals>.<listcomp>  s?       	      r   c                 0    |                                 S rh   is_)r  r   s    r   <lambda>z$PyQuery.next_until.<locals>.<lambda>  s    !%%//1 r   )r   	itertools	takewhiler  r   )r   r   filter_s    ` r   
next_untilzPyQuery.next_until  sm         ",11114==??3H3H3J3JL L  
 
 	
r   c                 @    d |                      d          D             S )Nc                     g | ]}|S r    r    r   s     r   r)   z%PyQuery._prev_all.<locals>.<listcomp>  s    999a999r   r   r  r   s    r   	_prev_allzPyQuery._prev_all  s"    994>>-889999r   c                 V    |                      ||                                 d          S )z
        >>> h = '<span><p class="hello">Hi</p><p>Bye</p><img scr=""/></span>'
        >>> d = PyQuery(h)
        >>> d('p:last').prev_all()
        [<p.hello>]
        >>> d('p:last').prevAll()
        [<p.hello>]
        T)r   )r   r  r   s     r   prev_allzPyQuery.prev_all  s)       4>>+;+;T JJJr   c                 |    |                      ||                                 |                                 z             S )z
         >>> h = '<span><p class="hello">Hi</p><p>Bye</p><img scr=""/></span>'
         >>> d = PyQuery(h)
         >>> d('.hello').siblings()
         [<p>, <img>]
         >>> d('.hello').siblings('img')
         [<img>]

        )r   r  r  r   s     r   siblingszPyQuery.siblings  s3       4>>+;+;dnn>N>N+NOOOr   c                 j    |                      |d |                                 D             d          S )z
        >>> d = PyQuery('<span><p class="hello">Hi</p><p>Bye</p></span>')
        >>> d('p').parents()
        [<span>]
        >>> d('.hello').parents('span')
        [<span>]
        >>> d('.hello').parents('p')
        []
        c                     g | ]}|S r    r    r   s     r   r)   z#PyQuery.parents.<locals>.<listcomp>  s    8881Q888r   Tr   )r   r
  r   s     r   parentszPyQuery.parents  sD       885577888 ! 
 
 	
r   c                 F    d | D             }|                      ||          S )aG  Filter elements that are direct children of self using optional
        selector:

            >>> d = PyQuery('<span><p class="hello">Hi</p><p>Bye</p></span>')
            >>> d
            [<span>]
            >>> d.children()
            [<p.hello>, <p>]
            >>> d.children('.hello')
            [<p.hello>]
        c                 @    g | ]}|                                 D ]}|S r    )getchildren)r'   r   childs      r   r)   z$PyQuery.children.<locals>.<listcomp>*  s/    IIIcs7H7HIIeEIIIIr   r   )r   r   r   s      r   childrenzPyQuery.children  s.     JITIII  8444r   c                 <   g }| D ]}|f|                      |                              |          s>|                                }|(|                      |                              |          >||                    |           |                      ||           S )aC  
        >>> d = PyQuery(
        ...  '<div class="hello"><p>This is a '
        ...  '<strong class="hello">test</strong></p></div>')
        >>> d('strong').closest('div')
        [<div.hello>]
        >>> d('strong').closest('.hello')
        [<strong.hello>]
        >>> d('strong').closest('form')
        []
        Nr   )r   r  r   r   )r   r   rf   r  s       r   closestzPyQuery.closest-  s      	' 	'G&

7++//99 '!++-- &

7++//99 ' "g&&&zz&z...r   c                     g }| D ]1}|                     |                    d| j                             2|                     ||           S )z
        Return contents (with text nodes):

            >>> d = PyQuery('hello <b>bold</b>')
            >>> d.contents()  # doctest: +ELLIPSIS
            ['hello ', <Element b at ...>]
        zchild::text()|child::*r   r   )r   r   r   r   )r   r   r   s      r   contentszPyQuery.contentsB  sf      	8 	8DNN4::&>&*o & 7 7 8 8 8 8zz'$z///r   c                    t          |d          s|                     ||           S g }t          t                    }	 t	          |           D ]H\  }}t          |          dk    r
||j        d<   t          |||          r|                    |           I	 |j        }d|v r|d= n# |j        }d|v r|d= w xY w|                     ||           S )a  Filter elements in self using selector (string or function):

            >>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p>')
            >>> d('p')
            [<p.hello>, <p>]
            >>> d('p').filter('.hello')
            [<p.hello>]
            >>> d('p').filter(lambda i: i == 1)
            [<p>]
            >>> d('p').filter(lambda i: PyQuery(this).text() == 'Hi')
            [<p.hello>]
            >>> d('p').filter(lambda i, this: PyQuery(this).text() == 'Hi')
            [<p.hello>]
        rN   r   thisr   )	rY   r   r1   rj   	enumerater   rB   r   r   )r   r   r   r0   ir0  	f_globalss          r   filterzPyQuery.filterP  s    x,, 	5$$Xt444Hh''D	*( . .GAt4yyA~~7;,V4!T22 . ---	. %0	Y&&!&) %0	Y&&!&)))))::ht:444s   AB& &B6c                     t          |                     ||                     |                     fd| D             |           S )zReturn elements that don't match the given selector:

            >>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p><div></div>')
            >>> d('p').not_('.hello')
            [<p>]
        c                     g | ]}|v|	S r    r    )r'   r   excludes     r   r)   z PyQuery.not_.<locals>.<listcomp>x  s#    ???aw.>.>1.>.>.>r   r   )setr   )r   r   r7  s     @r   not_zPyQuery.not_p  sU     djj40011zz????d???!%  ' ' 	'r   c                 H    t          |                     ||                     S )al  Returns True if selector matches at least one current element, else
        False:

            >>> d = PyQuery('<p class="hello"><span>Hi</span></p><p>Bye</p>')
            >>> d('p').eq(0).is_('.hello')
            True

            >>> d('p').eq(0).is_('span')
            False

            >>> d('p').eq(1).is_('.hello')
            False

        ..
        )boolr   r   s     r   r  zPyQuery.is_{  s"      D%%h55666r   c                                            |           fd D             }g }|D ]}|                    |                                |           S )a&  Find elements using selector traversing down from self:

            >>> m = '<p><span><em>Whoah!</em></span></p><p><em> there</em></p>'
            >>> d = PyQuery(m)
            >>> d('p').find('em')
            [<em>, <em>]
            >>> d('p').eq(1).find('em')
            [<em>]
        c                 v    g | ]5}|                                 D ]}|                    j                   6S )r   )r(  r   r   )r'   r   r)  r   r   s      r   r)   z PyQuery.find.<locals>.<listcomp>  sZ     3 3 3 # 1 13 3 ;;u;AA 3 3 3 3r   r   )r   r   r   )r   r   r   r   r   r   s   `    @r   findzPyQuery.find  s     ""8,,3 3 3 3 3"3 3 3  	 	AOOAzz(4z000r   c                 h    	 | |         }n# t           $ r g }Y nw xY w|                     ||           S )a.  Return PyQuery of only the element with the provided index::

            >>> d = PyQuery('<p class="hello">Hi</p><p>Bye</p><div></div>')
            >>> d('p').eq(0)
            [<p.hello>]
            >>> d('p').eq(1)
            [<p>]
            >>> d('p').eq(2)
            []

        ..
        r   )r   r   )r   indexr   s      r   eqz
PyQuery.eq  sL    	KEE 	 	 	EEE	zz%z---s    c                     	 t          |           D ]$\  }}||j        d<   t          |||          du r n%|j        }d|v r|d= n# |j        }d|v r|d= w xY w| S )z!apply func on each nodes
        r0  F)r1  rB   rj   )r   r/   r2  elementr3  s        r   eachzPyQuery.each  s    	&'oo  
7+2 (D!W--66E 7 (I""f% (I""f%%%%%s   4A Ac                 `   g }	 t          |           D ]b\  }}||j        d<   t          |||          }|@t          |t                    s|                    |           M|                    |           c	 |j        }d|v r|d= n# |j        }d|v r|d= w xY w|                     ||           S )a;  Returns a new PyQuery after transforming current items with func.

        func should take two arguments - 'index' and 'element'.  Elements can
        also be referred to as 'this' inside of func::

            >>> d = PyQuery('<p class="hello">Hi there</p><p>Bye</p><br />')
            >>> d('p').map(lambda i, e: PyQuery(e).text())
            ['Hi there', 'Bye']

            >>> d('p').map(lambda i, e: len(PyQuery(this).text()))
            [8, 3]

            >>> d('p').map(lambda i, e: PyQuery(this).text().split())
            ['Hi', 'there', 'Bye']

        r0  Nr   )r1  rB   rj   r\   r;   r   r   r   )r   r/   r   r2  rC  rf   r3  s          r   mapzPyQuery.map  s    " 	&'oo - -
7+2 (!$733%%fd33 -V,,,,V,,,- (I""f% (I""f%%%%%zz%z---s   A2B Bc                      t          |           S rh   r   r   s    r   r   zPyQuery.length  s    4yyr   c                      t          |           S rh   rH  r   s    r   sizezPyQuery.size  s    4yyr   c                     | j         S )a  Break out of a level of traversal and return to the parent level.

            >>> m = '<p><span><em>Whoah!</em></span></p><p><em> there</em></p>'
            >>> d = PyQuery(m)
            >>> d('p').eq(1).find('em').end().end()
            [<p>, <p>]
        )r   r   s    r   endzPyQuery.end  s     |r   c                    ddd}t           x}}t          |          }|dk    r|d         }|                    ||          }no|dk    r|\  }}|                    ||          }nM|r6i }|                                D ]\  }}|||                    ||          <   nt	          d|d|          | sd	S t          |t                    r6| D ]2}	|                                D ]\  }
}|	                    |
|           3nV|t           u r| d                             |          S ||                     |          S | D ]}	|	                    ||           | S )
z Attributes manipulation
        r   for)class_for_r   r   r   Invalid arguments r   N)	r}   r   r   r   ra   r\   r   r8  remove_attr)r   r0   rz   mappingattrr   r   kvr   keys              r   rT  zPyQuery.attr  s    %e44!!uTQ;;7D;;tT**DDq[[KD%;;tT**DD 	ID , ,1*+W[[A&&'', *$$$GHHH 	%4d## 
	% ( ("&**,, ( (JCGGC''''(( j  7;;t$$$]##D))) % %e$$$$r   c                 B    | D ]}	 |j         |= # t          $ r Y w xY w| S )zRemove an attribute::

            >>> d = PyQuery('<div id="myid"></div>')
            >>> d.remove_attr('id')
            [<div>]
            >>> d.removeAttr('id')
            [<div>]

        ..
        )attribKeyError)r   r%   r   s      r   rR  zPyQuery.remove_attr  sJ      	 	CJt$$   s   
)rq   rs   c                 .    |                      d|          S )z"set/get height of element
        heightrT  r   r   s     r   r\  zPyQuery.height5  s     yy5)))r   c                 .    |                      d|          S )z!set/get width of element
        widthr]  r^  s     r   r`  zPyQuery.width:  s     yy%(((r   c                 2    |                      d|z            S )zReturn True if element has class::

            >>> d = PyQuery('<div class="myclass"></div>')
            >>> d.has_class('myclass')
            True
            >>> d.hasClass('myclass')
            True

        ..
        z.%sr  )r   r%   s     r   	has_classzPyQuery.has_class?  s     xx%%%r   c                    | D ]z}|                     d          }|                    d          pd                                 fd|D             z  |                    dd                                         {| S )zAdd a css class to elements::

            >>> d = PyQuery('<div></div>')
            >>> d.add_class('myclass')
            [<div.myclass>]
            >>> d.addClass('myclass')
            [<div.myclass>]

        ..
        r   r   r8   c                     g | ]}|v|	S r    r    r'   rV  classess     r   r)   z%PyQuery.add_class.<locals>.<listcomp>\  s#    >>>aQg-=-=-=-=-=r   r<   r   r8  r=   r   r   r   r-   rf  s       @r   	add_classzPyQuery.add_classM  s      	0 	0C[[%%Fwww''-24466G>>>>6>>>>GGGGSXXg..////r   c                    | D ]}|                     d          }t          |                    d          pd                                           }|                    |           |                    dg           d                    |          }|                                r|                    d|           |                    d          r|                    d|           | S )zRemove a css class to elements::

            >>> d = PyQuery('<div class="myclass"></div>')
            >>> d.remove_class('myclass')
            [<div>]
            >>> d.removeClass('myclass')
            [<div>]

        ..
        r   r   r8   )r<   r8  r   difference_updater=   striprh  s        r   remove_classzPyQuery.remove_class`  s      		* 		*C[[%%F3777++1r88::;;G%%f---%%rd+++hhw''G}} *))))!! *)))r   c                 @   | D ]}|                     d          }|                    d          pd                                 fd|D             }fd|D             fdD             |z  |                    dd                                         | S )zToggle a css class to elements

            >>> d = PyQuery('<div></div>')
            >>> d.toggle_class('myclass')
            [<div.myclass>]
            >>> d.toggleClass('myclass')
            [<div>]

        r   r   r8   c                     g | ]}|v|	S r    r    re  s     r   r)   z(PyQuery.toggle_class.<locals>.<listcomp>  s#    CCC1!72B2BQ2B2B2Br   c                     g | ]}|v |	S r    r    re  s     r   r)   z(PyQuery.toggle_class.<locals>.<listcomp>  s    ???1!w,,Q,,,r   c                     g | ]}|v|	S r    r    )r'   rV  values_to_dels     r   r)   z(PyQuery.toggle_class.<locals>.<listcomp>  s#    DDDQQm-C-Cq-C-C-Cr   rg  )r   r   r   r-   values_to_addrf  rr  s        @@r   toggle_classzPyQuery.toggle_classx  s      	0 	0C[[%%Fwww''-24466GCCCCCCCM???????MDDDD'DDDG}$GGGGSXXg..////r   c                   	 t           x}t          |          }|dk    r	|d         n&|dk    r|\  }n|r|nt          d|d|          t          t                    r| D ]}d                                 D             		fd|                    d          pd	                    d
          D             }                                D ]5\  }}|	                    dd          }|
                    |d|           6|                    dd                    |                     nt          |t                    r	                    dd          | D ]{}fd|                    d          pd	                    d
          D             }|
                    d|           |                    dd                    |                     || S )z$css attributes manipulation
        r   r   r   rQ  r   c                 ^    g | ]*}|                                                     d d          +S )r7   -)rl  r   )r'   rW  s     r   r)   zPyQuery.css.<locals>.<listcomp>  s@     !9 !9 !9%( "%!4!4S#!>!> !9 !9 !9r   c                     g | ]Y}|                                 rC|                    d           d                                          vE|                                 ZS :r   rl  r<   )r'   r   stripped_keyss     r   r)   zPyQuery.css.<locals>.<listcomp>  sj     N N N! hhjjN  "xx}}Q/5577}LL 88::  MLLr   styler8   ;r7   rw  z: z; c                     g | ]m}|                                 rW|                    d           d                                                                           k    Y|                                 nS ry  r{  )r'   r   rT  s     r   r)   zPyQuery.css.<locals>.<listcomp>  sr     G G G

G HHSMM!,2244

DD HHJJ EDDr   )r}   r   ra   r\   r   keysr   r<   r   r   r   r8  r=   r   )
r   r0   rz   r   r   r   r  rW  rT  r|  s
           @@r   csszPyQuery.css  sF    "!uTQ;;7DDq[[KD%% 	IDD*$$$GHHHdD!! 	5 
5 
5!9 !9,0IIKK!9 !9 !9N N N N&)ggg&6&6&<"%C%CC%H%HN N N #'**,, < <JC++c3//CNNsssEE#:;;;;7!3!34444
5 z** 		5<<S))D 5 5G G G G"www//52<<SAAG G G
 44478887!3!34444r   )rq   rr   c                 .    |                      dd          S )zAdd display:none to elements style:

            >>> print(PyQuery('<div style="display:none;"/>').hide())
            <div style="display: none"/>

        displaynoner  r   s    r   hidezPyQuery.hide  s     xx	6***r   c                 .    |                      dd          S )zAdd display:block to elements style:

            >>> print(PyQuery('<div />').show())
            <div style="display: block"/>

        r  blockr  r   s    r   showzPyQuery.show  s     xx	7+++r   c                       fd} fd}|t           u r"t                     r | d                   S dS  | |            S )a  Set the attribute value::

            >>> d = PyQuery('<input />')
            >>> d.val('Youhou')
            [<input>]

        Get the attribute value::

            >>> d.val()
            'Youhou'

        Set the selected values for a `select` element with the `multiple`
        attribute::

            >>> d = PyQuery('''
            ...             <select multiple>
            ...                 <option value="you"><option value="hou">
            ...             </select>
            ...             ''')
            >>> d.val(['you', 'hou'])
            [<select>]

        Get the selected values for a `select` element with the `multiple`
        attribute::

            >>> d.val()
            ['you', 'hou']

        c                 V   | j         dk    r'                    |                                           S | j         dk    rd| j        v rC                     |           d          }t	          |                    fd                    S                      |           d          }|r|                    d          S                      |           d                              d          S                     d	          r.                    |                               d          }|d
S |S | j         dk    rB                    |                               d          }|r|                    dd          ndS                     |                               d          pdS )Ntextareaselectmultiplezoption[selected]c                 T                         |                              d          S )Nr   )r   rT  )r7   or   s     r   r  z1PyQuery.val.<locals>._get_value.<locals>.<lambda>  s    TZZ]]%7%7%@%@ r   zoption[selected]:lastr   optionz:checkbox,:radiooninput
r8   )	r   r   rS   rY  r;   rF  rT  r  r   )r   selectedselected_optionvalr   s       r   
_get_valuezPyQuery.val.<locals>._get_value  s   w*$$zz#++---H$$++.tzz#/ABBH@@@@! !    #2$**S//2I"J"J" C*//888*4::c??84499'BBB,-- 	<jjoo**733;4JG##jjoo**73303;s{{4,,,;::c??''006B6r   c                    | D ]j         dk    rQt          t                    sgfd}                               d                              |           ^t          t                    rd                              j         dk    r)                                                                                                               d           d S )Nr  c                                          |          }|                    d          v r(|                    dd           dj        vrd d = d S d S |                    d           d S )Nr   r  r  )r   rT  rY  
removeAttr)r7   r   pqr   r   r   s      r   _make_option_selectedz>PyQuery.val.<locals>._set_value.<locals>._make_option_selected  s}    !ZZ--777++u44GGJ
;;;);;$)!!!HHH  <; MM*55555r   r  ,r  r   )r   r\   r;   r   rD  r=   textrT  )r  r   r  r   r   s    ` @r   
_set_valuezPyQuery.val.<locals>._set_value  s    5 57h&&%eT22 (!&6 6 6 6 6 6 6 $DJJsOOH--223HIIIeT** ,HHUOOE7j((JJsOO((///

3$$We444435 5r   r   N)r}   r   )r   r   r  r  s   `   r   r  zPyQuery.val  s    <	7 	7 	7 	7 	7@	5 	5 	5 	5 	58 J4yy +!z$q'***+ + JtU###Kr   c                    |t           u rp| sdS | d         }|                                }t          |j        pdd          }|s|S dvr
t          d<   |d                    fd|D                       z  }|S t          || j                  rt	          |          }n9t          |t                    r|}n!|sd}nt          t          |                    | D ]}|                                D ]}|                    |           t          d|z   d	z   | j                  d         }|                                }|r|                    |           |j        |_        | S )
ak  Get or set the html representation of sub nodes.

        Get the text value::

            >>> d = PyQuery('<div><span>toto</span></div>')
            >>> print(d.html())
            <span>toto</span>

        Extra args are passed to ``lxml.etree.tostring``::

            >>> d = PyQuery('<div><span></span></div>')
            >>> print(d.html())
            <span/>
            >>> print(d.html(method='html'))
            <span></span>

        Set the text value::

            >>> d.html('<span>Youhou !</span>')
            [<div>]
            >>> print(d)
            <div><span>Youhou !</span></div>
        Nr   r8   F)quoter   c                 4    g | ]}t          j        |fi S r    )r   r   )r'   r   rz   s     r   r)   z PyQuery.html.<locals>.<listcomp>Q  s;     1 1 1"# $nQ99&99 1 1 1r   <root></root>)r}   r(  r   r  r   r=   r\   r   r   ra   typeremoverP   rc   r   )	r   r   rz   r   r*  rS   new_htmlr)  r   s	     `      r   rS   zPyQuery.html/  s   0 J tq'C((H#(.b666D ''%(z"CHH 1 1 1 1'/1 1 1 2 2 2DK%00 .u::E:.. .  . e--- 	% 	% __.. & &EJJu%%%%!(:5K! !!"$  ++-- )JJx(((9r   rS   c                     | sdS | d         }|j         rt          |          }d|_         t          j        |t          |          S )a  Get the html representation of the first selected element::

            >>> d = PyQuery('<div><span class="red">toto</span> rocks</div>')
            >>> print(d('span'))
            <span class="red">toto</span> rocks
            >>> print(d('span').outer_html())
            <span class="red">toto</span>
            >>> print(d('span').outerHtml())
            <span class="red">toto</span>

            >>> S = PyQuery('<p>Only <b>me</b> & myself</p>')
            >>> print(S('b').outer_html())
            <b>me</b>

        ..
        Nr   r8   )r   r  )tailr   r   r   r   )r   r  e0s      r   
outer_htmlzPyQuery.outer_htmlj  sM    &  	4!W7 	"BBG~b3v>>>>r   c                      |t           u r& sdS d                     fd D                       S  D ]5}|                                D ]}|                    |           ||_        6 S )a  Get or set the text representation of sub nodes.

        Get the text value::

            >>> doc = PyQuery('<div><span>toto</span><span>tata</span></div>')
            >>> print(doc.text())
            tototata
            >>> doc = PyQuery('''<div><span>toto</span>
            ...               <span>tata</span></div>''')
            >>> print(doc.text())
            toto tata

        Get the text value, without squashing newlines::

            >>> doc = PyQuery('''<div><span>toto</span>
            ...               <span>tata</span></div>''')
            >>> print(doc.text(squash_space=False))
            toto
            tata

        Set the text value::

            >>> doc.text('Youhou !')
            [<div>]
            >>> print(doc)
            <div>Youhou !</div>

        r8   r   c              3      K   | ]C}|j         d k    r'                    |                                          nt          |fi V  DdS )r  N)r   r   rS   r	   )r'   r   rz   r   s     r   	<genexpr>zPyQuery.text.<locals>.<genexpr>  so        03 +.'Z*?*?

3$$&&&S++F++     r   )r}   r=   r(  r  r  )r   r   rz   r   r)  s   ` `  r   r  zPyQuery.text  s    < J r88     7;     
  	 	C** " "

5!!!!CHHr   c                    t          |t                    r"t          d|z   dz   | j                  d         }nZt          |t          j                  r|                     |          }n*t          |t                    r|}nt          d|z            t          |d          r"t          |j
        t                    r|j
        }nd}||fS )Nr  r  r   z0Value must be string, PyQuery or Element. Got %rr  r8   )r\   r   rP   rc   r   r   r   rG   r   rY   r  )r   r   r   	root_texts       r   	_get_rootzPyQuery._get_root  s    eZ(( 		Li%/*<"k+ ++,.DDu~.. 	L::e$$DDw'' 	LDDBUJL L L4   	Z	:%F%F 		IIIYr   c                 ~   |                      |          \  }}t          |           D ]\  }}t          |          dk    r'|d         }|j        sd|_        |xj        |z  c_        n|j        sd|_        |xj        |z  c_        |dk    rt          t          |                    }|                    |           | S )z#append value to each nodes
        r   r8   )r  r1  r   r  r  r   r;   r   )r   r   r   r  r2  r   
last_childs          r   r   zPyQuery.append  s     ..//ioo 	 	FAs3xx!|| W
! )&(JO9,x "!CHI%1uuT

++JJtr   c                 0    |                     |            | S )zappend nodes to value
        )r   r^  s     r   	append_tozPyQuery.append_to       	Tr   c                 t   |                      |          \  }}t          |           D ]\  }}|j        sd|_        t          |          dk    r|j        |d         _        ||_        n||j        z   |_        |dk    rt          t          |                    }||dd<   |dt          |                   }| S )zprepend value to nodes
        r8   r   r  N)r  r1  r  r   r  r   r;   )r   r   r   r  r2  r   s         r   prependzPyQuery.prepend  s     ..//ioo 	# 	#FAs8 4yy1}} #R$$sx/1uuT

++CGzD		z?DDr   c                 0    |                     |            | S )zprepend nodes to value
        )r  r^  s     r   
prepend_tozPyQuery.prepend_to  s     	dr   c                 t   |                      |          \  }}t          |           D ]\  }}|j        sd|_        |xj        |z  c_        |dk    rt          t	          |                    }|                                }|                    |          dz   }||||<   ||t          |                   }| S )zadd value after nodes
        r8   r   r   )r  r1  r  r   r;   r   r@  r   )r   r   r   r  r2  r   r   r@  s           r   afterzPyQuery.after  s     ..//ioo 		+ 		+FAs8 HH	!HH1uuT

++]]__FLL%%)E"&F5;%D		/*DDr   c                 0    |                     |            | S )z!insert nodes after value
        )r  r^  s     r   insert_afterzPyQuery.insert_after	  s     	Dr   c                     |                      |          \  }}t          |           D ]\  }}|                                }||j        sd|_        |xj        |z  c_        n2|                                }|j        sd|_        |xj        |z  c_        |dk    rt          t          |                    }|                                }|                    |          }||||<   ||t          |                   }| S )z"insert value before nodes
        Nr8   r   )
r  r1  r   r  r   r  r   r;   r@  r   )	r   r   r   r  r2  r   previousr   r@  s	            r   beforezPyQuery.before  s     ..//ioo 	+ 	+FAs((H#} '$&HM*{ %"$FKy(1uuT

++]]__FLL%%E"&F5;%D		/*DDr   c                 0    |                     |            | S )z"insert nodes before value
        )r  r^  s     r   insert_beforezPyQuery.insert_before'  r  r   c                 ~   t          |t                    sJ t          |          d         }g }| D ]}t          |          }|                                s#|                    t          |                     nHd |                                D             }|d         }|                    t          |                     |                    |           |                                }|G|                                D ]2}||u r,|                    |           |	                    |            n3|| dd<   | S )a  A string of HTML that will be created on the fly and wrapped around
        each target:

            >>> d = PyQuery('<span>youhou</span>')
            >>> d.wrap('<div></div>')
            [<div>]
            >>> print(d)
            <div><span>youhou</span></div>

        r   c                     g | ]}|S r    r    r'   r   s     r   r)   z PyQuery.wrap.<locals>.<listcomp>B  s    <<<!<<<r   r  N)
r\   r   rP   r   r(  r   iterchildrenr   addnextr  )	r   r   nodesr   wrapperchildsr)  r   ts	            r   wrapzPyQuery.wrap.  sF    %,,,,,5!!!$ 	 	CuooG&&(( ,x}}----<<W%9%9%;%;<<<r
Xc]]+++LL!!!]]__F!,,..  ACxx		'***a(((   QQQr   c                    | s| S t          |t                    sJ t          |          d         }t          |          }|                                s|}n&d |                                D             }|d         }d}| d                                         }|t          }| D ]<}|                    t          |                     |                                |urd}=|t          uro|rmd |                                D             }t          |          t          |           k    r/| D ]}|
                    |           |                    |           |g| dd<   | S )a  Wrap all the elements in the matched set into a single wrapper
        element::

            >>> d = PyQuery('<div><span>Hey</span><span>you !</span></div>')
            >>> print(d('span').wrap_all('<div id="wrapper"></div>'))
            <div id="wrapper"><span>Hey</span><span>you !</span></div>

            >>> d = PyQuery('<div><span>Hey</span><span>you !</span></div>')
            >>> print(d('span').wrapAll('<div id="wrapper"></div>'))
            <div id="wrapper"><span>Hey</span><span>you !</span></div>

        ..
        r   c                     g | ]}|S r    r    r  s     r   r)   z$PyQuery.wrap_all.<locals>.<listcomp>i  s    888Aa888r   r  TNFc                     g | ]}|S r    r    r  s     r   r)   z$PyQuery.wrap_all.<locals>.<listcomp>y  s    777Aa777r   )r\   r   rP   r   r(  r  r   r}   r   r   r  )r   r   r  r)  r  replace_childsr   r   s           r   wrap_allzPyQuery.wrap_allQ  s     	K%,,,,,5!!!$5//""$$ 	EE88!5!5!7!7888F2JEa""$$>F  	' 	'CLL#'''}}f,,!& ###77!4!4!6!6777F6{{c$ii'' ' 'CMM#&&&&g&&&)QQQr   c                 $   t          |t                    rt          |          }t          |d          r{t	          |           D ]j\  }}|                     |                               |||          |j        pdz              |                                }|	                    |           kn`| D ]]}|                     |                              ||j        pdz              |                                }|	                    |           ^| S )a$  replace nodes by value:

            >>> doc = PyQuery("<html><div /></html>")
            >>> node = PyQuery("<span />")
            >>> child = doc.find('div')
            >>> child.replace_with(node)
            [<div>]
            >>> print(doc)
            <html><span/></html>

        rN   r8   )
r\   rG   r   rY   r1  r   r  r  r   r  )r   r   r2  rC  r   r   s         r   replace_withzPyQuery.replace_with  s    eW%% 	JJE5*%% 
	#'oo ' '
7

7##**E!W%%);<> > > **,,g&&&&	'  # #

3&&uB'?@@@c""""r   c                     | j         t          u rt          d          |                      |                              |            | S )zreplace nodes by expr
        z6replaceAll can only be used with an object with parent)r   r}   ra   r  )r   exprs     r   replace_allzPyQuery.replace_all  sN     <:%%HJ J JT''---r   c                 4    t          d | D                       S )zreturn a copy of nodes
        c                 ,    g | ]}t          |          S r    r
   )r'   r   s     r   r)   z!PyQuery.clone.<locals>.<listcomp>  s    666#666r   )rG   r   s    r   clonezPyQuery.clone  s!     66666777r   c                 ,    | D ]}d|_         g |dd<   | S )zremove nodes content
        N)r  )r   r   s     r   emptyzPyQuery.empty  s.      	 	CCHCFFr   c                    |t           u r| D ]}|                                }|y|j        r]|                                }|$|j        sd|_        |xj        |j        z  c_        n#|j        sd|_        |xj        |j        z  c_        |                    |           n*|                     ||           }|                                 | S )a?  Remove nodes:

             >>> h = (
             ... '<div>Maybe <em>she</em> does <strong>NOT</strong> know</div>'
             ... )
             >>> d = PyQuery(h)
             >>> d('strong').remove()
             [<strong>]
             >>> print(d)
             <div>Maybe <em>she</em> does  know</div>
        Nr8   )r}   r   r  r   r  r  r   )r   r  r   r   r   r   s         r   r  zPyQuery.remove  s     : ' '%x 	2"00<#); 1.0"KK383KKK#'9 /,.	 II1IIMM#&&&' jjt,,GNNr   c                       e Zd ZdZd ZdS )
PyQuery.Fna  Hook for defining custom function (like the jQuery.fn):

        .. sourcecode:: python

         >>> fn = lambda: this.map(lambda i, el: PyQuery(this).outerHtml())
         >>> PyQuery.fn.listOuterHtml = fn
         >>> S = PyQuery(
         ...   '<ol>   <li>Coffee</li>   <li>Tea</li>   <li>Milk</li>   </ol>')
         >>> S('li').listOuterHtml()
         ['<li>Coffee</li>', '<li>Tea</li>', '<li>Milk</li>']

        c                 L    fd}||_         t          t          ||           d S )Nc                 (    | j         d<    |i |S )Nr0  )rB   )r   r0   rz   r/   s      r   fnz"PyQuery.Fn.__setattr__.<locals>.fn  s%    +/ (tT,V,,,r   )r   rE   rG   )r   r%   r/   r  s     ` r   r   zPyQuery.Fn.__setattr__  s=    - - - - - BKGT2&&&&&r   N)r   r   r   rD   r   r    r   r   Fnr    s-        	 		' 	' 	' 	' 	'r   r  c                 b    t          t          d |                                                     S )a  Serialize form elements as an array of dictionaries, whose structure
        mirrors that produced by the jQuery API. Notably, it does not handle
        the deprecated `keygen` form element.

            >>> d = PyQuery('<form><input name="order" value="spam"></form>')
            >>> d.serialize_array() == [{'name': 'order', 'value': 'spam'}]
            True
            >>> d.serializeArray() == [{'name': 'order', 'value': 'spam'}]
            True
        c                 $    | d         | d         dS )Nr   r   )r%   r   r    )r(   s    r   r  z)PyQuery.serialize_array.<locals>.<lambda>  s    qtad33 r   )r;   rF  serialize_pairsr   s    r   serialize_arrayzPyQuery.serialize_array  s7     C33  ""
 
   	r   c                 l    t          |                                                               dd          S )aJ  Serialize form elements as a URL-encoded string.

            >>> h = (
            ... '<form><input name="order" value="spam">'
            ... '<input name="order2" value="baked beans"></form>'
            ... )
            >>> d = PyQuery(h)
            >>> d.serialize()
            'order=spam&order2=baked%20beans'
        +z%20)r   r  r   r   s    r   	serializezPyQuery.serialize  s.     --//0088eDDDr   c           
        	
 g d}|                      g           	|                                 D ]}|d         j        dk    r|                    d          }|rR|                      |j                                                  }	                     |d|d|d                     |	                     |d                     |d         j        d	k    r	                     |d
                     ˉ	                    |           d}|d                    t          d |                    z  }		                    |          		fd}		                    |          	g }	D ]
|                      
          
                                pd}t          |t                    r'|                    t          
fd|                     g|                    
j        d         |                    dd          f           |S )aQ  Serialize form elements as an array of 2-tuples conventional for
        typical URL-parsing operations in Python.

            >>> d = PyQuery('<form><input name="order" value="spam"></form>')
            >>> d.serialize_pairs()
            [('order', 'spam')]
            >>> d.serializePairs()
            [('order', 'spam')]
        )submitbuttonimageresetfiler   formr   r   z :not([form]):input, [form="z"]:inputz:not([form]):inputfieldsetz:inputz[name]:enabled:not(button)r8   c                     d| z  S )Nz:not([type="%s"])r    )ss    r   r  z)PyQuery.serialize_pairs.<locals>.<lambda>3  s    )A- r   c                                          |          }|                    d           o|                    d           S )Nz:checkbox:not(:checked)z:radio:not(:checked))r   r  )r7   r   controlss     r   _filter_out_uncheckedz6PyQuery.serialize_pairs.<locals>._filter_out_unchecked7  sD    ##Bvv7888 3FF12223r   c                 J    j         d         |                     dd          fS )Nr%   r  
)rY  r   )rV  fields    r   r  z)PyQuery.serialize_pairs.<locals>.<lambda>L  s!    u|F3QYYtV5L5LM r   r%   r  r  )r   r   r   rT  r   r^   r   r=   rF  r4  r  r\   r;   r   rY  r   )r   _submitter_typesr   form_idr   r   r  retr  r  r  s            @@r   r  zPyQuery.serialize_pairs  sM    JII::b>>**,, 	$ 	$B!uyF""''$-- >::bgoo&7&788DOODDD"77GGG-%. %. / / / / OOBB';$<$<====Aj((8----####/BGGC--    	 ??8,,	3 	3 	3 	3 	3 ??#899  	N 	NE**U##''))/RC#t$$ N

3MMMM     
 

EL0#++dF2K2KLMMMM
r   c                     t                      }|                                 D ]S\  }}||vr|||<   t          ||         t                    s||         |g||<   8||                             |           T|S )aq  Serialize form elements as an ordered dictionary. Multiple values
        corresponding to the same input name are concatenated into one list.

            >>> d = PyQuery('''<form>
            ...             <input name="order" value="spam">
            ...             <input name="order" value="eggs">
            ...             <input name="order2" value="ham">
            ...             </form>''')
            >>> d.serialize_dict()
            OrderedDict({'order': ['spam', 'eggs'], 'order2': 'ham'})
            >>> d.serializeDict()
            OrderedDict({'order': ['spam', 'eggs'], 'order2': 'ham'})
        )r   r  r\   r;   r   )r   r  r%   r  s       r   serialize_dictzPyQuery.serialize_dictS  s     mm--// 	& 	&ID#3D		D	400 & Y,D		D	  %%%%
r   c                 V    | j         | j         S | j        t          ur| j        j        S dS )zJReturn the url of current html document or None if not available.
        N)r   r   r}   base_urlr   s    r   r  zPyQuery.base_urll  s4     >%>!<z))<(( *)r   c                      j         t          d           fd}  d                               |d                       d                               |d                       d                               |d                       d	                               |d                       d
                               |d                       d                               |d                      S )z!Make all links absolute.
        Nz]You need a base URL to make your linksabsolute. It can be provided by the base_url parameter.c                       fd}|S )Nc                     |                                         d S t          fddD                       rd S  |                               t                                                              S )Nc              3   B   K   | ]}                     |          V  d S rh   )r   )r'   schema
attr_values     r   r  zIPyQuery.make_links_absolute.<locals>.repl.<locals>.rep.<locals>.<genexpr>  sM       B B! ",,V44 B B B B B Br   )ztel:zcallto:zsms:)rT  anyr   rl  )r2  r   r	  rT  r  r   s     @r   repz6PyQuery.make_links_absolute.<locals>.repl.<locals>.rep  s    !T!WW\\$//
%4  B B B B%@B B B B B  4tAww||D$+Hj6F6F6H6H$I$IK K Kr   r    )rT  r  r  r   s   ` r   replz)PyQuery.make_links_absolute.<locals>.repl  s5    K K K K K K K Jr   ahreflinkscriptsrcimgiframer  action)r  ra   rD  )r   r  r  s   `` r   make_links_absolutezPyQuery.make_links_absoluteu  s/    }H NP P P	 	 	 	 	 	  	S		ttF||$$$V$$v,,'''XDDKK(((Ue%%%XDDKK(((V$$x..)))r   )r   rh   )FF)rS   )^r   r   r   rD   r   r   rt   r   r   rN   r;   r   _appendr   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r  r  r
  r  r5   r  r  r  r   r"  r%  r*  r,  r.  r4  r9  r  r>  rA  rD  rF  r   rJ  rL  rT  rR  ro   r}   r\  r`  rb  ri  rm  rt  r  r  r  r  rS   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r    r   r   rG   rG      s         )W& W& W&r? ? ? ?/ / /    kGkG. . .  0 0 0 0$  $  &	H 	H 	H) ) )

) 
) 
)' ' ' % % X% . . X.0 0 0 0*   L L L L
D D D D
5 5 5	 	 	6 6 6 	= 	= 	= 	= 
 
 
 
(: : : 	K 	K 	K 	K
P 
P 
P 
P
 
 
 
 5 5 5 5/ / / /*0 0 05 5 5@	' 	' 	'7 7 7$1 1 1(. . .*  . . .B   X    " " "H   $ ?;777D
 & * * * *
 % ) ) ) )
 & & &   $   .   (% % %N /s
-
-
-C
+ + +, , , # _ _ _ _B $ 9 9 9 9v ? ? ? ?4 $ * * * *`  "  &     $           .   ! ! !F . . .`   6   8 8 8
   %    @' ' ' ' 'V ' ' '& 
B    E E E" @ @ @D   0 ) ) X)! ! ! ! ! !r   rG   )NN)*cssselectpatchr   reprlibr   urllib.parser   r   openersr   r  r	   copyr   rS   r   r[   r   r_   r*   r  r?   sysversion_infocollectionsr   BaseOrderedDictr   bytesr   r1   r5   r8  r3   rK   rP   rj   r   rl   r}   ro   r;   rG   r    r   r   <module>r"     s`   - , , , , , " " " " " " " " " " " "                                                     



z!!''''''' ;:::::L L L L Lo L L L 5\
2 2 2   cee 
9 
9 
9* * * *Z3 3 3        Y[[
( ( ( ( (f ( ( (Bw w w w wd w w wt/   ! ! ! ! !r   