a
    ÛEb5  ã                   @   s¾   d dl 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dd„ Zdd„ ZdS )é    N)Úimport_module)ÚgetfullargspecÚunwrap)Úconditional_escape)Úis_iterableé   )ÚNodeÚTemplateÚtoken_kwargs)ÚTemplateSyntaxErrorc                   @   s   e Zd ZdS )ÚInvalidTemplateLibraryN)Ú__name__Ú
__module__Ú__qualname__© r   r   úW/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/django/template/library.pyr      s   r   c                   @   sP   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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                    s~   ˆ d u r|d u rˆj S ˆ d urL|d u rLtˆ ƒr8ˆ  ˆ ¡S ‡ ‡fdd„}|S n.ˆ d urj|d urj|ˆjˆ < |S tdˆ |f ƒ‚d S )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   Zcompile_functionr   r   r   r   r      s    

ÿÿzLibrary.tagc                 C   s   || j t|d|ƒj< |S ©NÚ_decorated_function)r   Úgetattrr   )r   r   r   r   r   r   4   s    zLibrary.tag_functionc                    sØ   ˆdu r"|du r"‡ ‡fdd„}|S ˆdurb|du rbt ˆƒrLˆjˆfi ˆ ¤ŽS ‡ ‡‡fdd„}|S nrˆdurÄ|durÄ|ˆjˆ< dD ]8}|ˆ v r€ˆ | }t|||ƒ t|dƒr€t|j||ƒ q€ˆ|_|S tdˆ|f ƒ‚dS )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   B   s    zLibrary.filter.<locals>.decc                    s   ˆj ˆ| fi ˆ ¤ŽS r   )Úfilterr   ©r%   r   r   r   r   r   L   s    )Zexpects_localtimeÚis_safeZneeds_autoescaper"   z1Unsupported arguments to Library.filter: (%r, %r))r   r$   r   ÚsetattrÚhasattrr"   Z_filter_namer    )r   r   Zfilter_funcr%   r   ÚattrÚvaluer   r'   r   r&   8   s.    

ÿÿzLibrary.filterc                 K   s"   t |d|ƒj}| j||fi |¤ŽS r!   )r#   r   r&   )r   r   r%   r   r   r   r   r$   d   s    zLibrary.filter_functionc                    s8   ‡ ‡‡fdd„}|du r|S t |ƒr,||ƒS tdƒ‚dS )z§
        Register a callable as a compiled template tag. Example:

        @register.simple_tag
        def hello(*args, **kwargs):
            return 'world'
        c              
      sb   t tˆƒƒ\‰‰‰‰ ‰‰}ˆp*tˆdˆƒj‰t ˆ¡‡ ‡‡‡‡‡‡
‡‡f	dd„ƒ}ˆ	 ˆ|¡ ˆS )Nr"   c                    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   Ú	functoolsÚwrapsr   ©r   Ú_rC   ©r   r   r@   ©r;   r   r<   r=   r>   r?   rA   rB   r   r   q   s    	
øzLibrary.simple_tag.<locals>.decNz(Invalid arguments provided to simple_tag)r   r    )r   r   r@   r   r   r   rI   r   Ú
simple_tagh   s    	$zLibrary.simple_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                    sd   t tˆƒƒ\‰‰‰‰ ‰‰}ˆ	p*tˆdˆƒj‰t ˆ¡‡ ‡‡‡‡‡‡‡‡‡f
dd„ƒ}ˆ
 ˆ|¡ ˆS )Nr"   c                    s>   |  ¡ dd … }t| |ˆˆˆ	ˆ ˆˆˆˆƒ
\}}tˆˆ||ˆƒS )Nr   )r1   r3   ÚInclusionNode)r5   r6   r7   r9   r:   )
r;   Úfilenamer   r<   r=   r>   r?   r@   rA   rB   r   r   rC   ´   s(    öûz8Library.inclusion_tag.<locals>.dec.<locals>.compile_funcrD   rG   ©rM   r   r   r@   rJ   r   r   ¨   s    	
ø z"Library.inclusion_tag.<locals>.decr   )r   rM   r   r@   r   r   r   rN   r   Úinclusion_tagž   s    
&zLibrary.inclusion_tag)NN)NN)NNN)NNN)r   r   r   Ú__doc__r   r   r   r&   r$   rK   rO   r   r   r   r   r      s   

,
6r   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   r@   r9   r:   )r   r   r@   r9   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>ß   ó    z8TagHelperNode.get_resolved_arguments.<locals>.<listcomp>c                    s   i | ]\}}||  ˆ ¡“qS r   rR   )rT   ÚkÚvrV   r   r   Ú
<dictcomp>â   rY   z8TagHelperNode.get_resolved_arguments.<locals>.<dictcomp>)r9   r@   r:   Úitems)r   rW   Úresolved_argsÚresolved_kwargsr   rV   r   Úget_resolved_argumentsÞ   s
    
z$TagHelperNode.get_resolved_argumentsN)r   r   r   rP   r   r`   r   r   r   r   rQ   Ñ   s   rQ   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r4   r   c                    s   t ƒ  ||||¡ || _d S r   )Úsuperr   r8   )r   r   r@   r9   r:   r8   ©Ú	__class__r   r   r   é   s    zSimpleNode.__init__c                 C   sH   |   |¡\}}| j|i |¤Ž}| jd ur6||| j< dS |jrDt|ƒ}|S )NÚ )r`   r   r8   Z
autoescaper   )r   rW   r^   r_   Úoutputr   r   r   Úrenderí   s    

zSimpleNode.render)r   r   r   Zchild_nodelistsr   rf   Ú__classcell__r   r   rb   r   r4   æ   s   r4   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rL   c                    s   t ƒ  ||||¡ || _d S r   )ra   r   rM   )r   r   r@   r9   r:   rM   rb   r   r   r   ù   s    zInclusionNode.__init__c                 C   sÔ   |   |¡\}}| j|i |¤Ž}|j | ¡}|du r¦t| jtƒrF| j}nVtt| jddƒtƒrd| jj}n8t| jt	ƒsŒt
| jƒrŒ|jj | j¡}n|jj | j¡}||j| < | |¡}| d¡}|durÊ||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)r`   r   Zrender_contextÚgetÚ
isinstancerM   r	   r#   rh   Ústrr   ZengineZselect_templateZget_templateÚnewrf   )r   rW   r^   r_   Ú_dictÚtZnew_contextri   r   r   r   rf   ý   s"    



zInclusionNode.render)r   r   r   r   rf   rg   r   r   rb   r   rL   ø   s   rL   c
              	      sž  |r.|r"|d dkr"|dd… }nt d|	 ƒ‚g }
i }t|ƒ}‡ fdd„|D ƒ}|D ]ô}t|g| ƒ}|rì| ¡ \}}||vrž||vrž|du ržt d|	|f ƒ‚nL||v r¸t d	|	|f ƒ‚n2||t|ƒ< ||v rØ| |¡ n||v rê| |¡ qT|rþt d
|	 ƒ‚qT|
 |  |¡¡ z| d¡ W qT t	�yF   |du �rBt d|	 ƒ‚Y qT0 qT|du�rf|dt
|ƒ … }|�sr|�r–t 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   rW   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   )rT   Úkwarg©r>   r   r   rX   7  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   )rT   Úpr   r   r   Ú	<genexpr>n  rY   zparse_bits.<locals>.<genexpr>)r   Úlistr
   Úpopitemrl   ÚremoveÚappendZcompile_filterÚpopÚ
IndexErrorr2   Újoin)r5   r7   r?   rA   rB   r;   r=   r>   r@   r   r9   r:   Zunhandled_paramsZunhandled_kwargsÚbitrp   Úparamr,   r   rq   r   r3     sp    ÿÿ
ÿ
ÿÿÿÿÿ
ÿ
ÿÿr3   c              
   C   sn   zt | ƒ}W n4 ty@ } ztd| |f ƒ‚W Y d}~n
d}~0 0 z|jW S  tyh   td|  ƒ‚Y n0 dS )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_librarys  s    ÿÿÿr‚   )rE   Ú	importlibr   Úinspectr   r   Zdjango.utils.htmlr   Zdjango.utils.itercompatr   Úbaser   r	   r
   Ú
exceptionsr   Ú	Exceptionr   r   rQ   r4   rL   r3   r‚   r   r   r   r   Ú<module>   s    B#X