o
    i7B                     @   s   d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ ddlmZmZmZ dd	lmZ G d
d deZG dd dZG dd deZG dd deZG dd deZG dd deZdd Zdd ZdS )    )Iterable)wraps)import_module)getfullargspecunwrap)conditional_escape)lazy_annotations   )NodeTemplatetoken_kwargs)TemplateSyntaxErrorc                   @   s   e Zd ZdS )InvalidTemplateLibraryN)__name__
__module____qualname__ r   r   W/var/www/html/formularioweb/env/lib/python3.10/site-packages/django/template/library.pyr      s    r   c                   @   sZ   e Zd ZdZdd ZdddZdd Zdd	d
Zdd ZdddZ	dddZ
dddZdS )Librarya  
    A class for registering template tags and filters. Compiled filter and
    template tag functions are stored in the filters and tags attributes.
    The filter, simple_tag, and inclusion_tag methods provide a convenient
    way to register callables as tags.
    c                 C   s   i | _ i | _d S N)filterstags)selfr   r   r   __init__   s   
zLibrary.__init__Nc                    sx    d u r|d u rj S  d ur%|d u r%t r  S  fdd}|S  d ur4|d ur4|j < |S td |f )Nc                    s     | S r   )tagfuncnamer   r   r   dec'   s   zLibrary.tag.<locals>.decz.Unsupported arguments to Library.tag: (%r, %r))tag_functioncallabler   
ValueError)r   r   compile_functionr   r   r   r   r      s   

zLibrary.tagc                 C   s   || j |j< |S r   )r   r   )r   r   r   r   r   r    5   s   zLibrary.tag_functionc                    s   du r|du r fdd}|S dur0|du r0t r&jfi  S  fdd}|S dur]|dur]|j< dD ]}| v rW | }t||| tt||| q?|_|S td|f )z
        Register a callable as a template filter. Example:

        @register.filter
        def lower(value):
            return value.lower()
        Nc                    s   j | fi  S r   )filter_functionr   )flagsr   r   r   r   C   s   zLibrary.filter.<locals>.decc                    s   j | fi  S r   )filterr   r%   r   r   r   r   r   M   s   )expects_localtimeis_safeneeds_autoescapez1Unsupported arguments to Library.filter: (%r, %r))r!   r$   r   setattrr   _filter_namer"   )r   r   filter_funcr%   r   attrvaluer   r'   r   r&   9   s.   
zLibrary.filterc                 K   s   | j |j|fi |S r   )r&   r   )r   r   r%   r   r   r   r$   d   s   zLibrary.filter_functionc                    s4    fdd}|du r|S t |r||S td)z
        Register a callable as a compiled template tag. Example:

        @register.simple_tag
        def hello(*args, **kwargs):
            return 'world'
        c              
      s~   t   tt\ }W d    n1 sw   Y  p$jt 
f	dd}	| S )Nc                    sn   |  dd  }d }t|dkr |d dkr |d }|d d }t| | 
\}}t|||S )Nr	      as)split_contentslen
parse_bits
SimpleNode)parsertokenbits
target_varargskwargs)	defaultsr   function_namekwonlykwonly_defaultsparamstakes_contextvarargsvarkwr   r   compile_func}   s$   z5Library.simple_tag.<locals>.dec.<locals>.compile_funcr   r   r   r   r   r   r   _rF   r   r   rC   r>   r   r?   r@   rA   rB   rD   rE   r   r   p   s    
	

zLibrary.simple_tag.<locals>.decNz(Invalid arguments provided to simple_tagr!   r"   )r   r   rC   r   r   r   rJ   r   
simple_tagg   s   	%zLibrary.simple_tagc                    s6    fdd}|du r|S t |r||S td)z
        Register a callable as a compiled block template tag. Example:

        @register.simple_block_tag
        def hello(content):
            return 'world'
        c                    s   t   tt\ }W d    n1 sw   Y  	p$jd u r.d t f
dd}
| S )Nendc                    s     }rt|dkr|d dkr|d= ntd|r)|d dkr)|d= ntd d| dd  }d }t|dkrQ|d d	krQ|d
 }|d d }| f}|   t| ||	 
\}}t||||S )Nr0   r	   contentzv is decorated with takes_context=True so it must have a first argument of 'context' and a second argument of 'content'r   'z)' must have a first argument of 'content'r1   r2   r3   )copyr5   r   r4   parsedelete_first_tokenr6   SimpleBlockNode)r8   r9   
tag_paramsr:   r;   nodelistr<   r=   )
r>   end_namer   r?   r@   rA   rB   rC   rD   rE   r   r   rF      sD   
z;Library.simple_block_tag.<locals>.dec.<locals>.compile_funcrG   rH   rW   r   r   rC   rK   r   r      s$   
	


 -z%Library.simple_block_tag.<locals>.decNz.Invalid arguments provided to simple_block_tagrL   )r   r   rC   r   rW   r   r   rX   r   simple_block_tag   s   	BzLibrary.simple_block_tagc                    s    fdd}|S )z
        Register a callable as an inclusion tag:

        @register.inclusion_tag('results.html')
        def show_results(poll):
            choices = poll.choice_set.all()
            return {'choices': choices}
        c                    s   t   tt\ }W d    n1 sw   Y  	p$jt f
dd}
| S )Nc                    s>   |  dd  }t| |	 
\}}t||S )Nr	   )r4   r6   InclusionNode)r8   r9   r:   r<   r=   )
r>   filenamer   r?   r@   rA   rB   rC   rD   rE   r   r   rF   	  s(   z8Library.inclusion_tag.<locals>.dec.<locals>.compile_funcrG   rH   r[   r   r   rC   rK   r   r      s    
	

 z"Library.inclusion_tag.<locals>.decr   )r   r[   r   rC   r   r   r   r\   r   inclusion_tag   s   
'zLibrary.inclusion_tag)NN)NNN)NNNN)r   r   r   __doc__r   r   r    r&   r$   rM   rY   r]   r   r   r   r   r      s    

+

7Tr   c                   @   s    e Zd ZdZdd Zdd ZdS )TagHelperNodez
    Base class for tag helper nodes such as SimpleNode and InclusionNode.
    Manages the positional and keyword arguments to be passed to the decorated
    function.
    c                 C   s   || _ || _|| _|| _d S r   )r   rC   r<   r=   )r   r   rC   r<   r=   r   r   r   r   -  s   
zTagHelperNode.__init__c                    sD    fdd| j D }| jr g| } fdd| j D }||fS )Nc                    s   g | ]}|  qS r   resolve).0varcontextr   r   
<listcomp>4  s    z8TagHelperNode.get_resolved_arguments.<locals>.<listcomp>c                    s   i | ]
\}}||  qS r   r`   )rb   kvrd   r   r   
<dictcomp>7  s    z8TagHelperNode.get_resolved_arguments.<locals>.<dictcomp>)r<   rC   r=   itemsr   re   resolved_argsresolved_kwargsr   rd   r   get_resolved_arguments3  s
   
z$TagHelperNode.get_resolved_argumentsN)r   r   r   r^   r   rn   r   r   r   r   r_   &  s    r_   c                       s(   e Zd ZdZ fddZdd Z  ZS )r7   r   c                       t  |||| || _d S r   )superr   r;   )r   r   rC   r<   r=   r;   	__class__r   r   r   >     
zSimpleNode.__init__c                 C   sH   |  |\}}| j|i |}| jd ur||| j< dS |jr"t|}|S )N )rn   r   r;   
autoescaper   )r   re   rl   rm   outputr   r   r   renderB  s   

zSimpleNode.render)r   r   r   child_nodelistsr   rw   __classcell__r   r   rq   r   r7   ;  s    r7   c                       s(   e Zd Z fddZ fddZ  ZS )rT   c                    s   t  j|i | || _d S r   )rp   r   rV   )r   rV   r<   r=   rq   r   r   r   N  rs   zSimpleBlockNode.__init__c                    s6   t  |\}}|| jrdnd| j| ||fS )Nr	   r   )rp   rn   insertrC   rV   rw   rk   rq   r   r   rn   R  s
   z&SimpleBlockNode.get_resolved_arguments)r   r   r   r   rn   ry   r   r   rq   r   rT   M  s    rT   c                       s$   e Zd Z fddZdd Z  ZS )rZ   c                    ro   r   )rp   r   r[   )r   r   rC   r<   r=   r[   rq   r   r   r   _  rs   zInclusionNode.__init__c                 C   s   |  |\}}| j|i |}|j| }|du rTt| jtr#| j}n,tt| jddtr2| jj}nt| jt	sGt| jt
rG|jj| j}n|jj| j}||j| < ||}|d}|durf||d< ||S )z
        Render the specified template and context. Cache the template object
        in render_context to avoid reparsing and loading when used in a for
        loop.
        Ntemplate
csrf_token)rn   r   render_contextget
isinstancer[   r   getattrr{   strr   engineselect_templateget_templatenewrw   )r   re   rl   rm   _dicttnew_contextr|   r   r   r   rw   c  s&   




zInclusionNode.render)r   r   r   r   rw   ry   r   r   rq   r   rZ   ^  s    rZ   c
              	      s  |r|r|d dkr|dd }nt d|	 g }
i }t|} fdd|D }|D ]t}t|g| }|rt| \}}||vrN||vrN|du rNt d|	|f ||v rZt d	|	|f ||t|< ||v rj|| q*||v rs|| q*|r|t d
|	 |
| | z|d W q* t	y   |du rt d|	 Y q*w |dur|dt
|  }|s|rt d|	ddd || D f |
|fS )z
    Parse bits for template tag helpers simple_tag and inclusion_tag, in
    particular by detecting syntax errors and by extracting positional and
    keyword arguments.
    r   re   r	   NzW'%s' is decorated with takes_context=True so it must have a first argument of 'context'c                    s   g | ]
} r
| vr|qS r   r   )rb   kwargrA   r   r   rf     s    zparse_bits.<locals>.<listcomp>z.'%s' received unexpected keyword argument '%s'z7'%s' received multiple values for keyword argument '%s'zH'%s' received some positional argument(s) after some keyword argument(s)z+'%s' received too many positional argumentsz5'%s' did not receive value(s) for the argument(s): %sz, c                 s   s    | ]}d | V  qdS )z'%s'Nr   )rb   pr   r   r   	<genexpr>  s    zparse_bits.<locals>.<genexpr>)r   listr   popitemr   removeappendcompile_filterpop
IndexErrorr5   join)r8   r:   rB   rD   rE   r>   r@   rA   rC   r   r<   r=   unhandled_paramsunhandled_kwargsbitr   paramr/   r   r   r   r6     sv   


r6   c              
   C   sZ   zt | }W n ty } ztd| |f d}~ww z|jW S  ty,   td|  w )z;
    Load a Library object from a template tag module.
    zSInvalid template library specified. ImportError raised when trying to load '%s': %sNz4Module  %s does not have a variable named 'register')r   ImportErrorr   registerAttributeError)r   moduleer   r   r   import_library  s"   r   N)collections.abcr   	functoolsr   	importlibr   inspectr   r   django.utils.htmlr   django.utils.inspectr   baser
   r   r   
exceptionsr   	Exceptionr   r   r_   r7   rT   rZ   r6   r   r   r   r   r   <module>   s$      %X