o
    ·„j7B  ã                   @   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   úU/var/www/html/django_cbt/venv/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 rœt d|	 ƒ‚Y q*w |dur¬|dt
|ƒ … }|s°|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   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