
2!V'                 @   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 d  d	 l m Z m Z d  d
 l m Z d d d d  Z d d   Z d d   Z Gd d   d e  Z d S)    )absolute_import)copy)template)Context)NodeVariableNodeTextNodeNodeList)IfNode)get_template)ExtendsNode	BlockNodeBlockContext)TemplateSyntaxErrorTemplateDoesNotExist)CompressorNodeNc       
      C   s  | d k r t    } n  t d d   |  j j t  D  } | j |  t   } | d k	 rk | | _ n  |  j |  } | j } x@ | D]8 } t	 | t
  s t	 | t  r t | | |  SPq q Wt d d   | j t  D  } | j |  g  } t | | |  }	 |	 S)zCreate a copy of Node tree of a derived template replacing
    all blocks tags with the nodes of appropriate blocks.
    Also handles {{ block.super }} tags.
    Nc             s   s   |  ] } | j  | f Vq d  S)N)name).0n r   F/tmp/pip-build-0sboevxh/django-compressor/compressor/offline/django.py	<genexpr>   s    z%handle_extendsnode.<locals>.<genexpr>c             s   s   |  ] } | j  | f Vq d  S)N)r   )r   r   r   r   r   r   ,   s    )r   dictnodelistZget_nodes_by_typer   Z
add_blocksr   r   Z
get_parent
isinstancer   r   handle_extendsnoderemove_block_nodes)
Zextendsnodeblock_contextoriginalblockscontextZcompiled_parentZparent_nodelistnodeblock_stacknew_nodelistr   r   r   r      s*    		r   c             C   s  t    } xs|  D]k} t | t  rw | j j j   } | d k rw | sO q n  | j | d j  } | st q qt qw n  t | t  r t	 | | |  } | j
 |  q t | t  rt |  } x t | j  D]7 \ } \ } }	 t |	 | |  }	 | |	 f | j | <q Wn] xZ | j D]O }
 t | |
 d   }	 |	 rt |	 | |  }	 t |  } t | |
 |	  qqW| j |  q W| S)Nzblock.super   )r	   r   r   Zfilter_expressiontokenstripZ	get_blockr   r   expand_blocknodeextendr
   r   	enumerateZconditions_nodelistsr   child_nodelistsgetattrsetattrappend)r   r"   r   r#   r!   var_nameZexpanded_blocki	conditionZsub_nodelistattrr   r   r   r   5   s4    	"r   c             C   s}   | j  |  j  } } | d  k r+ |  } n  | j |  t | j | |  } | j    | d  k	 ry | j |  j |  n  | S)N)popr   r.   r   r   push)r!   r"   r   Zpopped_blockblockZexpanded_nodelistr   r   r   r(   U   s    	
r(   c               @   s   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)N)charset)selfr7   r   r   r   __init__b   s    zDjangoParser.__init__c             C   s   y t  |  j SWns t j k
 rM } z t t |    WYd  d  } ~ Xn: t j k
 r } z t t |    WYd  d  } ~ Xn Xd  S)N)r   r   r   strr   )r8   Ztemplate_nameer   r   r   parsee   s    $zDjangoParser.parsec             C   s   d S)NTr   )r8   r   r    r   r   r   process_templatem   s    zDjangoParser.process_templatec             C   s   | S)Nr   )r8   Zoffline_contextr   r   r   get_init_contextp   s    zDjangoParser.get_init_contextc             C   s   d  S)Nr   )r8   r   r    r!   r   r   r   process_nodes   s    zDjangoParser.process_nodec             C   s   | | _  | j j |  S)N)r   r   render)r8   r   r    r!   r   r   r   render_nodelistv   s    	zDjangoParser.render_nodelistc             C   s   | j  | d d S)NforcedT)r@   )r8   r   r    r!   r   r   r   render_nodez   s    zDjangoParser.render_nodeNc             C   s   t  | t  r y t | d d  d | SWq t j k
 re } z t t |    WYd  d  } ~ Xq t j k
 r } z t t |    WYd  d  } ~ Xq Xn  g  } t  | t  r x< | j D] } | t	 | | g   7} q Wn t	 | d g   } | S)Nr   r   r   )
r   r   r   r   r   r:   r   r   r+   r,   )r8   r!   r   r;   r   r2   r   r   r   get_nodelist}   s    $(zDjangoParser.get_nodelistc             c   s   | d  k r | } n  xe |  j  | |  D]Q } t | t  rW | j d d  rW | Vq( x |  j | |  D] } | Vqj Wq( Wd  S)NrB   T)rD   r   r   Zis_offline_compression_enabled
walk_nodes)r8   r!   r   r   r   r   rE      s    	!zDjangoParser.walk_nodes)__name__
__module____qualname__r9   r<   r=   r>   r?   rA   rC   rD   rE   r   r   r   r   r6   a   s   r6   )
__future__r   r   Zdjangor   Zdjango.templater   Zdjango.template.baser   r   r   r	   Zdjango.template.defaulttagsr
   Zdjango.template.loaderr   Zdjango.template.loader_tagsr   r   r   Zcompressor.exceptionsr   r   Z compressor.templatetags.compressr   r   r   r(   objectr6   r   r   r   r   <module>   s   "% 