
    DfR                     F   d Z ddlZddlZddlmZmZ ddlmZ d;dZ G d de	          Z
 G d	 d
e	          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$e          Z G d% d&e          Z G d' d(e          Z G d) d*e          Z G d+ d,e          Z G d- d.e          Z G d/ d0e          Z G d1 d2e          Z  G d3 d4e          Z! G d5 d6          Z" e"d7e#          Z$ G d8 d9e"          Z%e&d:k    rddl'Z' e'j(                     dS dS )<z
HTML forms
(part of web.py)
    N   )netutils)webapic                     	 t          | d          r|| v r| |         S n# t          $ r Y nw xY wt          | d          r|| v r| |         S t          | |          rt          | |          S |S )Nhas_keykeys)hasattr	TypeErrorgetattr)objattrvalues      7/var/www/media/lib/python3.11/site-packages/web/form.pyattrgetr      s    3	"" 	ts{{t9    	
 	V"!%4y	d		 "sD!!!Ls    
,,c                   x    e Zd ZdZd ZddZd Zd Zd Zdd	Z	d
 Z
ddZd Zd ZddZd Z ee          ZdS )Forma  
    HTML form.

        >>> f = Form(Textbox("x"))
        >>> f.render()
        u'<table>\n    <tr><th><label for="x">x</label></th><td><input id="x" name="x" type="text"/></td></tr>\n</table>'
        >>> f.fill(x="42")
        True
        >>> f.render()
        u'<table>\n    <tr><th><label for="x">x</label></th><td><input id="x" name="x" type="text" value="42"/></td></tr>\n</table>'
    c                 f    || _         d| _        d | _        |                    dg           | _        d S )NT
validators)inputsvalidnotepopr   )selfr   kws      r   __init__zForm.__init__+   s0    
	&&r22    Nc                 \    t          j        |           }|r|                    |           |S N)copydeepcopy	validates)r   xos      r   __call__zForm.__call__1   s-    M$ 	KKNNNr   c           	         d}||                      | j                  z  }|dz  }| j        D ]}t          j        |j                  |                                z   |                      |j                  z   t          j        |j                  z   }|                                r	|d|z  z  }|dt          j
        |j                  dt          j
        |j                  d|dz  }|dz  }|S )	N z<table>
z9    <tr style="display: none;"><th></th><td>%s</td></tr>
z    <tr><th><label for="">z</label></th><td>z</td></tr>
z</table>)
rendernoter   r   r   safeunicodeprerenderpost	is_hiddenr   websafeiddescription)r   outihtmls       r   r,   zForm.render7   s   tty))){ 	 	A!!%((((**//!&))* #AF++,  {{}} S  {14((((#+am*D*D*D*DdddL 	z
r   c           	         g }|                     |                     | j                             | j        D ]}|                                sJ|                     dt          j        |j                  dt          j        |j                  d           |                     |j	                   |                     |
                                           |                     |                     |j                             |                     |j                   |                     d           d                    |          S )Nz<label for="r(   z</label>
r'   )appendr)   r   r   r.   r   r/   r0   r1   r+   r,   r-   join)r   r2   r3   s      r   
render_csszForm.render_cssO   s   

4??49--... 
	 
	A;;== 


{14((((#+am*D*D*D*DF   JJquJJqxxzz"""JJtqv..///JJqvJJtwws||r   c                 8    |rdt          j        |          z  S dS Nz!<strong class="wrong">%s</strong>r'   r   r/   r   r   s     r   r)   zForm.rendernote_   $     	6T9J9JJJ2r   Tc                    |p|pt          j                    }d}| j        D ]F}t          ||j                  }|r|                    |          o|}1|                    |           G|r|o|                     |          }|| _        |S NT)	webinputr   r   namevalidate	set_value	_validater   )r   sourcerF   r   r2   r3   vs          r   r"   zForm.validatese   s    ,2, 	 	A''A jjmm+A 	0$..00CDJ
r   c                 p    || _         | j        D ]&}|                    |          s|j        | _         dS 'dS NFT)r   r   r   msgr   r   r   rH   s      r   rF   zForm._validates   sH    
 	 	A775>> E	uu tr   c                 "     | j         |fddi|S )NrF   F)r"   )r   rG   r   s      r   fillz	Form.fill{   s!    t~f<<<<<<r   c                 R    | j         D ]}|j        |k    r|c S t          |          r   )r   rC   KeyError)r   r3   r#   s      r   __getitem__zForm.__getitem__~   s8     	 	Av{{ qkkr   c                     | j                             d          pg }|D ]}|j        |k    r|c S t          |          )Nr   )__dict__getrC   AttributeError)r   rC   r   r#   s       r   __getattr__zForm.__getattr__   sR    ""8,,2 	 	Av~~ T"""r   c                 8    	 | |         S # t           $ r |cY S w xY wr   )rP   )r   r3   defaults      r   rT   zForm.get   s4    	7N 	 	 	NNN	s   
 c                 H    t          j        d | j        D                       S )Nc                 D    g | ]}|j         |                                fS  )rC   	get_value).0r3   s     r   
<listcomp>zForm._get_d.<locals>.<listcomp>   s'    KKK!qvq{{}}5KKKr   )r   storager   r   s    r   _get_dzForm._get_d   s#    }KKt{KKKLLLr   r   r@   )__name__
__module____qualname____doc__r   r%   r,   r9   r)   r"   rF   rN   rQ   rV   rT   ra   propertydr[   r   r   r   r      s        
 
3 3 3     0          = = = =  # # #   M M M 	AAAr   r   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )Inputa  Generic input. Type attribute must be specified when called directly.

    See also: <https://www.w3.org/TR/html52/sec-forms.html#the-input-element>

    Currently only types which can be written inside one `<input />` tag are
    supported.

    - For checkbox, please use `Checkbox` class for better control.
    - For radiobox, please use `Radio` class for better control.

        >>> Input(name='foo', type='email', value="user@domain.com").render()
        u'<input id="foo" name="foo" type="email" value="user@domain.com"/>'
        >>> Input(name='foo', type='number', value="bar").render()
        u'<input id="foo" name="foo" type="number" value="bar"/>'
        >>> Input(name='num', type="number", min='0', max='10', step='2', value='5').render()
        u'<input id="num" max="10" min="0" name="num" step="2" type="number" value="5"/>'
        >>> Input(name='foo', type="tel", value='55512345').render()
        u'<input id="foo" name="foo" type="tel" value="55512345"/>'
        >>> Input(name='search', type="search", value='Search').render()
        u'<input id="search" name="search" type="search" value="Search"/>'
        >>> Input(name='search', type="search", value='Search', required='required', pattern='[a-z0-9]{2,30}', placeholder='Search...').render()
        u'<input id="search" name="search" pattern="[a-z0-9]{2,30}" placeholder="Search..." required="required" type="search" value="Search"/>'
        >>> Input(name='url', type="url", value='url').render()
        u'<input id="url" name="url" type="url" value="url"/>'
        >>> Input(name='range', type="range", min='0', max='10', step='2', value='5').render()
        u'<input id="range" max="10" min="0" name="range" step="2" type="range" value="5"/>'
        >>> Input(name='color', type="color").render()
        u'<input id="color" name="color" type="color"/>'
        >>> Input(name='f', type="file", accept=".doc,.docx,.xml").render()
        u'<input accept=".doc,.docx,.xml" id="f" name="f" type="file"/>'
    c                    || _         || _        t          |          x| _        }|                    dd           | _        |                    d|          | _        |                    dd           | _        |                    dd          | _        |                    dd          | _	        d | _
        |                    d|                                           | _        d|v r|d         |d	<   |d= d S d S )
Ntyper1   r   r+   r'   r-   r0   class_class)rC   r   AttributeListattrsr   rk   r1   r   r+   r-   r   
setdefaultget_default_idr0   r   rC   r   ro   s       r   r   zInput.__init__   s    	$*5111
UIIfd++	 99]D99YYw--
99UB''IIfb))		""4)<)<)>)>??u"8_E'Nh r   c                     dS NFr[   r`   s    r   r.   zInput.is_hidden       ur   c                 <    | j         | j         S t          d          )Nzmissing attribute 'type')rk   rU   r`   s    r   get_typezInput.get_type   s!    9 9 !;<<<r   c                     | j         S r   )rC   r`   s    r   rq   zInput.get_default_id   s
    yr   c                     |                      |           | j        D ]&}|                    |          s|j        | _         dS 'dS rJ   )rE   r   r   rK   r   rL   s      r   rD   zInput.validate   sS    u 	 	A775>> E	uu tr   c                     || _         d S r   r   r   r   s     r   rE   zInput.set_value   s    


r   c                     | j         S r   r{   r`   s    r   r\   zInput.get_value   s
    zr   c                     | j                                         }|                                 |d<   | j        
| j        |d<   | j        |d<   | j        |d<   d|z  S )Nrk   r   rC   r0   <input %s/>)ro   r    rw   r   rC   r0   r   ro   s     r   r,   zInput.render   sX    
!!f:!!ZE'N	fgdu$$r   c                 8    |rdt          j        |          z  S dS r;   r<   r=   s     r   r)   zInput.rendernote   r>   r   c                 0    dt          | j                  z   S )N )strro   r`   s    r   addattszInput.addatts   s    S__$$r   N)rb   rc   rd   re   r   r.   rw   rq   rD   rE   r\   r,   r)   r   r[   r   r   ri   ri      s         @     $  = = =        % % %  % % % % %r   ri   c                   $    e Zd ZdZd Zd Zd ZdS )rn   zList of attributes of input.

    >>> a = AttributeList(type='text', name='x', value=20)
    >>> a
    <attrs: 'name="x" type="text" value="20"'>
    c                      t          |           S r   )rn   r`   s    r   r    zAttributeList.copy  s    T"""r   c                 ~    d                     d t          |                                           D                       S )Nr   c                 H    g | ]\  }}|d t          j        |          d S )z=""r<   )r]   krH   s      r   r^   z)AttributeList.__str__.<locals>.<listcomp>  s1    NNNA!!!S[^^^^,NNNr   )r8   sorteditemsr`   s    r   __str__zAttributeList.__str__  s9    xxNN

9M9MNNN
 
 	
r   c                 @    dt          t          |                     z  S )Nz<attrs: %s>)reprr   r`   s    r   __repr__zAttributeList.__repr__
  s    tCII..r   N)rb   rc   rd   re   r    r   r   r[   r   r   rn   rn      sK         # # #
 
 

/ / / / /r   rn   c                       e Zd ZdZd ZdS )TextboxzTextbox input.

    >>> Textbox(name='foo', value='bar').render()
    u'<input id="foo" name="foo" type="text" value="bar"/>'
    >>> Textbox(name='foo', value=0).render()
    u'<input id="foo" name="foo" type="text" value="0"/>'
    c                     dS )Ntextr[   r`   s    r   rw   zTextbox.get_type      vr   Nrb   rc   rd   re   rw   r[   r   r   r   r     s-             r   r   c                       e Zd ZdZd ZdS )PasswordzPassword input.

    >>> Password(name='password', value='secret').render()
    u'<input id="password" name="password" type="password" value="secret"/>'
    c                     dS )Npasswordr[   r`   s    r   rw   zPassword.get_type"  s    zr   Nr   r[   r   r   r   r     s-             r   r   c                       e Zd ZdZd ZdS )Textareaz|Textarea input.

    >>> Textarea(name='foo', value='bar').render()
    u'<textarea id="foo" name="foo">bar</textarea>'
    c                     | j                                         }| j        |d<   t          j        | j        pd          }d|d|dS )NrC   r'   z
<textarea >z</textarea>)ro   r    rC   r   r/   r   )r   ro   r   s      r   r,   zTextarea.render-  sI    
!!	fDJ,"--/4uueee<<r   N)rb   rc   rd   re   r,   r[   r   r   r   r   &  s-         = = = = =r   r   c                   0     e Zd ZdZ fdZd ZddZ xZS )Dropdowna  Dropdown/select input.

    >>> Dropdown(name='foo', args=['a', 'b', 'c'], value='b').render()
    u'<select id="foo" name="foo">\n  <option value="a">a</option>\n  <option selected="selected" value="b">b</option>\n  <option value="c">c</option>\n</select>\n'
    >>> Dropdown(name='foo', args=[('a', 'aa'), ('b', 'bb'), ('c', 'cc')], value='b').render()
    u'<select id="foo" name="foo">\n  <option value="a">aa</option>\n  <option selected="selected" value="b">bb</option>\n  <option value="c">cc</option>\n</select>\n'
    c                 ^    || _          t          t          |           j        |g|R i | d S r   argssuperr   r   r   rC   r   r   ro   	__class__s        r   r   zDropdown.__init__=  =    	&h&tBjBBBEBBBBBr   c                     | j                                         }| j        |d<   d|z  }| j        D ]}||                     |          z  }|dz  }|S )NrC   <select %s>

</select>
)ro   r    rC   r   _render_option)r   ro   r#   args       r   r,   zDropdown.renderA  sb    
!!	fe#9 	* 	*C$$S)))AA	]r     c           	         t          |t          t          f          r|\  }}n||}}t          j        |          }t          | j        t          t          f          rd | j        D             }nt          j        | j                  }||k    st          |t                    r||v rd}nd}|d|dt          j        |          dt          j        |          dz   S )Nc                 6    g | ]}t          j        |          S r[   )r   safestr)r]   r#   s     r   r^   z+Dropdown._render_option.<locals>.<listcomp>U  s"    <<<Au}Q''<<<r   z selected="selected"r'   <option value="r(   z
</option>
)
isinstancetuplelistr   r   r   r   r/   )r   r   indentr   descs_valueselect_ps          r   r   zDropdown._render_optionM  s    cE4=)) 	#KE44s4Ee$$dj5$-00 	0<<<<<GGmDJ//Ge
7D 9 9ew>N>N-HHHvHHKK
 
 	
r   )r   )rb   rc   rd   re   r   r,   r   __classcell__r   s   @r   r   r   4  sj         C C C C C
 
 

 
 
 
 
 
 
 
r   r   c                   (     e Zd ZdZ fdZd Z xZS )GroupedDropdowna  Grouped Dropdown/select input.

    >>> GroupedDropdown(name='car_type', args=(('Swedish Cars', ('Volvo', 'Saab')), ('German Cars', ('Mercedes', 'Audi'))), value='Audi').render()
    u'<select id="car_type" name="car_type">\n  <optgroup label="Swedish Cars">\n    <option value="Volvo">Volvo</option>\n    <option value="Saab">Saab</option>\n  </optgroup>\n  <optgroup label="German Cars">\n    <option value="Mercedes">Mercedes</option>\n    <option selected="selected" value="Audi">Audi</option>\n  </optgroup>\n</select>\n'
    >>> GroupedDropdown(name='car_type', args=(('Swedish Cars', (('v', 'Volvo'), ('s', 'Saab'))), ('German Cars', (('m', 'Mercedes'), ('a', 'Audi')))), value='a').render()
    u'<select id="car_type" name="car_type">\n  <optgroup label="Swedish Cars">\n    <option value="v">Volvo</option>\n    <option value="s">Saab</option>\n  </optgroup>\n  <optgroup label="German Cars">\n    <option value="m">Mercedes</option>\n    <option selected="selected" value="a">Audi</option>\n  </optgroup>\n</select>\n'

    c                 ^    || _          t          t          |           j        |g|R i | d S r   r   r   s        r   r   zGroupedDropdown.__init__n  r   r   c                     | j                                         }| j        |d<   d|z  }| j        D ]C\  }}|dt	          j        |          z  z  }|D ]}||                     |d          z  }|dz  }D|dz  }|S )NrC   r   z  <optgroup label="%s">
z    )r   z  </optgroup>
r   )ro   r    rC   r   r   r/   r   )r   ro   r#   labeloptionsr   s         r   r,   zGroupedDropdown.renderr  s    
!!	fe#"i 	# 	#NE7,s{5/A/AAAA = =T((V(<<<""AA	]r   rb   rc   rd   re   r   r,   r   r   s   @r   r   r   d  sV         C C C C C      r   r   c                   $     e Zd Z fdZd Z xZS )Radioc                 ^    || _          t          t          |           j        |g|R i | d S r   )r   r   r   r   r   s        r   r   zRadio.__init__  s=    	#eT#D?:????????r   c                    d}t          | j        d          D ]\  }}t          |t          t          f          r|\  }}n||}}| j                                        }| j        |d<   d|d<   ||d<   | j        t          |          z   |d<   | j	        |k    rd	|d	<   |d
|dt          j        |          z  }|dz  }|S )Nz<span>r   )startrC   radiork   r   r0   checkedz<input z/> z</span>)	enumerater   r   r   r   ro   r    rC   r   r   r   r/   )r   r#   idxr   r   r   ro   s          r   r,   zRadio.render  s    !$)1555 	? 	?HC#t}-- '!tt!3tJOO%%E IE&M#E&M"E'N)c#hh.E$KzU""#,i AUUUCK,=,=,=>>AA	Yr   )rb   rc   rd   r   r,   r   r   s   @r   r   r     sL        @ @ @ @ @      r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )Checkboxa  Checkbox input.

    >>> Checkbox('foo', value='bar', checked=True).render()
    u'<input checked="checked" id="foo_bar" name="foo" type="checkbox" value="bar"/>'
    >>> Checkbox('foo', value='bar').render()
    u'<input id="foo_bar" name="foo" type="checkbox" value="bar"/>'
    >>> c = Checkbox('foo', value='bar')
    >>> c.validate('on')
    True
    >>> c.render()
    u'<input checked="checked" id="foo_bar" name="foo" type="checkbox" value="bar"/>'
    c                 h    |                     dd          | _        t          j        | |g|R i | d S )Nr   F)r   r   ri   r   rr   s       r   r   zCheckbox.__init__  s?    yyE22tT8J888%88888r   c                 z    t          j        | j        pd          }| j        dz   |                    dd          z   S )Nr'   _r   )r   r   r   rC   replacer|   s     r   rq   zCheckbox.get_default_id  s7    dj.B//y3sC!8!888r   c                     | j                                         }d|d<   | j        |d<   | j        |d<   | j        rd|d<   d|z  S )Ncheckboxrk   rC   r   r   r   )ro   r    rC   r   r   r   s     r   r,   zCheckbox.render  sQ    
!!"f	fg< 	)(E)u$$r   c                 .    t          |          | _        d S r   )boolr   r|   s     r   rE   zCheckbox.set_value  s    E{{r   c                     | j         S r   )r   r`   s    r   r\   zCheckbox.get_value  s
    |r   N)	rb   rc   rd   re   r   rq   r,   rE   r\   r[   r   r   r   r     si         9 9 99 9 9% % %# # #    r   r   c                   (     e Zd ZdZ fdZd Z xZS )Buttona  HTML Button.

    >>> Button("save").render()
    u'<button id="save" name="save">save</button>'
    >>> Button("action", value="save", html="<b>Save Changes</b>").render()
    u'<button id="action" name="action" value="save"><b>Save Changes</b></button>'
    c                 ^     t          t          |           j        |g|R i | d| _        d S )Nr'   )r   r   r   r1   )r   rC   r   ro   r   s       r   r   zButton.__init__  s>    $fd$T@J@@@%@@@r   c                     | j                                         }| j        |d<   | j        
| j        |d<   |                    dd           pt          j        | j                  }d|d|dS )NrC   r   r4   z<button r   z	</button>)ro   r    rC   r   r   r   r/   )r   ro   r4   s      r   r,   zButton.render  sj    
!!	f:!!ZE'Nyy&&@#+di*@*@+055$$$77r   r   r   s   @r   r   r     sQ             8 8 8 8 8 8 8r   r   c                       e Zd ZdZd Zd ZdS )HiddenzHidden Input.

    >>> Hidden(name='foo', value='bar').render()
    u'<input id="foo" name="foo" type="hidden" value="bar"/>'
    c                     dS r@   r[   r`   s    r   r.   zHidden.is_hidden  s    tr   c                     dS )Nhiddenr[   r`   s    r   rw   zHidden.get_type      xr   N)rb   rc   rd   re   r.   rw   r[   r   r   r   r     s<               r   r   c                       e Zd ZdZd ZdS )FilezFile input.

    >>> File(name='f', accept=".doc,.docx,.xml").render()
    u'<input accept=".doc,.docx,.xml" id="f" name="f" type="file"/>'
    c                     dS )Nfiler[   r`   s    r   rw   zFile.get_type  r   r   Nr   r[   r   r   r   r     s-             r   r   c                       e Zd ZdZd ZdS )	TelephonezTelephone input.

    See: <https://html.spec.whatwg.org/#telephone-state-(type=tel)>

    >>> Telephone(name='tel', value='55512345').render()
    u'<input id="tel" name="tel" type="tel" value="55512345"/>'
    c                     dS )Ntelr[   r`   s    r   rw   zTelephone.get_type  ru   r   Nr   r[   r   r   r   r     -             r   r   c                       e Zd ZdZd ZdS )EmailzEmail input.

    See: <https://html.spec.whatwg.org/#e-mail-state-(type=email)>

    >>> Email(name='email', value='me@example.org').render()
    u'<input id="email" name="email" type="email" value="me@example.org"/>'

    c                     dS )Nemailr[   r`   s    r   rw   zEmail.get_type      wr   Nr   r[   r   r   r   r     s-             r   r   c                       e Zd ZdZd ZdS )Datea  Date input.

    Note: Not supported by desktop Safari, Internet Explorer, or Opera Mini

    See: <https://html.spec.whatwg.org/#date-state-(type=date)>

    >>> Date(name='date', value='2020-04-01').render()
    u'<input id="date" name="date" type="date" value="2020-04-01"/>'

    c                     dS )Ndater[   r`   s    r   rw   zDate.get_type  r   r   Nr   r[   r   r   r   r     -        	 	    r   r   c                       e Zd ZdZd ZdS )Timea  Time input.

    Note: Not supported by desktop Safari, Internet Explorer, or Opera Mini

    See: <https://html.spec.whatwg.org/#time-state-(type=time)>

    >>> Time(name='time', value='07:00').render()
    u'<input id="time" name="time" type="time" value="07:00"/>'

    c                     dS )Ntimer[   r`   s    r   rw   zTime.get_type'  r   r   Nr   r[   r   r   r   r     r   r   r   c                       e Zd ZdZd ZdS )Searcha  Search input.

    See: <https://html.spec.whatwg.org/#text-(type=text)-state-and-search-state-(type=search)>

    >> Search(name='search', value='Search').render()
    u'<input id="search" name="search" type="search" value="Search"/>'
    >>> Search(name='search', value='Search', required='required', pattern='[a-z0-9]{2,30}', placeholder='Search...').render()
    u'<input id="search" name="search" pattern="[a-z0-9]{2,30}" placeholder="Search..." required="required" type="search" value="Search"/>'

    c                     dS )Nsearchr[   r`   s    r   rw   zSearch.get_type7  r   r   Nr   r[   r   r   r   r   +  s-        	 	    r   r   c                       e Zd ZdZd ZdS )UrlzURL input.

    See: <https://html.spec.whatwg.org/#url-state-(type=url)>

    >>> Url(name='url', value='url').render()
    u'<input id="url" name="url" type="url" value="url"/>'
    c                     dS )Nurlr[   r`   s    r   rw   zUrl.get_typeD  ru   r   Nr   r[   r   r   r   r   ;  r   r   r   c                       e Zd ZdZd ZdS )NumberzNumber input.

    See: <https://html.spec.whatwg.org/#number-state-(type=number)>

    >>> Number(name='num', min='0', max='10', step='2', value='5').render()
    u'<input id="num" max="10" min="0" name="num" step="2" type="number" value="5"/>'
    c                     dS )Nnumberr[   r`   s    r   rw   zNumber.get_typeQ  r   r   Nr   r[   r   r   r  r  H  s-             r   r  c                       e Zd ZdZd ZdS )RangezRange input.

    See: <https://html.spec.whatwg.org/#range-state-(type=range)>

    >>> Range(name='range', min='0', max='10', step='2', value='5').render()
    u'<input id="range" max="10" min="0" name="range" step="2" type="range" value="5"/>'
    c                     dS )Nranger[   r`   s    r   rw   zRange.get_type^  r   r   Nr   r[   r   r   r  r  U  s-             r   r  c                       e Zd ZdZd ZdS )Colora  Color input.

    Note: Not supported by Internet Explorer or Opera Mini

    See: <https://html.spec.whatwg.org/#color-stat://html.spec.whatwg.org/#color-state-(type=color)>

    >>> Color(name='color').render()
    u'<input id="color" name="color" type="color"/>'
    c                     dS )Ncolorr[   r`   s    r   rw   zColor.get_typem  r   r   Nr   r[   r   r   r
  r
  b  s-             r   r
  c                   (     e Zd ZdZ fdZd Z xZS )DatalistaP  Datalist input.

    This is currently supported by Chrome, Firefox, Edge, and Opera. It is not
    supported on Safari or Internet Explorer. Use it with caution.

    Datalist cannot be used separately. It must be bound to an input.

    <https://html.spec.whatwg.org/#the-datalist-element>

    >>> Datalist(name='list', args=[('a', 'b'), ('c', 'd')]).render()
    u'<datalist id="list" name="list"><option label="a" value="b"/><option label="c" value="d"/></datalist>'
    >>> Datalist(name='list', args=[['a', 'b'], ['c', 'd']]).render()
    u'<datalist id="list" name="list"><option label="a" value="b"/><option label="c" value="d"/></datalist>'
    >>> Datalist(name='list', args=['a', 'b', 'c', 'd']).render()
    u'<datalist id="list" name="list"><option value="a"/><option value="b"/><option value="c"/><option value="d"/></datalist>'
    c                 ^    || _          t          t          |           j        |g|R i | d S r   )r   r   r  r   )r   rC   r   r   kwargsr   s        r   r   zDatalist.__init__  s=    	&h&tCjCCCFCCCCCr   c                 `   | j                                         }| j        |d<   d}d|z  }| j        D ]v}t	          |t
          t          f          r8dt          j        |d                   z  }t          j        |d                   }nt          j        |          }|d|d|d	z  }w|d
z  }|S )NrC   r'   z<datalist %s>z label="%s"r   r   r   r   z"/>z</datalist>)	ro   r    rC   r   r   r   r   r   r/   )r   ro   label_pr#   r   r   s         r   r,   zDatalist.render  s    
!!	fe#9 	= 	=C#t}-- )'#+c!f*=*==CF++C((AWWWeee<<AA	]r   r   r   s   @r   r  r  q  sV         "D D D D D      r   r  c                   "    e Zd Zd ZddZd ZdS )	Validatorc                 *    t          j         |           S r   )r    )r   memos     r   __deepcopy__zValidator.__deepcopy__  s    yr   Nc                 H    t          j        | t                                 d S r   )r   
autoassignlocals)r   rK   testjstests       r   r   zValidator.__init__  s    vxx(((((r   c                 >    	 |                      |          S #  Y dS xY wrt   )r  r|   s     r   r   zValidator.valid  s)    	99U###	55s    r   )rb   rc   rd   r  r   r   r[   r   r   r  r    sF          ) ) ) )    r   r  Requiredc                       e Zd Zd Zd ZdS )regexpc                 F    t          j        |          | _        || _        d S r   )recompilerexprK   )r   r$  rK   s      r   r   zregexp.__init__  s    Jt$$	r   c                 P    t          | j                            |                    S r   )r   r$  matchr|   s     r   r   zregexp.valid  s    DIOOE**+++r   N)rb   rc   rd   r   r   r[   r   r   r   r     s2          , , , , ,r   r   __main__r   ))re   r    r"  r'   r   r   r   rA   r   objectr   ri   dictrn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r   notnullr   rb   doctesttestmodr[   r   r   <module>r-     s   
  				                 "w w w w w6 w w wt_% _% _% _% _%F _% _% _%D/ / / / /D / / /(
 
 
 
 
e 
 
 
    u   = = = = =u = = =-
 -
 -
 -
 -
u -
 -
 -
`    h   <    E   0$ $ $ $ $u $ $ $N8 8 8 8 8U 8 8 8,    U       5   
 
 
 
 
 
 
 
    E       5        5        U    
 
 
 
 
% 
 
 

 
 
 
 
U 
 
 

 
 
 
 
E 
 
 
    E   # # # # #u # # #L        )J
%
%, , , , ,Y , , , zNNNGO r   