ó
    àÅŸg8*  ã                  óˆ   • S r SSKJr  SSKrSSKJrJrJrJr   " S S\	5      r
 " S S\	5      r " S	 S
5      r " S S5      rg)zÅA simple Python template renderer, for a nano-subset of Django syntax.

For a detailed discussion of this code, see this chapter from 500 Lines:
http://aosabook.org/en/500L/a-template-engine.html

é    )ÚannotationsN)ÚAnyÚCallableÚNoReturnÚcastc                  ó   • \ rS rSrSrSrg)ÚTempliteSyntaxErroré   z*Raised when a template has a syntax error.© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚR/var/www/blue/EV-Temp_rev04/venv/lib/python3.13/site-packages/coverage/templite.pyr	   r	      s   † Ù4Úr   r	   c                  ó   • \ rS rSrSrSrg)ÚTempliteValueErroré   z7Raised when an expression won't evaluate in a template.r   Nr   r   r   r   r   r      s   † ÙAÚr   r   c                  óf   • \ rS rSrSrSSS jjrSS jrSS jrSS jrSr	SS jr
SS	 jrSS
 jrSrg)ÚCodeBuilderé    zBuild source code conveniently.c                ó   • / U l         Xl        g ©N©ÚcodeÚindent_level)ÚselfÚindents     r   Ú__init__ÚCodeBuilder.__init__#   s   € Ø-/ˆŒ	Ø"Õr   c                óF   • SR                  S U R                   5       5      $ )NÚ c              3  ó6   #   • U H  n[        U5      v •  M     g 7fr   )Ústr)Ú.0Úcs     r   Ú	<genexpr>Ú&CodeBuilder.__str__.<locals>.<genexpr>(   s   é € Ð1¡y !”s˜1—v�v¢yùó   ‚)Újoinr   ©r    s    r   Ú__str__ÚCodeBuilder.__str__'   s   € Ø�w‰wÑ1 t§y¢yÓ1Ó1Ð1r   c                óZ   • U R                   R                  SU R                  -  US/5        g)zgAdd a line of source to the code.

Indentation and newline will be added for you, don't provide them.

Ú Ú
N)r   Úextendr   )r    Úlines     r   Úadd_lineÚCodeBuilder.add_line*   s(   € ð 	�	‰	×Ñ˜# × 1Ñ 1Ñ1°4¸Ð>Õ?r   c                óf   • [        U R                  5      nU R                  R                  U5        U$ )z!Add a section, a sub-CodeBuilder.)r   r   r   Úappend)r    Úsections     r   Úadd_sectionÚCodeBuilder.add_section2   s)   € ä˜d×/Ñ/Ó0ˆØ�	‰	×Ñ˜Ô!Øˆr   é   c                óB   • U =R                   U R                  -  sl         g)z0Increase the current indent for following lines.N©r   ÚINDENT_STEPr.   s    r   r!   ÚCodeBuilder.indent:   ó   € à×Ò˜T×-Ñ-Ñ-Ör   c                óB   • U =R                   U R                  -  sl         g)z0Decrease the current indent for following lines.Nr?   r.   s    r   ÚdedentÚCodeBuilder.dedent>   rB   r   c                óZ   • U R                   S:X  d   e[        U 5      n0 n[        X5        U$ )z:Execute the code, and return a dict of globals it defines.r   )r   r'   Úexec)r    Úpython_sourceÚglobal_namespaces      r   Úget_globalsÚCodeBuilder.get_globalsB   s5   € ð × Ñ  AÓ%Ð%Ð%ä˜D›	ˆà+-ÐÜˆ]Ô-ØÐr   r   N)r   )r!   ÚintÚreturnÚNone)rM   r'   )r5   r'   rM   rN   )rM   r   ©rM   rN   )rM   údict[str, Any])r   r   r   r   r   r"   r/   r6   r;   r@   r!   rD   rJ   r   r   r   r   r   r       s0   † Ù)ö#ô2ô@ôð €Kô.ô.÷	 r   r   c                  óX   • \ rS rSrSrSS jrSS jrSS jrSS jrSSS jjr	SS	 jr
S
rg)ÚTempliteéN   a   A simple template renderer, for a nano-subset of Django syntax.

Supported constructs are extended variable access::

    {{var.modifier.modifier|filter|filter}}

loops::

    {% for var in list %}...{% endfor %}

and ifs::

    {% if var %}...{% endif %}

Comments are within curly-hash markers::

    {# This will be ignored #}

Lines between `{% joined %}` and `{% endjoined %}` will have lines stripped
and joined.  Be careful, this could join words together!

Any of these constructs can have a hyphen at the end (`-}}`, `-%}`, `-#}`),
which will collapse the white space following the tag.

Construct a Templite with the template text, then use `render` against a
dictionary context to create a finished string::

    templite = Templite('''
        <h1>Hello {{name|upper}}!</h1>
        {% for topic in topics %}
            <p>You are interested in {{topic}}.</p>
        {% endif %}
        ''',
        {"upper": str.upper},
    )
    text = templite.render({
        "name": "Ned",
        "topics": ["Python", "Geometry", "Juggling"],
    })

c           
     ó´	  ^^• 0 U l         U H  nU R                   R                  U5        M      [        5       U l        [        5       U l        [        5       mTR                  S5        TR                  5         TR                  5       nTR                  S5        TR                  S5        TR                  S5        TR                  S5        / mS0UU4S jjn/ n[        R                  " SU5      nS=p‰U GH  n
U
R                  S	5      (       Ga�  S
u  p¼U
S   S:H  nU(       a  SnU
R                  S5      (       a  MH  U
R                  S5      (       a7  U R                  X«U R                  5       5      nTR                  SU-  5        M•  U" 5         X«U R                  5       R                  5       nUS   S:X  ak  [        U5      S:w  a  U R!                  SU
5        UR                  S5        TR                  SU R                  US   5      -  5        TR                  5         GM0  US   S:X  aš  [        U5      S:w  d	  US   S:w  a  U R!                  SU
5        UR                  S5        U R#                  US   U R                  5        TR                  SUS    SU R                  US   5       S35        TR                  5         GMÓ  US   S:X  a  UR                  S5        Sn	GMò  US   R                  S 5      (       aˆ  [        U5      S:w  a  U R!                  S!U
5        US   SS" nU(       d  U R!                  S#U
5        UR%                  5       nUU:w  a  U R!                  S$U5        US:X  a  Sn	GM€  TR'                  5         GM“  U R!                  S%US   5        GM«  U	(       a'  [        R(                  " S&S'U
R                  5       5      n
OU(       a  U
R+                  5       n
U
(       d  GMú  TR                  [-        U
5      5        GM     U(       a  U R!                  S(US)   5        U" 5         U R                  U R                  -
   H  nUR                  S*U S+U< S,35        M     TR                  S-5        TR'                  5         [/        [0        [2        [4        [6        4   [0        S.[6        4   /[4        4   TR9                  5       S/   5      U l        g")1z Construct a Templite with the given `text`.

`contexts` are dictionaries of values to use for future renderings.
These are good for filters and global values.

z&def render_function(context, do_dots):zresult = []zappend_result = result.appendzextend_result = result.extendzto_str = strc                 óÂ   >• [        T 5      S:X  a  TR                  ST S   -  5        O2[        T 5      S:”  a#  TR                  SSR                  T 5      -  5        T SS2	 g)z%Force `buffered` to the code builder.é   zappend_result(%s)r   zextend_result([%s])ú, N)Úlenr6   r-   )Úbufferedr   s   €€r   Úflush_outputÚ'Templite.__init__.<locals>.flush_output”   sS   ø€ ä�8‹} Ó!Ø—‘Ð1°H¸Q±KÑ?Õ@Ü�X“ Ó"Ø—‘Ð3°d·i±iÀÓ6IÑIÔJØš‘r   z(?s)({{.*?}}|{%.*?%}|{#.*?#})FÚ{)é   éþÿÿÿéýÿÿÿÚ-z{#z{{z
to_str(%s)r   Úifr]   zDon't understand ifzif %s:rV   Úforr=   ÚinzDon't understand forzfor c_z in é   Ú:ÚjoinedTÚendzDon't understand endNzToo many endszMismatched end tagzDon't understand tagz\s*\n\s*r%   zUnmatched action tagéÿÿÿÿÚc_z = context[Ú]zreturn ''.join(result).Úrender_functionrO   )ÚcontextÚupdateÚsetÚall_varsÚ	loop_varsr   r6   r!   r;   ÚreÚsplitÚ
startswithÚ
_expr_codeÚstripr9   rX   Ú_syntax_errorÚ	_variableÚpoprD   ÚsubÚlstripÚreprr   r   Údictr'   r   rJ   Ú_render_function)r    ÚtextÚcontextsrl   Ú	vars_coderZ   Ú	ops_stackÚtokensÚsquashÚ	in_joinedÚtokenÚstartrg   ÚexprÚwordsÚend_whatÚ
start_whatÚvar_namerY   r   s                     @@r   r"   ÚTemplite.__init__x   s   ù€ ð ˆŒÛˆGØ�L‰L×Ñ Ö(ñ  ô #&£%ˆŒÜ#&£5ˆŒô ‹}ˆà�‰Ð>Ô?Ø�‰ŒØ×$Ñ$Ó&ˆ	Ø�‰�mÔ$Ø�‰Ð5Ô6Ø�‰Ð5Ô6Ø�‰�nÔ%à ˆ÷	ð 	ð ˆ	ô —’Ð:¸DÓAˆà"Ð"ˆäˆEØ×Ñ ×$Ò$Ø"‘
�Ø ™) sÑ*�ÞØ�Cà×#Ñ# D×)Ñ)áØ×%Ñ% d×+Ñ+àŸ?™?¨5°sÐ+;×+AÑ+AÓ+CÓD�DØ—O‘O L°4Ñ$7Ö8ñ !”Nà!¨Ð,×2Ñ2Ó4×:Ñ:Ó<�EØ˜Q‘x 4Ó'ä˜u›:¨›?Ø ×.Ñ.Ð/DÀeÔLØ!×(Ñ(¨Ô.ØŸ™ h°·±ÀÀqÁÓ1JÑ&JÔKØŸ™ŸØ˜q™ UÓ*ä˜u›:¨›?¨e°A©h¸$Ó.>Ø ×.Ñ.Ð/EÀuÔMØ!×(Ñ(¨Ô/ØŸ™ u¨Q¡x°·±Ô@ØŸ™Ø$ U¨1¡X J¨d°4·?±?À5ÈÁ8Ó3LÐ2MÈQÐOôð Ÿ™ŸØ˜q™ XÓ-Ø!×(Ñ(¨Ô2Ø$(›	Ø˜q™×,Ñ,¨U×3Ñ3ä˜u›:¨›?Ø ×.Ñ.Ð/EÀuÔMØ#(¨¡8¨A¨B <˜Þ(Ø ×.Ñ.¨ÀÔFØ%.§]¡]£_˜
Ø%¨Ó1Ø ×.Ñ.Ð/CÀXÔNØ# xÓ/Ø(-›Ià ŸK™KŸMà×*Ñ*Ð+AÀ5ÈÁ8×Lö ÜŸFšF ;°°E·K±K³MÓB‘EÞØ!ŸL™L›N�Eß‘5Ø—O‘O¤D¨£K×0ñ öB Ø×ÑÐ5°yÀ±}ÔEáŒàŸ™¨¯©Ô6ˆHØ×Ñ  H :¨[¸¹ÀAÐFÖGñ 7ð 	�‰Ð.Ô/Ø�‰ŒÜ $ÜÜ”cœ3�h‘¤¨#¬s¨(Ñ!3Ð4Üðñð ×ÑÓÐ0Ñ1ó!
ˆÕr   c                ó¢  • SU;   aW  UR                  S5      nU R                  US   5      nUSS  H'  nU R                  X@R                  5        SU SU S3nM)     U$ SU;   aK  UR                  S5      nU R                  US   5      nS	R	                  S
 USS  5       5      nSU S	U S3nU$ U R                  XR                  5        SU-  nU$ )z(Generate a Python expression for `expr`.Ú|r   rV   Nri   Ú(Ú)Ú.rW   c              3  ó6   #   • U H  n[        U5      v •  M     g 7fr   )r{   )r(   Úds     r   r*   Ú&Templite._expr_code.<locals>.<genexpr>  s   é € Ð7©h¨œT !ŸW˜Wªhùr,   zdo_dots(zc_%s)rr   rt   rw   ro   r-   )r    r‡   Úpipesr   ÚfuncÚdotsÚargss          r   rt   ÚTemplite._expr_codeö   sà   € à�$‹;Ø—J‘J˜s“OˆEØ—?‘? 5¨¡8Ó,ˆDØ˜a˜b›	�Ø—‘˜t§]¡]Ô3Ø˜D˜6  4 &¨Ð*’ñ "ð ˆð �D‹[Ø—:‘:˜c“?ˆDØ—?‘? 4¨¡7Ó+ˆDØ—9‘9Ñ7¨d°1°2©hÓ7Ó7ˆDØ˜d˜V 2 d V¨1Ð-ˆDð ˆð �N‰N˜4§¡Ô/Ø˜D‘=ˆDØˆr   c                ó$   • [        U SU< 35      e)z6Raise a syntax error using `msg`, and showing `thing`.z: )r	   )r    ÚmsgÚthings      r   rv   ÚTemplite._syntax_error  s   € ä! S E¨¨E©9Ð"5Ó6Ð6r   c                ó‚   • [         R                  " SU5      (       d  U R                  SU5        UR                  U5        g)z˜Track that `name` is used as a variable.

Adds the name to `vars_set`, a set of variable names.

Raises an syntax error if `name` is not a valid name.

z[_a-zA-Z][_a-zA-Z0-9]*$zNot a valid nameN)rq   Úmatchrv   Úadd)r    ÚnameÚvars_sets      r   rw   ÚTemplite._variable  s3   € ô �xŠxÐ2°D×9Ñ9Ø×ÑÐ1°4Ô8Ø�‰�TÕr   Nc                ó’   • [        U R                  5      nU(       a  UR                  U5        U R                  X R                  5      $ )zrRender this template by applying it to `context`.

`context` is a dictionary of values to use in this rendering.

)r|   rl   rm   r}   Ú_do_dots)r    rl   Úrender_contexts      r   ÚrenderÚTemplite.render  s8   € ô ˜dŸl™lÓ+ˆÞØ×!Ñ! 'Ô*Ø×$Ñ$ ^·]±]ÓCÐCr   c           	     óâ   • U H(  n [        X5      n[        U5      (       d  M!  U" 5       nM*     U$ ! [         a3     X   n N0! [        [        4 a  n[	        SU< SU 35      UeSnAff = ff = f)z(Evaluate dotted expressions at run-time.zCouldn't evaluate r‘   N)ÚgetattrÚAttributeErrorÚ	TypeErrorÚKeyErrorr   Úcallable)r    Úvaluer—   ÚdotÚexcs        r   r¥   ÚTemplite._do_dots$  s†   € ãˆCðÜ Ó+�ô ˜�‹Ù›’ñ ð ˆøô "ó ðØ!™J’EøÜ!¤8Ð,ó Ü,Ø,¨U©I°Q°s°eÐ<óàðûðúðús&   ‡1±
A.¼AÁA*ÁA%Á%A*Á*A.)r}   ro   rl   rp   )r~   r'   r   rP   rM   rN   )r‡   r'   rM   r'   )r›   r'   rœ   r   rM   r   )r¡   r'   r¢   zset[str]rM   rN   r   )rl   zdict[str, Any] | NonerM   r'   )r¯   r   r—   r'   rM   r   )r   r   r   r   r   r"   rt   rv   rw   r§   r¥   r   r   r   r   rR   rR   N   s)   † ñ(ôR|
ô|ô$7ô
ö
D÷r   rR   )r   Ú
__future__r   rq   Útypingr   r   r   r   Ú
ValueErrorr	   r   r   rR   r   r   r   Ú<module>r¶      sK   ðñõ #ã 	÷ó ô
	˜*ô 	ô
	˜ô 	÷
+ ñ + ÷\dò dr   