
 X1                 @   s.  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l 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 Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d S)    N)import_module)six)RemovedInDjango20Warning)conditional_escape)
getargspec)is_iterable   )NodeTemplatetoken_kwargs)TemplateSyntaxErrorc               @   s   e  Z d  Z d S)InvalidTemplateLibraryN)__name__
__module____qualname__ r   r   E/home/ubuntu/projects/ifolica/build/django/django/template/library.pyr      s   r   c               @   s   e  Z d  Z d Z d d   Z d d d d  Z d d   Z d d d	 d
  Z d d   Z d d d d d  Z	 d d d d d  Z
 d d 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  k r | d  k r  j  S  d  k	 rl | d  k rl t    rP  j     S   f d d   } | Sn?   d  k	 r | d  k	 r |  j   <| St d   | f   d  S)Nc                s    j    |   S)N)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   r      s    zLibrary.tagc             C   s    | |  j  t | d |  j <| S)N_decorated_function)r   getattrr   )r   r   r   r   r   r   5   s    zLibrary.tag_functionc                s/   d k r1 | d k r1    f d d   } | S d k	 r | d k r t    re  j     S    f d d   } | Sn  d k	 r| d k	 r|  j  <x\ d
 D]T } |   k r   | } t | | |  t | d  rt | j | |  qq q W | _ | St d	  | f   d S)z
        Register a callable as a template filter. Example:

        @register.filter
        def lower(value):
            return value.lower()
        Nc                s    j  |     S)N)filter_function)r   )flagsr   r   r   r   C   s    zLibrary.filter.<locals>.decc                s    j   |     S)N)filter)r   )r"   r   r   r   r   r   L   s    expects_localtimeis_safeneeds_autoescaper   z1Unsupported arguments to Library.filter: (%r, %r))r$   r%   r&   )r   r!   r   setattrhasattrr   Z_filter_namer   )r   r   Zfilter_funcr"   r   attrvaluer   )r"   r   r   r   r#   9   s*    
	zLibrary.filterc             K   s(   t  | d |  j } |  j | | |  S)Nr   )r    r   r#   )r   r   r"   r   r   r   r   r!   c   s    zLibrary.filter_functionc                sN       f d d   } | d k r( | St  |  r> | |  St d   d S)z
        Register a callable as a compiled template tag. Example:

        @register.simple_tag
        def hello(*args, **kwargs):
            return 'world'
        c                sz   t    \       p0 t  d   j  t j           f d d    }  j  |   S)Nr   c          	      s   | j    d d   } d  } t |  d k r[ | d d k r[ | d } | d  d  } n  t |  |         \ } } t   | | |  S)Nr      asr-   )split_contentslen
parse_bits
SimpleNode)parsertokenbits
target_varargskwargs)defaultsr   function_nameparamstakes_contextvarargsvarkwr   r   compile_funcs   s    "
z5Library.simple_tag.<locals>.dec.<locals>.compile_func)r   r    r   	functoolswrapsr   )r   r?   )r   r   r<   )r9   r   r:   r;   r=   r>   r   r   o   s
    3zLibrary.simple_tag.<locals>.decNz(Invalid arguments provided to simple_tag)r   r   )r   r   r<   r   r   r   )r   r   r<   r   
simple_tagg   s    
zLibrary.simple_tagc             C   s)   t  j d t d d |  j | | |  S)Nz8assignment_tag() is deprecated. Use simple_tag() instead
stacklevelr+   )warningswarnr   rB   )r   r   r<   r   r   r   r   assignment_tag   s
    zLibrary.assignment_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    \       p0 t  d   j  t j         	   f d d    }  j  |   S)Nr   c          	      sS   | j    d d   } t |  |         \ } } t   | |   S)Nr   )r/   r1   InclusionNode)r3   r4   r5   r7   r8   )r9   filenamer   r:   r;   r<   r=   r>   r   r   r?      s    z8Library.inclusion_tag.<locals>.dec.<locals>.compile_func)r   r    r   r@   rA   r   )r   r?   )rH   r   r   r<   )r9   r   r:   r;   r=   r>   r   r      s
    6
z"Library.inclusion_tag.<locals>.decr   )r   rH   r   r<   r   r   r   )rH   r   r   r<   r   inclusion_tag   s    	zLibrary.inclusion_tag)r   r   r   __doc__r   r   r   r#   r!   rB   rF   rI   r   r   r   r   r      s   *$r   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)N)r   r<   r7   r8   )r   r   r<   r7   r8   r   r   r   r      s    			zTagHelperNode.__init__c                sa     f d d   |  j  D } |  j r5   g | } n    f d d   |  j j   D } | | f S)Nc                s   g  |  ] } | j      q Sr   )resolve).0var)contextr   r   
<listcomp>   s   	 z8TagHelperNode.get_resolved_arguments.<locals>.<listcomp>c                s(   i  |  ] \ } } | j     |  q Sr   )rL   )rM   kv)rO   r   r   
<dictcomp>   s   	 z8TagHelperNode.get_resolved_arguments.<locals>.<dictcomp>)r7   r<   r8   items)r   rO   resolved_argsresolved_kwargsr   )rO   r   get_resolved_arguments   s
    	"z$TagHelperNode.get_resolved_argumentsN)r   r   r   rJ   r   rW   r   r   r   r   rK      s   rK   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)r2   c                s,   t  t |   j | | | |  | |  _ d  S)N)superr2   r   r6   )r   r   r<   r7   r8   r6   )	__class__r   r   r      s    zSimpleNode.__init__c             C   sc   |  j  |  \ } } |  j | |   } |  j d  k	 rG | | |  j <d S| j r_ t |  } n  | S)N )rW   r   r6   Z
autoescaper   )r   rO   rU   rV   outputr   r   r   render   s    	zSimpleNode.render)r   r   r   r   r\   r   r   )rY   r   r2      s   r2   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)rG   c                s,   t  t |   j | | | |  | |  _ d  S)N)rX   rG   r   rH   )r   r   r<   r7   r8   rH   )rY   r   r   r      s    zInclusionNode.__init__c             C   s<  |  j  |  \ } } |  j | |   } | j j |   } | d k r t |  j t  rc |  j } n t t |  j d d  t  r |  j j } nX t |  j t	 j
  r t |  j  r | j j j |  j  } n | j j j |  j  } | | j |  <n  | j |  } | j d  } | d k	 r/| | d <n  | j |  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)rW   r   Zrender_contextget
isinstancerH   r
   r    r]   r   string_typesr   ZengineZselect_templateZget_templatenewr\   )r   rO   rU   rV   _dicttZnew_contextr^   r   r   r   r\      s"    %zInclusionNode.render)r   r   r   r   r\   r   r   )rY   r   rG      s   rG   c             C   s  | r< | d d k r) | d d  } q< t  d |   n  g  } i  }	 t |  }
 x1| D])} t | g |   } | r| j   \ } } | | k r | d k r t  d | | f   q| |	 k r t  d | | f   q| |	 t |  <| |
 k r|
 j |  qq[ |	 r)t  d |   q[ | j |  j |   y |
 j d  Wq[ t	 k
 r| d k rt  d	 |   n  Yq[ Xq[ W| d k	 r|
 d t
 |   }
 n  |
 rt  d
 | d j d d   |
 D  f   n  | |	 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   rO   r   NzW'%s' is decorated with takes_context=True so it must have a first argument of 'context'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   )rM   pr   r   r   	<genexpr>8  s    zparse_bits.<locals>.<genexpr>)r   listr   popitemstrremoveappendZcompile_filterpop
IndexErrorr0   join)r3   r5   r;   r=   r>   r9   r<   r   r7   r8   Zunhandled_paramsbitZkwargparamr*   r   r   r   r1      sV    )r1   c             C   s   y t  |   } Wn; t k
 rM } z t d |  | f   WYd d } ~ Xn Xy | j SWn" t k
 r} t d |    Yn Xd 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_library<  s    #rv   )r@   rD   	importlibr   Zdjango.utilsr   Zdjango.utils.deprecationr   Zdjango.utils.htmlr   Zdjango.utils.inspectr   Zdjango.utils.itercompatr   baser	   r
   r   
exceptionsr   	Exceptionr   objectr   rK   r2   rG   r1   rv   r   r   r   r   <module>   s    $D