ó
    Ð]jF,  ã                  ó�   • S r SSKJr  SSKrSSKJr  SSK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)ÚCallable)ÚAnyÚ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   ó    ÚN/home/mande/repo/quber/.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  ó8   #   • 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   aX  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 %}

if-else::

    {% if var %}...{% else %}...{% 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S4U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  aw  [        U5      S:w  a  U R!                  SU
5        U(       a	  US   S:w  a  U R!                  SU
5        TR#                  5         TR                  S5        TR                  5         GM°  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MS  US   S#:X  a  UR                  S#5        S$n	GMr  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Mz  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< S035        M     TR                  S15        TR#                  5         [/        [0        [2        [4        [6        4   [0        S2[6        4   /[4        4   TR9                  5       S3   5      U l        g')5z 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   ÚelsezDon't understand elseéÿÿÿÿzMismatched elsezelse:Ú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_errorrD   Ú	_variableÚpopÚsubÚlstripÚreprr   r   Údictr'   r   rJ   Ú_render_function)r    ÚtextÚcontextsrm   Ú	vars_coderZ   Ú	ops_stackÚtokensÚsquashÚ	in_joinedÚtokenÚstartri   ÚexprÚwordsÚend_whatÚ
start_whatÚvar_namerY   r   s                     @@r   r"   ÚTemplite.__init__}   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™ VÓ+Ü˜u›:¨›?Ø ×.Ñ.Ð/FÈÔNÞ(¨I°b©M¸TÓ,AØ ×.Ñ.Ð/@À%ÔHØŸ™œØŸ™ gÔ.ØŸ™ŸØ˜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ñO öR Ø×ÑÐ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   Nrj   Ú(Ú)Ú.rW   c              3  ó8   #   • 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)rs   ru   rx   rp   r-   )r    rˆ   Úpipesr   ÚfuncÚdotsÚargss          r   ru   Ú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   rw   Ú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)rr   Úmatchrw   Úadd)r    ÚnameÚvars_sets      r   rx   Ú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}   rm   rn   r~   Ú_do_dots)r    rm   Ú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_dots1  s†   € ãˆCðÜ Ó+�ô ˜�‹Ù›’ñ ð ˆøô "ó ðØ!™J’EøÜ!¤8Ð,ó Ü,Ø,¨U©I°Q°s°eÐ<óàðûðúðús&   ‡1±
A.¼AÁA*ÁA%Á%A*Á*A.)r~   rp   rm   rq   )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   )rm   zdict[str, Any] | NonerM   r'   )r°   r   r˜   r'   rM   r   )r   r   r   r   r   r"   ru   rw   rx   r¨   r¦   r   r   r   r   rR   rR   N   s)   † ñ,ô\D
ôLô$7ô
ö
D÷r   rR   )r   Ú
__future__r   rr   Úcollections.abcr   Útypingr   r   r   Ú
ValueErrorr	   r   r   rR   r   r   r   Ú<module>r¸      sJ   ðñõ #ã 	Ý $ß &Ñ &ô	˜*ô 	ô	˜ô 	÷+ ñ + ÷\qò qr   