o
    r|ac.                     @   s   d Z ddlZddlmZ ddlmZ ddgZedejZ	d dd	Z
d
d ZG dd deZd ddZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )!z8
Exposes a parse() function to parse template strings.

    N)defaults)ParsedTemplate
z^(.)c                 C   s.   t | turtdt |  t|}|| S )a  
    Parse a unicode template string and return a ParsedTemplate instance.

    Arguments:

      template: a unicode template string.

      delimiters: a 2-tuple of delimiters.  Defaults to the package default.

    Examples:

    >>> parsed = parse("Hey {{#who}}{{name}}!{{/who}}")
    >>> print(str(parsed).replace('u', ''))  # This is an old hack.
    ['Hey ', _SectionNode(key='who', index_begin=12, index_end=21, parsed=[_EscapeNode(key='name'), '!'])]

    zTemplate is not unicode: %s)typestr	Exception_Parserparse)template
delimitersparser r   1/usr/lib/python3/dist-packages/pystache/parser.pyr
      s   
r
   c                 C   s6   d}d|t | d t | d d }t |t jS )zH
    Return a regular expression object (re.RegexObject) instance.

    z!>&/#^a  
        (?P<whitespace>[\ \t]*)
        %(otag)s \s*
        (?:
          (?P<change>=) \s* (?P<delims>.+?)   \s* = |
          (?P<raw>{)    \s* (?P<raw_name>.+?) \s* } |
          (?P<tag>[%(tag_types)s]?)  \s* (?P<tag_key>[\s\S]+?)
        )
        \s* %(ctag)s
    r      )	tag_typesZotagZctag)reescapecompileVERBOSE)r   r   tagr   r   r   _compile_template_re,   s   
r   c                   @   s   e Zd ZdS )ParsingErrorN)__name__
__module____qualname__r   r   r   r   r   L   s    r   c                    sp   |d u rg }| d | j tt  t| }|  |dd  fdd|D }d| jjd	|f S )Nkeyr   c                    s    g | ]}d |t  | f qS )z%s=%s)repr).0nameZattrsr   r   
<listcomp>\   s     z_format.<locals>.<listcomp>z%s(%s)z, )
append__dict__listsetkeyssortinsert	__class__r   join)objexcludenamesargsr   r    r   _formatT   s   
r/   c                   @   s   e Zd Zdd Zdd ZdS )_CommentNodec                 C      t | S Nr/   selfr   r   r   __repr__a      z_CommentNode.__repr__c                 C      dS N r   r5   enginecontextr   r   r   renderd      z_CommentNode.renderN)r   r   r   r6   r>   r   r   r   r   r0   `   s    r0   c                   @   $   e Zd Zdd Zdd Zdd ZdS )_ChangeNodec                 C   
   || _ d S r2   r   r5   r   r   r   r   __init__i      
z_ChangeNode.__init__c                 C   r1   r2   r3   r4   r   r   r   r6   l   r7   z_ChangeNode.__repr__c                 C   r8   r9   r   r;   r   r   r   r>   o   r?   z_ChangeNode.renderNr   r   r   rE   r6   r>   r   r   r   r   rA   h       rA   c                   @   r@   )_EscapeNodec                 C   rB   r2   r   r5   r   r   r   r   rE   t   rF   z_EscapeNode.__init__c                 C   r1   r2   r3   r4   r   r   r   r6   w   r7   z_EscapeNode.__repr__c                 C      | || j}||S r2   )fetch_stringr   r   r5   r<   r=   sr   r   r   r>   z      
z_EscapeNode.renderNrG   r   r   r   r   rI   s   rH   rI   c                   @   r@   )_LiteralNodec                 C   rB   r2   rJ   rK   r   r   r   rE      rF   z_LiteralNode.__init__c                 C   r1   r2   r3   r4   r   r   r   r6      r7   z_LiteralNode.__repr__c                 C   rL   r2   )rM   r   literalrN   r   r   r   r>      rP   z_LiteralNode.renderNrG   r   r   r   r   rQ      rH   rQ   c                   @   r@   )_PartialNodec                 C      || _ || _d S r2   )r   indent)r5   r   rU   r   r   r   rE         
z_PartialNode.__init__c                 C   r1   r2   r3   r4   r   r   r   r6      r7   z_PartialNode.__repr__c                 C   s,   | | j}tt| jd |}|||S )Nz\1)Zresolve_partialr   r   subNON_BLANK_RErU   r>   )r5   r<   r=   r   r   r   r   r>      s   z_PartialNode.renderNrG   r   r   r   r   rS          rS   c                   @   r@   )_InvertedNodec                 C   rT   r2   )r   parsed_section)r5   r   r[   r   r   r   rE      rV   z_InvertedNode.__init__c                 C   r1   r2   r3   r4   r   r   r   r6      r7   z_InvertedNode.__repr__c                 C   s$   | || j}|rdS | j||S r9   )Zresolve_contextr   r[   r>   )r5   r<   r=   datar   r   r   r>      s   z_InvertedNode.renderNrG   r   r   r   r   rZ      rY   rZ   c                   @   r@   )_SectionNodec                 C   s(   || _ || _|| _|| _|| _|| _d S r2   )r   r   parsedr   index_begin	index_end)r5   r   r^   r   r   r_   r`   r   r   r   rE      s   
z_SectionNode.__init__c                 C   s   t | ddgdS )Nr   r   )r,   r3   r4   r   r   r   r6         z_SectionNode.__repr__c                 C   s   | || j}g }|D ]3}t|r+|| j| j| j }|j||| jd}|| q|	| || j
|| |  qtd|S )NrC   r:   )Zfetch_section_datar   callabler   r_   r`   Z_render_valuer   r"   pushr^   r>   popr   r*   )r5   r<   r=   valuespartsvalr   r   r   r>      s   


z_SectionNode.renderNrG   r   r   r   r   r]      s    r]   c                   @   sF   e Zd ZdZdZdddZdd Zdd Zdd	 Zd
d Z	dd Z
dS )r	   Nc                 C   s   |d u rt j}|| _d S r2   )r   Z
DELIMITERS_delimitersrD   r   r   r   rE      s   
z_Parser.__init__c                 C   s   t | j| _d S r2   )r   rh   _template_rer4   r   r   r   _compile_delimiters   ra   z_Parser._compile_delimitersc                 C   s   || _ |   d S r2   )rh   rj   rD   r   r   r   _change_delimiters   s   z_Parser._change_delimitersc                 C   s  |    d}d\}}t }g }	 | j||}|du rn| }| }	| }
|
d dur8|
jd|
d d n|
d	 durG|
jd
|
d d |
d }|
d }|
d }|dkp^||d  tv }|	t	|kpj||	 tv }|dv }|r|r|s|	t	|k r|	||	 dkrdpd7 }	|	t	|k r|	||	 dkrdpd7 }	n
|r|t	|7 }d}||kr|
|||  |	}|dv r||	||f}|| |t }}q|dkr||krtd||f |}| \}}}}| ||||||}n| |||}|
| q|t	|kr|
||d  |S )a?  
        Parse a template string starting at some index.

        This method uses the current tag delimiter.

        Arguments:

          template: a unicode string that is the template to parse.

          index: the index at which to start parsing.

        Returns:

          a ParsedTemplate instance.

        r   )NNTNZchange=Zdelims)r   tag_keyraw&Zraw_namer   rm   Z
whitespacer   )r:   ro   r   r   r:   )#^/z"Section end tag mismatch: %s != %s)rj   r   ri   searchstartend	groupdictupdateEND_OF_LINE_CHARACTERSlenaddr"   r   rd   _make_section_node_make_interpolation_node)r5   r   start_indexr[   Zsection_keyZparsed_templateZstatesmatchZmatch_indexZ	end_indexmatchestag_typerm   leading_whitespaceZdid_tag_begin_lineZdid_tag_end_lineZis_tag_interpolatingstatesection_start_indexZnoder   r   r   r
      s~   


Oz_Parser.parsec                 C   sr   |dkrt  S |dkr| }| | t|S |dkr t|S |dkr(t|S |dkr1t||S tdt| )zK
        Create and return a non-section node for the parse tree.

        !rl   r:   ro   >z(Invalid symbol for interpolation tag: %s)	r0   splitrk   rA   rI   rQ   rS   r   r   )r5   r   rm   r   r   r   r   r   r|   ^  s   

z _Parser._make_interpolation_nodec                 C   s>   |dkrt ||| j|||S |dkrt||S tdt| )zG
        Create and return a section node for the parse tree.

        rp   rq   z"Invalid symbol for section tag: %s)r]   rh   rZ   r   r   )r5   r   r   rm   r[   r   Zsection_end_indexr   r   r   r{   w  s   	
z_Parser._make_section_noder2   )r   r   r   rh   ri   rE   rj   rk   r
   r|   r{   r   r   r   r   r	      s    
mr	   r2   )__doc__r   Zpystacher   Zpystache.parsedr   rx   r   MrX   r
   r   r   r   r/   objectr0   rA   rI   rQ   rS   rZ   r]   r	   r   r   r   r   <module>   s$   
 
1