
_K                 @   s   d  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 d
 d   Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d d   Z d S)z
    flask.templating
    ~~~~~~~~~~~~~~~~

    Implements the bridge to Jinja2.

    :copyright: 2010 Pallets
    :license: BSD-3-Clause
    )
BaseLoader)Environment)TemplateNotFound   )_app_ctx_stack)_request_ctx_stack)before_render_template)template_renderedc              C   s[   t  j }  t j } i  } | d k	 r1 | j | d <|  d k	 rW |  j | d <|  j | d <| S)zSDefault template context processor.  Injects `request`,
    `session` and `g`.
    Ngrequestsession)r   topr   r
   r   r   )ZreqctxZappctxrv r   1/tmp/pip-build-5gj8f0j9/flask/flask/templating.py_default_template_ctx_processor   s    		r   c               @   s"   e  Z d  Z d Z d d   Z d S)r   zWorks like a regular Jinja2 environment but has some additional
    knowledge of how Flask's blueprint works so that it can prepend the
    name of the blueprint to referenced templates if necessary.
    c             K   s9   d | k r | j    | d <t j |  |  | |  _ d  S)Nloader)Zcreate_global_jinja_loaderBaseEnvironment__init__app)selfr   optionsr   r   r   r   *   s    zEnvironment.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   $   s   r   c               @   s^   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	 d S)DispatchingJinjaLoaderz\A loader that looks for templates in the application and all
    the blueprint folders.
    c             C   s   | |  _  d  S)N)r   )r   r   r   r   r   r   6   s    zDispatchingJinjaLoader.__init__c             C   s0   |  j  j d r  |  j | |  S|  j | |  S)NZEXPLAIN_TEMPLATE_LOADING)r   config_get_source_explained_get_source_fast)r   environmenttemplater   r   r   
get_source9   s    z!DispatchingJinjaLoader.get_sourcec       	      C   s   g  } d  } xv |  j  |  D]e \ } } y( | j | |  } | d  k rO | } Wn t k
 rj d  } Yn X| j | | | f  q Wd d l m } | |  j | |  | d  k	 r | St |   d  S)Nr   )!explain_template_loading_attempts)_iter_loadersr"   r   appendZdebughelpersr#   r   )	r   r    r!   attemptsZtrvZsrcobjr   r   r#   r   r   r   r   >   s    
z,DispatchingJinjaLoader._get_source_explainedc             C   s\   xI |  j  |  D]8 \ } } y | j | |  SWq t k
 rG w Yq Xq Wt |   d  S)N)r$   r"   r   )r   r    r!   Z_srcobjr   r   r   r   r   S   s    z'DispatchingJinjaLoader._get_source_fastc             c   sd   |  j  j } | d  k	 r& |  j  | f Vx7 |  j  j   D]& } | j } | d  k	 r6 | | f Vq6 Wd  S)N)r   jinja_loaderiter_blueprints)r   r!   r   	blueprintr   r   r   r$   [   s    	z$DispatchingJinjaLoader._iter_loadersc             C   s   t    } |  j j } | d  k	 r4 | j | j    xP |  j j   D]? } | j } | d  k	 rD x! | j   D] } | j |  ql WqD Wt |  S)N)setr   r'   updatelist_templatesr(   addlist)r   resultr   r)   r!   r   r   r   r,   e   s    		z%DispatchingJinjaLoader.list_templatesN)
r   r   r   r   r   r"   r   r   r$   r,   r   r   r   r   r   1   s   
r   c             C   sE   t  j | d |  d | |  j |  } t j | d |  d | | S)z)Renders the template and fires the signalr!   context)r   sendrenderr	   )r!   r0   r   r   r   r   r   _rendert   s    r3   c             K   s;   t  j } | j j |  t | j j j |   | | j  S)a  Renders a template from the template folder with the given
    context.

    :param template_name_or_list: the name of the template to be
                                  rendered, or an iterable with template names
                                  the first one existing will be rendered
    :param context: the variables that should be available in the
                    context of the template.
    )r   r   r   update_template_contextr3   	jinja_envZget_or_select_template)Ztemplate_name_or_listr0   ctxr   r   r   render_template}   s    
	r7   c             K   s;   t  j } | j j |  t | j j j |   | | j  S)aF  Renders a template from the given template source string
    with the given context. Template variables will be autoescaped.

    :param source: the source code of the template to be
                   rendered
    :param context: the variables that should be available in the
                    context of the template.
    )r   r   r   r4   r3   r5   Zfrom_string)sourcer0   r6   r   r   r   render_template_string   s    		r9   N)r   Zjinja2r   r   r   r   globalsr   r   Zsignalsr   r	   r   r   r3   r7   r9   r   r   r   r   <module>
   s   C	