B
    ª0H[æ  ã               @   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m	Z	 ddl
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é   )ÚContextÚTemplate)Ú_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   úZC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\template\engine.pyÚ__init__   s:    
zEngine.__init__c              C   sF   ddl m}  ddlm} x |  ¡ D ]}t||ƒr"|jS q"W 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 )N)r   )Ú.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 }x |  ¡ D ]\}}t|ƒ||< qW |S )N)Úitemsr
   )r   r   ZloadedÚnamer&   r   r   r   r   Z   s    zEngine.get_template_librariesc             C   s   |   | j¡S )N)Úget_template_loadersr   )r   r   r   r   Útemplate_loaders`   s    zEngine.template_loadersc             C   s2   g }x(|D ] }|   |¡}|d k	r
| |¡ q
W |S )N)Úfind_template_loaderÚappend)r   r/   r   Ztemplate_loaderÚloaderr   r   r   r.   d   s    

zEngine.get_template_loadersc             C   s\   t |ttfƒr(t|dd … ƒ}|d }ng }t |tƒrLt|ƒ}|| f|žŽ S td| ƒ‚d S )Nr   r   z3Invalid value in template loaders configuration: %r)r"   r(   ÚlistÚstrr   r   )r   r2   ÚargsÚloader_classr   r   r   r0   l   s    

zEngine.find_template_loaderc             C   sl   g }xV| j D ]L}y|j||d�}||jfS  tk
rV } z| |j¡ W d d }~X Y qX qW t||d�‚d S )N)Úskip)Útried)r/   Úget_templateÚoriginr	   Úextendr8   )r   r-   r   r7   r8   r2   ÚtemplateÚer   r   r   Úfind_templatez   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.
        Úrender)r#   )r>   Úhasattrr   )r   Útemplate_namer<   r:   r   r   r   r9   ‹   s    
zEngine.get_templatec             C   sJ   t |ttfƒr|  |¡}n
|  |¡}t |tƒr8| |¡S | t|ƒ¡S dS )z€
        Render the template specified by template_name with the given context.
        For use in Django's test suite.
        N)r"   r3   r(   Úselect_templater9   r   r@   )r   rB   ÚcontextÚtr   r   r   Úrender_to_string–   s    


zEngine.render_to_stringc             C   s~   |st dƒ‚g }xZ|D ]R}y
|  |¡S  t k
rf } z$|jd |krT| |jd ¡ wW dd}~X Y qX qW 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	   r9   r5   r1   Újoin)r   Ztemplate_name_listÚ	not_foundrB   Úexcr   r   r   rC   ¦   s    

zEngine.select_template)
NFNFNr   r   NNT)NN)N)Ú__name__Ú
__module__Ú__qualname__r   r   ÚstaticmethodÚ	functoolsÚ	lru_cacher$   r   r)   r   r   r/   r.   r0   r>   r?   r9   rF   rC   r   r   r   r   r      s&     
!

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