3
›(ƒhš  ã               @   s²   d Z ddlZddlZddlmZ ddlmZ dZyddlm	Z	 e	j
Z
W n^ ek
r¤   ddlmZ ddlmZ G d	d
„ d
eƒZG dd„ deƒZdd„ Zddd„Z
Y nX dd„ ZdS )z,Django backport and compatibility utilities.é    N)Úsix)Úconditional_escapeÚ
simple_tag)ÚLibrary)ÚNode)Ú
parse_bitsc               @   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 )N)ÚfuncÚtakes_contextÚargsÚkwargs)Úselfr	   r
   r   r   © r   ú</tmp/pip-install-q3hcpn_q/django-material/material/compat.pyÚ__init__   s    zTagHelperNode.__init__c                sD   ‡ fdd„| j D ƒ}| jr$ˆ g| }‡ fdd„| jjƒ D ƒ}||fS )Nc                s   g | ]}|j ˆ ƒ‘qS r   )Úresolve)Ú.0Úvar)Úcontextr   r   ú
<listcomp>#   s    z8TagHelperNode.get_resolved_arguments.<locals>.<listcomp>c                s   i | ]\}}|j ˆ ƒ|“qS r   )r   )r   ÚkÚv)r   r   r   ú
<dictcomp>&   s   z8TagHelperNode.get_resolved_arguments.<locals>.<dictcomp>)r   r
   r   Úitems)r   r   Úresolved_argsÚresolved_kwargsr   )r   r   Úget_resolved_arguments"   s    

z$TagHelperNode.get_resolved_argumentsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
SimpleNodec                s    t t| ƒj||||ƒ || _d S )N)Úsuperr!   r   Ú
target_var)r   r	   r
   r   r   r#   )Ú	__class__r   r   r   -   s    zSimpleNode.__init__c             C   sD   | j |ƒ\}}| j||Ž}| jd k	r2||| j< dS |jr@t|ƒ}|S )NÚ )r   r	   r#   Z
autoescaper   )r   r   r   r   Úoutputr   r   r   Úrender1   s    

zSimpleNode.render)r   r   r   r   r'   Ú__classcell__r   r   )r$   r   r!   ,   s   r!   c             C   sš   t jrtj| ƒS tj| ƒ}dd„ |jjƒ D ƒ}dd„ |jjƒ D ƒ}|rN|d nd }dd„ |jjƒ D ƒ}|rr|d nd }dd„ |jjƒ D ƒpŒd }||||fS )Nc             S   s    g | ]}|j tjjkr|j‘qS r   )ÚkindÚinspectÚ	ParameterÚPOSITIONAL_OR_KEYWORDÚname)r   Úpr   r   r   r   B   s    zgetargspec.<locals>.<listcomp>c             S   s    g | ]}|j tjjkr|j‘qS r   )r)   r*   r+   ÚVAR_POSITIONALr-   )r   r.   r   r   r   r   F   s    r   c             S   s    g | ]}|j tjjkr|j‘qS r   )r)   r*   r+   ÚVAR_KEYWORDr-   )r   r.   r   r   r   r   K   s    c             S   s,   g | ]$}|j tjjkr|j|jk	r|j‘qS r   )r)   r*   r+   r,   ÚdefaultÚempty)r   r.   r   r   r   r   P   s    )r   ÚPY2r*   Ú
getargspecÚ	signatureÚ
parametersÚvalues)r	   Úsigr   ÚvarargsÚvarkwÚdefaultsr   r   r   r4   <   s    

r4   c                s8   ‡ ‡‡fdd„}|dk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'

        Backport from django 1.9
        c                sT   t ˆƒ\‰‰‰‰ ˆp tˆdˆƒj‰tjˆƒ‡ ‡‡‡‡‡‡fdd„ƒ}ˆjˆ|ƒ ˆS )NZ_decorated_functionc          	      sj   |j ƒ dd … }d }t|ƒdkrZ|d dkrZ|d }|d d… }t| |ˆˆˆˆ ˆˆƒ\}}tˆˆ|||ƒS )Né   é   Úaséþÿÿÿéÿÿÿÿr?   )Zsplit_contentsÚlenr   r!   )ÚparserÚtokenÚbitsr#   r   r   )r;   r	   Úfunction_nameÚparamsr
   r9   r:   r   r   Úcompile_funcg   s    
z-simple_tag.<locals>.dec.<locals>.compile_func)r4   Úgetattrr   Ú	functoolsÚwrapsÚtag)r	   rG   )Úlibraryr-   r
   )r;   r	   rE   rF   r9   r:   r   Údeca   s
    "zsimple_tag.<locals>.decNz(Invalid arguments provided to simple_tag)ÚcallableÚ
ValueError)rL   r	   r
   r-   rM   r   )rL   r-   r
   r   r   V   s    c             C   s4   i }x*| j D ] }t|dƒr"t|ƒ}|j|ƒ qW |S )NÚflatten)ZdictsÚhasattrÚcontext_flattenÚupdate)r   ÚresultZdict_r   r   r   rR   €   s    
rR   )r   )NNN)r    r*   rI   Zdjango.utilsr   Zdjango.utils.htmlr   Ú__all__Zdjango.template.libraryr   r   ÚImportErrorZdjango.templater   Zdjango.template.baser   r   r!   r4   rR   r   r   r   r   Ú<module>   s    
*