o
    ~¨ÊhÝ  ã                   @   sÀ   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
mZ d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZmZ d d
lmZ dd„ Zdd„ Zdd„ ZG dd„ deƒZdS )é    )Úabsolute_import)Úcopy)Útemplate)ÚContext)ÚNodeÚVariableNodeÚTextNodeÚNodeList)ÚIfNode)Úget_template)ÚBLOCK_CONTEXT_KEYÚExtendsNodeÚ	BlockNodeÚBlockContext)ÚTemplateSyntaxErrorÚTemplateDoesNotExist)ÚCompressorNodec           	      C   sº   t |jvrtƒ |jt < |jt  }tdd„ | j t¡D ƒƒ}| |¡ |  |¡}|j}|D ]}t	|t
ƒsAt	|tƒr?t||ƒ  S  nq,tdd„ | t¡D ƒƒ}| |¡ g }t|||ƒ}|S )z¢Create a copy of Node tree of a derived template replacing
    all blocks tags with the nodes of appropriate blocks.
    Also handles {{ block.super }} tags.
    c                 s   ó   � | ]}|j |fV  qd S ©N©Úname©Ú.0Ún© r   úK/var/www/html/env/lib/python3.10/site-packages/compressor/offline/django.pyÚ	<genexpr>   ó   € z%handle_extendsnode.<locals>.<genexpr>c                 s   r   r   r   r   r   r   r   r   &   r   )r   Úrender_contextr   ÚdictÚnodelistÚget_nodes_by_typer   Ú
add_blocksÚ
get_parentÚ
isinstancer   r   Úhandle_extendsnodeÚremove_block_nodes)	ÚextendsnodeÚcontextÚblock_contextÚblocksÚcompiled_parentÚparent_nodelistÚnodeÚblock_stackÚnew_nodelistr   r   r   r%      s,   


ÿ



ýÿ
r%   c                 C   sü   t ƒ }| D ]v}t|tƒr$|jj ¡ }|dkr$|sq| |d j¡}|s$qt|tƒr5t	|||ƒ}| 
|¡ qt|tƒrXt|ƒ}t|jƒD ]\}\}}	t|	||ƒ}	||	f|j|< qCn|jD ]}
t||
d ƒ}	|	rut|	||ƒ}	t|ƒ}t||
|	ƒ q[| |¡ q|S )Nzblock.superéÿÿÿÿ)r	   r$   r   Úfilter_expressionÚtokenÚstripÚ	get_blockr   r   Úexpand_blocknodeÚextendr
   r   Ú	enumerateÚconditions_nodelistsr&   Úchild_nodelistsÚgetattrÚsetattrÚappend)r    r.   r)   r/   r-   Úvar_nameÚexpanded_blockÚiÚ	conditionÚsub_nodelistÚattrr   r   r   r&   /   s8   


þ
€r&   c                 C   sV   |  | j¡ }}|d u r| }| |¡ t|j||ƒ}|  ¡  |d ur)| | j|¡ |S r   )Úpopr   r<   r&   r    Úpush)r-   r.   r)   Úpopped_blockÚblockÚexpanded_nodelistr   r   r   r5   O   s   
r5   c                   @   sX   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
ddd„ZdS )ÚDjangoParserc                 C   s
   || _ d S r   )Úcharset)ÚselfrI   r   r   r   Ú__init__\   s   
zDjangoParser.__init__c              
   C   sX   zt |ƒjW S  tjy } ztt|ƒƒ‚d }~w tjy+ } ztt|ƒƒ‚d }~ww r   )r   r   r   Ústrr   )rJ   Útemplate_nameÚer   r   r   Úparse_   s   €€ÿzDjangoParser.parsec                 C   s   dS )NTr   )rJ   r   r(   r   r   r   Úprocess_templateg   ó   zDjangoParser.process_templatec                 C   s   |S r   r   )rJ   Úoffline_contextr   r   r   Úget_init_contextj   rQ   zDjangoParser.get_init_contextc                 C   s   d S r   r   ©rJ   r   r(   r-   r   r   r   Úprocess_nodem   rQ   zDjangoParser.process_nodec                 C   s   ||_ |j |¡S r   )r   r    ÚrenderrT   r   r   r   Úrender_nodelistp   s   zDjangoParser.render_nodelistc                 C   s   |j |dd�S ©NT)Úforced)rV   rT   r   r   r   Úrender_nodet   s   zDjangoParser.render_nodeNc              
   C   s´   t |tƒr;z|d u rtƒ }||_t||ƒW S  tjy( } ztt|ƒƒ‚d }~w tjy: } ztt|ƒƒ‚d }~ww g }t |tƒrR|j	D ]
}|t
||g ƒ7 }qE|S t
|dg ƒ}|S )Nr    )r$   r   r   r   r%   r   rL   r   r   r9   r:   )rJ   r-   Úoriginalr(   rN   r    rB   r   r   r   Úget_nodelistw   s(   
€€ÿ

ÿzDjangoParser.get_nodelistc                 c   s^   � |d u r|}|   |||¡D ]}t|tƒr|jdd�r|V  q|  |||¡D ]}|V  q&qd S rX   )r\   r$   r   Úis_offline_compression_enabledÚ
walk_nodes)rJ   r-   r[   r(   r   r   r   r^   Œ   s   €

ÿÿûzDjangoParser.walk_nodesr   )NN)Ú__name__Ú
__module__Ú__qualname__rK   rO   rP   rS   rU   rW   rZ   r\   r^   r   r   r   r   rH   [   s    
rH   N)Ú
__future__r   r   Údjangor   Údjango.templater   Údjango.template.baser   r   r   r	   Údjango.template.defaulttagsr
   Údjango.template.loaderr   Údjango.template.loader_tagsr   r   r   r   Úcompressor.exceptionsr   r   Ú compressor.templatetags.compressr   r%   r&   r5   ÚobjectrH   r   r   r   r   Ú<module>   s     