U
    8ÄT_â  ã                   @   sr   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
mZ ddlmZ dd	lmZ G d
d„ dƒZdS )é    N)ÚImproperlyConfigured)Úcached_property©Úimport_stringé   ©ÚTemplate)ÚContextÚ_builtin_context_processors)ÚTemplateDoesNotExist©Úimport_libraryc                
   @   s˜   e Zd ZdddgZd#d	d
„Zee ¡ dd„ ƒƒZe	dd„ ƒZ
dd„ Zdd„ Ze	dd„ ƒZdd„ Zdd„ Zd$dd„Zdd„ Zdd„ Zd%dd „Zd!d"„ ZdS )&ÚEnginezdjango.template.defaulttagszdjango.template.defaultfilterszdjango.template.loader_tagsNFÚ úutf-8Tc                 C   sÈ   |d krg }|d krg }|d krDdg}|r4|dg7 }|sPd|fg}n|rPt dƒ‚|d kr\i }|	d krhg }	|| _|| _|
| _|| _|| _|| _|| _|| _|| _	|  
|¡| _| j|	 | _|  | j¡| _d S )Nz)django.template.loaders.filesystem.Loaderz.django.template.loaders.app_directories.Loaderz%django.template.loaders.cached.Loaderz1app_dirs must not be set when loaders is defined.)r   ÚdirsÚapp_dirsÚ
autoescapeÚcontext_processorsÚdebugÚloadersÚstring_if_invalidÚfile_charsetÚ	librariesÚget_template_librariesZtemplate_librariesÚdefault_builtinsÚbuiltinsÚget_template_builtinsZtemplate_builtins)Úselfr   r   r   r   r   r   r   r   r   r   © r   ú:/tmp/pip-unpacked-wheel-dv63caxw/django/template/engine.pyÚ__init__   s<    
ÿzEngine.__init__c                  C   sF   ddl m}  ddlm} |  ¡ D ]}t||ƒr |j  S q tdƒ‚dS )aò  
        Return the first DjangoTemplates backend that's configured, or raise
        ImproperlyConfigured if none are configured.

        This is required for preserving historical APIs that rely on a
        globally available, implicitly configured engine such as:

        >>> from django.template import Context, Template
        >>> template = Template("Hello {{ name }}!")
        >>> context = Context({'name': "world"})
        >>> template.render(context)
        'Hello world!'
        r   )Úengines)ÚDjangoTemplatesz)No DjangoTemplates backend is configured.N)Zdjango.templater"   Zdjango.template.backends.djangor#   ÚallÚ
isinstanceÚenginer   )r"   r#   r&   r   r   r    Úget_default7   s    
zEngine.get_defaultc                 C   s$   t }|t| jƒ7 }tdd„ |D ƒƒS )Nc                 s   s   | ]}t |ƒV  qd S ©Nr   )Ú.0Úpathr   r   r    Ú	<genexpr>U   s     z5Engine.template_context_processors.<locals>.<genexpr>)r
   Útupler   )r   r   r   r   r    Útemplate_context_processorsQ   s    z"Engine.template_context_processorsc                 C   s   dd„ |D ƒS )Nc                 S   s   g | ]}t |ƒ‘qS r   r   )r)   Úxr   r   r    Ú
<listcomp>X   s     z0Engine.get_template_builtins.<locals>.<listcomp>r   )r   r   r   r   r    r   W   s    zEngine.get_template_builtinsc                 C   s&   i }|  ¡ D ]\}}t|ƒ||< q|S r(   )Úitemsr   )r   r   ZloadedÚnamer*   r   r   r    r   Z   s    zEngine.get_template_librariesc                 C   s   |   | j¡S r(   )Úget_template_loadersr   )r   r   r   r    Útemplate_loaders`   s    zEngine.template_loadersc                 C   s.   g }|D ] }|   |¡}|d k	r| |¡ q|S r(   )Úfind_template_loaderÚappend)r   r3   r   Ztemplate_loaderÚloaderr   r   r    r2   d   s    
zEngine.get_template_loadersc                 C   sL   t |ttfƒr|^}}ng }t |tƒr<t|ƒ}|| f|žŽ S td| ƒ‚d S )Nz3Invalid value in template loaders configuration: %r)r%   r,   ÚlistÚstrr   r   )r   r6   ÚargsÚloader_classr   r   r    r4   l   s    

ÿzEngine.find_template_loaderc                 C   sn   g }| j D ]R}z|j||d�}||jfW   S  tk
rZ } z| |j¡ W 5 d }~X Y q
X q
t||d�‚d S )N)Úskip)Útried)r3   Úget_templateÚoriginr   Úextendr<   )r   r1   r   r;   r<   r6   ÚtemplateÚer   r   r    Úfind_templatey   s    
 zEngine.find_templatec                 C   s   t || d�S )zƒ
        Return a compiled Template object for the given template code,
        handling template inheritance recursively.
        ©r&   r   )r   Ztemplate_coder   r   r    Úfrom_stringƒ   s    zEngine.from_stringc                 C   s,   |   |¡\}}t|dƒs(t|||| d�}|S )zƒ
        Return a compiled Template object for the given template name,
        handling template inheritance recursively.
        ÚrenderrC   )rB   Úhasattrr   )r   Útemplate_namer@   r>   r   r   r    r=   Š   s    
zEngine.get_templatec                 C   sP   t |ttfƒr|  |¡}n
|  |¡}t |tƒr8| |¡S | t|| jd�¡S dS )z€
        Render the template specified by template_name with the given context.
        For use in Django's test suite.
        )r   N)r%   r7   r,   Úselect_templater=   r	   rE   r   )r   rG   ÚcontextÚtr   r   r    Úrender_to_string•   s    


zEngine.render_to_stringc                 C   s†   |st dƒ‚g }|D ]^}z|  |¡W   S  t k
rp } z*|jd |krX| |jd ¡ W Y ¢qW 5 d}~X Y qX qt d |¡ƒ‚dS )zV
        Given a list of template names, return the first that can be loaded.
        zNo template names providedr   Nz, )r   r=   r9   r5   Újoin)r   Ztemplate_name_listÚ	not_foundrG   Úexcr   r   r    rH   ¥   s    zEngine.select_template)
NFNFNr   r   NNT)NN)N)Ú__name__Ú
__module__Ú__qualname__r   r!   ÚstaticmethodÚ	functoolsÚ	lru_cacher'   r   r-   r   r   r3   r2   r4   rB   rD   r=   rK   rH   r   r   r   r    r      s:   ý             þ
#




r   )rS   Zdjango.core.exceptionsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   Úbaser   rI   r	   r
   Ú
exceptionsr   Zlibraryr   r   r   r   r   r    Ú<module>   s   