
    5jv                         S SK r S SKJr  S SKJrJr  S SKJrJr  SSK	J
r
   " S S\ R                  5      r " S	 S
5      r " S S\5      rS\S\S\\\4   4S jrSS\S\S\S\S\\\4   4
S jjrg)    N)	lru_cache)SetTuple)Environmentnodes   )cached_propertyc                   4    \ rS rSrSrSrSrS\\   4S jr	Sr
g)	OldStyleStringTemplate
   zstring.Template with extended validation capabilities

This template must be used directly or as a base for templates in lseg.data
JSON configuration file.
Default delimiter is '#'. Variable syntax: '#var' or '#{var}'.
#z(?a:[_a-z][_.|a-z0-9]*)returnc                     U R                   R                  U R                  5       Vs1 s H*  nUS   (       d  US   (       d  M  US   =(       d    US   iM,     sn$ s  snf )z.Get names of substitution variables in patternr      )patternfindalltemplate)selfmatch_tuples     Y/root/lseg-credit/backend/venv/lib/python3.13/site-packages/lseg/data/_tools/templates.pynamesOldStyleStringTemplate.names   s[      $||33DMMB
B1~Q -KN,k!n,B
 	
 
s   AA N)__name__
__module____qualname____firstlineno____doc__	delimiterbraceidpatternr   strr   __static_attributes__r       r   r   r   
   s#     I/N
s3x 
r#   r   c                       \ rS rSrSrS r\S 5       r\\	" S5      S\
R                  S\\   4S j5       5       rS	 r\S
 5       rS rS rSrg)StringTemplate   zJinja-based string templatec                 f    [        SSSSS9U l        S U R                  R                  S'   Xl        g )Nz{{z}}z#{})block_start_stringblock_end_stringvariable_start_stringvariable_end_stringc                 @    SR                  [        [        U 5      5      $ )Nz, )joinmaprepr)inps    r   <lambda>)StringTemplate.__init__.<locals>.<lambda>)   s    TYYs4~-Fr#   in)r   envfilterssource)r   r7   s     r   __init__StringTemplate.__init__!   s6    #!"& #	
 "Gr#   c                     U R                   $ N)r7   r   s    r   r   StringTemplate.template,   s    {{r#      noder   c           	        ^ [        5       nU 4/nU(       a  UR                  S5      tnm[        U[        R                  5      (       a  UR
                  /TQ7mO[[        U[        R                  5      (       a<  UR                  SR                  [        [        UR                  /TQ75      5      5        UR                  U4S jUR                  5        5       5        U(       a  M  U$ )Nr   .c              3   .   >#    U  H
  o/TQ7v   M     g 7fr;   r   ).0i_attrss     r   	<genexpr>4StringTemplate.get_vars_from_node.<locals>.<genexpr>;   s     L3Ka\&\3Ks   )setpop
isinstancer   GetattrattrNameaddr.   r/   r!   nameextenditer_child_nodes)r?   vars_set	iter_list_noderE   s       @r   get_vars_from_node!StringTemplate.get_vars_from_node0   s     5WI	&]]1-NEF%//**.v.E5::..SXXc#

/DV/D&EFGL53I3I3KLL i r#   c                 8    U R                  U R                  5      $ r;   )rU   _parsedr<   s    r   placeholdersStringTemplate.placeholders>   s    &&t||44r#   c                 L    U R                   R                  U R                  5      $ r;   )r5   parser7   r<   s    r   rX   StringTemplate._parsedA   s    xx~~dkk**r#   c                     U R                   $ r;   )rX   r<   s    r   validateStringTemplate.validateE   s    ||r#   c                 l    U R                   R                  U R                  5      R                  " S0 UD6$ )Nr   )r5   from_stringr7   render)r   kwargss     r   
substituteStringTemplate.substituteH   s)    xx##DKK077A&AAr#   )r5   r7   N)r   r   r   r   r   r8   propertyr   staticmethodr   r   Noder   r!   rU   rY   r	   rX   r_   re   r"   r   r#   r   r%   r%      sx    %	   s^
 
C 
  
5 + +Br#   r%   c                   F    \ rS rSrSr   SS\S\S\S\S\4
S jjrS	 rS
r	g)InvalidPlaceholderErrorL   z6Exception to display syntax errors in string templatesindextemplate_textlimitpaddingprefixc                 @    X0l         X@l        Xl        X l        XPl        g)aa  
Parameters
----------
index : int
    index of wrong placeholder start, get it from regex match
template_text
    original text template
limit : int
    maximum length of error message
padding : int
    padding around place where invalid placeholder starts in error message text
prefix : int
    prefix before error message, for additional information
N)ro   rp   rm   rn   rq   )r   rm   rn   ro   rp   rq   s         r   r8    InvalidPlaceholderError.__init__O   s    , 

*r#   c                 .   [        U R                  U R                  5      u  pU R                  R                  5       U   n[	        X0R
                  X R                  5      u  p4SR                  U R                   SUS-    SUS-    S3USX$-
  -  S-   /5      $ )N
z1Invalid placeholder in the template string: line r   z, col :-^)	index_to_line_and_colrm   rn   
splitlines"shorten_string_to_include_positionro   rp   r.   rq   )r   
line_index	col_indextarget_lineshifts        r   __str__InvalidPlaceholderError.__str__k   s     5djj$BTBT U
((335jA?ZZYbdpdpqyy;;-  "Q'vi!m_A?y()C/	
 	
r#   )rm   ro   rp   rq   rn   N)P   r    )
r   r   r   r   r   intr!   r8   r   r"   r   r#   r   rk   rk   L   sJ    @   	
  8
r#   rk   rm   target_stringr   c                     USU  R                  SS9nU(       d  gU [        SR                  USS 5      5      -
  n[        U5      S-
  nXC4$ )a  Convert position index in multiline string to line and column

Parameters
----------
index : int
    index of symbol in target string
target_string : str
    target string

Returns
-------
Tuple of line index and column index of given symbol, starting from zero
NT)keepends)r   r   r   r   )rz   lenr.   )rm   r   linesr}   r|   s        r   ry   ry   y   sX     &5!,,d,;EBGGE#2J/00IUaJ  r#   linero   posrp   c                     X#-   nU[        U 5      :  a  [        S5      e[        U 5      U::  a  U S4$ XA:  a  U SU S4$ [        XA-
  S-   S5      nXUS-    U4$ )a  Shorten string to given limit to include given position

Can be used when we need to display position in a string when screen width is
limited.

Parameters
----------
line : str
    target string
limit : int
    maximum length of resulting string
pos : int
    position in string that must be included in shortened string, starting from 0
padding
    number of symbols left and right of pos that also must be included

Returns
-------
Tuple of shortened string and number of symbols removed from the start
z,padding must be less than the length of liner   Nr   )r   
ValueErrormax)r   ro   r   rp   	cur_rightlefts         r   r{   r{      sv    * I#d)GHH
4yEQwFU|Qy 1$a(Dy1}%t++r#   )r   )string	functoolsr   typingr   r   jinja2r   r   _commonr	   Templater   r%   r   rk   r   r!   ry   r{   r   r#   r   <module>r      s       % $
V__ 
(+B +B\*
j *
Z! !S !U38_ !0,S , ,3 ,QT ,]bcfhkck]l ,r#   