o
    .d-                     @  sd  d Z ddlmZ ddlZ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
 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 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 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 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" 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' 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, dd'l!m-Z- dd(l!m.Z. dd)l!m/Z/ dd*l!m0Z0 dd+l!m1Z1 dd,l!m2Z2 dd-l!m3Z3 dd.l!m4Z4 dd/l!m5Z5 dd0l!m6Z6 dd1l!m7Z7 dd2l!m8Z8 dd3l!m9Z9 er9dd4l:m;Z; e<d5Z=e<d6Z>e<d7Z?e<d8Z@e<d9ZAd:ZBd;ZCd<e@ d=eA d>e@ d?ZDd<e? d@ZEdAe= d=e> d>e= dBZFe	eGeHeHf ZIddGdHZJddKdLZKddNdOZLddQdRZMddTdUZNddWdXZOddZd[ZPdd]d^ZQdd`daZRddbdcZSddgdhZTeUe(e)e$e-fZVddidjZWe)eEfe*eDfe7eFfe3dkfe'dlfe,dmfe$dnfe(eBfe.dofe5dpfe-dqfe4drfe#dsfe/dtfe6dufe+dvffZXeUe8e&e0e1e%e"e2gZYe(eWe7eNe,eOe'ePe0eKe8eJe&eJe"eMe%eLi	ZZe[dw\dxdy eXD ej]Z^ddddZ_dddZ`eTe`eZe.< dS )zJPatterns and parse functions common to multiple built-in expression types.    )annotationsN)TYPE_CHECKING)Callable)Iterator)Tuple)Union)LiquidSyntaxErrorBLANKEMPTY)FALSENIL)TRUE)Blank)Boolean)Empty)
Expression)FloatLiteral)
Identifier)IdentifierPath)IdentifierPathElement)IntegerLiteral)Nil)RangeLiteral)StringLiteral)to_int)TOKEN_BLANK)TOKEN_COMMA)	TOKEN_DOT)TOKEN_EMPTY)TOKEN_FALSE)TOKEN_FLOAT)TOKEN_IDENTIFIER)TOKEN_IDENTINDEX)TOKEN_IDENTSTRING)TOKEN_ILLEGAL)TOKEN_INTEGER)TOKEN_LBRACKET)TOKEN_LPAREN)TOKEN_NEWLINE)	TOKEN_NIL)
TOKEN_NULL)TOKEN_OR)TOKEN_RANGE)TOKEN_RBRACKET)TOKEN_RPAREN)
TOKEN_SKIP)TOKEN_STRING)
TOKEN_TRUE)reverse_operators)TokenStreamquotequoted
path_index
identquoteidentquotedz\w[\w\-]*\??z	\w[\w\-]*z	\[\s*(?P<z>[\"'])(?P<z	>.*?)(?P=z)\s*]z>\-?\d+)\s*](?P<)stream'TokenStream'returnr   c                 C  s   | j d tkr	tS tS )z=Read a boolean literal (true or false) from the token stream.   )currentr4   r   r   r>    rD   Q/var/www/Matress/matenv/lib/python3.10/site-packages/liquid/expressions/common.pyparse_booleanZ   s   rF   _r   c                 C     t S )z+Read a 'nil' keyword from the token stream.r   rG   rD   rD   rE   	parse_nila      rJ   r   c                 C  rH   )z-Read a 'empty' keyword from the token stream.r   rI   rD   rD   rE   parse_emptyf   rK   rL   r   c                 C  rH   )z-Read a 'blank' keyword from the token stream.r	   rI   rD   rD   rE   parse_blankk   rK   rM   r   c                 C  s   t | jd dS )z$Read a string from the token stream.   value)r   rB   rC   rD   rD   rE   parse_string_literalp   s   rQ   r   c                 C     t t| jd dS )z&Read an integer from the token stream.rN   rO   )r   r   rB   rC   rD   rD   rE   parse_integer_literalu      rS   r   c                 C  rR   )z#Read a float from the token stream.rN   rO   )r   floatrB   rC   rD   rD   rE   parse_float_literalz   rT   rV   r   c                 C  s   g }	 | j \}}}|tkr|t| nD|tkr#|tt| n6|tkr<|   |t|  |   | 	t
 n|tkrItd||d|tkrNn| | j  	 t|S |   q)zRead an identifier from the token stream.

    An identifier might be chained with dots and square brackets, and might contain
    more, possibly chained, identifiers within those brackets.
    Tzexpected an identifier, found linenum)rB   r$   appendr   r%   r   r)   
next_tokenparse_identifierexpectr0   r#   r   r    pushr   )r>   pathpostypvalrD   rD   rE   r[      s0   r[    Union[StringLiteral, Identifier]c                 C  s^   | j d }|ttfv rt| }|S |tkrt| }|S t||}d| }t|| j d d)zParse an expression from a stream of tokens.

    If the stream is not at a string or identifier expression, raise a syntax error.
    rA   z%expected identifier or string, found r   rW   )	rB   r$   r)   r[   r3   rQ   r5   getr   )r>   r`   expr_typmsgrD   rD   rE   parse_string_or_identifier   s   

rg   c                 C  s8   | j }t| }t|jdkrtd| d|d d|S )zParse an identifier from a stream of tokens.

    If the stream is not at an identifier or the identifier is chained, raise a syntax
    error.
    rA   zinvalid identifier ''r   rW   )rB   r[   lenr^   r   )r>   tokidentrD   rD   rE   parse_unchained_identifier   s
   rl   	parse_obj%Callable[['TokenStream'], Expression]'Callable[['TokenStream'], RangeLiteral]c                   s   d fdd}|S )	zBReturn a function that parses range expressions using _parse_obj_.r>   r?   r@   r   c                   s   |  t |   | jd tttfvr#td| jd d| jd d | }|   |  t |   | jd tttfvrNtd| jd d| jd d | }t	||}|   |  t
 |S )zRead a range literal from the token stream.

        A range literal can contain an identifier (possibly chained), an integer or a
        float as its start and stop values.
        rA   unexpected rN   z in range expressionr   rW   )r\   r*   rZ   rB   r$   r(   r#   r   r/   r   r1   )r>   startstoprd   rm   rD   rE   _parse_range_literal   s*   



z.make_parse_range.<locals>._parse_range_literalN)r>   r?   r@   r   rD   )rm   rt   rD   rs   rE   make_parse_range   s   'ru   c                 C  s   g }	 | j \}}}|tkr|t| n,|tkr#|tt| n|tkr<|   |t|  |   | 	t
 n|tkrA	 | jd tv rMt|  n	 t|S q)zParse an identifier from a stream of tokens.

    This is much like `parse_identifier`, but leaves the last ident
    token on the stream.
    TrA   )rB   r$   rY   r   r%   r   r)   rZ   _parse_common_identifierr\   r0   r    peek_IDENT_TOKENSnextr   )r>   r^   rG   _typerP   rD   rD   rE   rv      s&   
rv   z\.\.z-?\d+\.(?!\.)\d*z-?\d+\bz\.z\(z\)z\[],z\nz[ \t\r]+.|c                 c  s&    | ]\}}d | d| dV  qdS )r<   >r=   NrD   ).0namepatternrD   rD   rE   	<genexpr>G  s    
r   rA   rd   strrX   intIterator[Token]c                 c  s    t }t| D ]d}|j}|dusJ | }|d}|tkr'||v r'|}n;|tkr1|t}n1|t	kr=t}|t
}n%|tkrG|t}n|tkrP|d7 }q|tkrUq|tkrbtd||d||7 }|||fV  qdS )z(Yield tokens from a "common" expression.N
rA   rp   rW   )LITERAL_OR_IDENT_KEYWORDSLITERAL_OR_IDENT_REfinditer	lastgroupgroupcountr$   r%   GROUP_IDENTINDEXr&   GROUP_IDENTQUOTEDr3   GROUP_QUOTEDr+   r2   r'   r   )rd   rX   	_keywordsmatchkindrP   newlinesrD   rD   rE   tokenize_common_expressionN  s4   
r   r6   r   c              
   C  sN   z
t | jd  | W S  ty& } ztd| jd  | jd d|d}~ww )zParse a string, int, float, range, nil, true, false, blank, empty or identifier.

    Raises a `LiquidSyntaxError` if any other tokens are found.
    rA   z&expected a literal or variable, found rN   r   rW   N)LITERAL_OR_IDENT_MAPrB   KeyErrorr   )r>   errrD   rD   rE   parse_common_expressionm  s   r   )r>   r?   r@   r   )rG   r?   r@   r   )rG   r?   r@   r   )rG   r?   r@   r   )r>   r?   r@   r   )r>   r?   r@   r   )r>   r?   r@   r   )r>   r?   r@   r   )r>   r?   r@   rb   )rm   rn   r@   ro   )rA   )rd   r   rX   r   r@   r   )r>   r6   r@   r   )a__doc__
__future__r   resystypingr   r   r   r   r   liquid.exceptionsr   liquid.expressionr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   liquid.limitsr   liquid.tokenr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   liquid.expressions.streamr6   internGROUP_QUOTEr   r   GROUP_IDENTQUOTEr   IDENTIFIER_PATTERNASSIGN_IDENTIFIER_PATTERNIDENTSTRING_PATTERNIDENTINDEX_PATTERNSTRING_PATTERNr   r   TokenrF   rJ   rL   rM   rQ   rS   rV   r[   rg   rl   ru   	frozensetrx   rv   LITERAL_OR_IDENT_TOKEN_RULESr   r   compilejoinDOTALLr   r   r   rD   rD   rD   rE   <module>   s   













$

/



