Ë
    oPêjV,  ã                  ó�   — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	  G d„ de
«      Z G d„ d	e
«      Z G d
„ d«      Z G d„ d«      Zy)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                  ó   — e Zd ZdZy)ÚTempliteSyntaxErrorz*Raised when a template has a syntax error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úV/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/coverage/templite.pyr	   r	      s   „ Ú4r   r	   c                  ó   — e Zd ZdZy)ÚTempliteValueErrorz7Raised when an expression won't evaluate in a template.Nr
   r   r   r   r   r      s   „ ÚAr   r   c                  óN   — e Zd ZdZddd„Zdd„Zdd„Zdd„ZdZdd„Z	dd„Z
dd	„Zy
)ÚCodeBuilderzBuild source code conveniently.c                ó    — g | _         || _        y ©N)ÚcodeÚindent_level)ÚselfÚindents     r   Ú__init__zCodeBuilder.__init__!   s   € Ø-/ˆŒ	Ø"ˆÕr   c                óF   — dj                  d„ | j                  D «       «      S )NÚ c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   )Ústr)Ú.0Úcs     r   ú	<genexpr>z&CodeBuilder.__str__.<locals>.<genexpr>&   s   è ø€ Ò1 !”s˜1—vÑ1ùó   ‚)Újoinr   ©r   s    r   Ú__str__zCodeBuilder.__str__%   s   € Ø�w‰wÑ1 t§y¡yÔ1Ó1Ð1r   c                óZ   — | j                   j                  d| j                  z  |dg«       y)zwAdd 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_linezCodeBuilder.add_line(   s(   € ð 	�	‰	×Ñ˜# × 1Ñ 1Ñ1°4¸Ð>Õ?r   c                óf   — t        | j                  «      }| j                  j                  |«       |S )z!Add a section, a sub-CodeBuilder.)r   r   r   Úappend)r   Úsections     r   Úadd_sectionzCodeBuilder.add_section0   s)   € ä˜d×/Ñ/Ó0ˆØ�	‰	×Ñ˜Ô!Øˆr   é   c                óB   — | xj                   | j                  z  c_         y)z0Increase the current indent for following lines.N©r   ÚINDENT_STEPr&   s    r   r   zCodeBuilder.indent8   ó   € à×Ò˜T×-Ñ-Ñ-Ör   c                óB   — | xj                   | j                  z  c_         y)z0Decrease the current indent for following lines.Nr4   r&   s    r   ÚdedentzCodeBuilder.dedent<   r6   r   c                óZ   — | j                   dk(  sJ ‚t        | «      }i }t        ||«       |S )z:Execute the code, and return a dict of globals it defines.r   )r   r    Úexec)r   Úpython_sourceÚglobal_namespaces      r   Úget_globalszCodeBuilder.get_globals@   s8   € ð × Ñ  AÒ%Ð%Ð%ä˜D›	ˆà+-ÐÜˆ]Ð,Ô-ØÐr   N)r   )r   ÚintÚreturnÚNone)r?   r    )r,   r    r?   r@   )r?   r   ©r?   r@   )r?   údict[str, Any])r   r   r   r   r   r'   r-   r1   r5   r   r8   r=   r   r   r   r   r      s0   „ Ù)ô#ó2ó@óð €Kó.ó.ô	 r   r   c                  óB   — e Zd ZdZd	d„Zd
d„Zdd„Zdd„Zddd„Zdd„Z	y)ÚTempliteaÌ  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           
     ó
  ‡‡— i | _         |D ]  }| j                   j                  |«       Œ t        «       | _        t        «       | _        t        «       Š‰j                  d«       ‰j                  «        ‰j                  «       }‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       g Šd4ˆˆfd„}g }t        j                  d|«      }dx}}	|D �]M  }
|
j                  d	«      �ràd
\  }}|
d   dk(  }|rd}|
j                  d«      rŒ9|
j                  d«      r7| j                  |
|| j                  «       «      }‰j                  d|z  «       Œ� |«        |
|| j                  «       j                  «       }|d   dk(  rit        |«      dk7  r| j!                  d|
«       |j                  d«       ‰j                  d| j                  |d   «      z  «       ‰j                  «        �Œ|d   dk(  rot        |«      dk7  r| j!                  d|
«       |r|d   dk7  r| j!                  d|
«       ‰j#                  «        ‰j                  d«       ‰j                  «        �Œ‘|d   dk(  r—t        |«      dk7  s|d   dk7  r| j!                  d|
«       |j                  d«       | j%                  |d   | j                  «       ‰j                  d|d   › d | j                  |d!   «      › d"�«       ‰j                  «        �Œ0|d   d#k(  r|j                  d#«       d$}	�ŒM|d   j                  d%«      r~t        |«      dk7  r| j!                  d&|
«       |d   d!d' }|s| j!                  d(|
«       |j'                  «       }||k7  r| j!                  d)|«       |d#k(  rd}	�ŒÍ‰j#                  «        �Œß| j!                  d*|d   «       �Œö|	r&t        j(                  d+d,|
j                  «       «      }
n|r|
j+                  «       }
|
s�Œ4‰j                  t-        |
«      «       �ŒP |r| j!                  d-|d   «        |«        | j                  | j                  z
  D ]  }|j                  d.|› d/|›d0�«       Œ ‰j                  d1«       ‰j#                  «        t/        t0        t2        t4        t6        f   t0        d2t6        f   gt4        f   ‰j9                  «       d3   «      | _        y')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        ‰ «      dk(  r‰j                  d‰ d   z  «       n1t        ‰ «      dkD  r#‰j                  ddj                  ‰ «      z  «       ‰ dd…= y)z%Force `buffered` to the code builder.é   zappend_result(%s)r   zextend_result([%s])ú, N)Úlenr-   r%   )Úbufferedr   s   €€r   Úflush_outputz'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   ÚifrM   zDon't understand ifzif %s:rG   ÚelsezDon't understand elseéÿÿÿÿzMismatched elsezelse:Úforr2   Ú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_functionrA   )ÚcontextÚupdateÚsetÚall_varsÚ	loop_varsr   r-   r   r1   ÚreÚsplitÚ
startswithÚ
_expr_codeÚstripr/   rI   Ú_syntax_errorr8   Ú	_variableÚpopÚsubÚlstripÚreprr   r   Údictr    r   r=   Ú_render_function)r   ÚtextÚcontextsr]   Ú	vars_coderK   Ú	ops_stackÚtokensÚsquashÚ	in_joinedÚtokenÚstartrY   ÚexprÚwordsÚend_whatÚ
start_whatÚvar_namerJ   r   s                     @@r   r   zTemplite.__init__{   s�  ù€ ð ˆŒØò 	)ˆGØ�L‰L×Ñ Õ(ð	)ô #&£%ˆŒÜ#&£5ˆŒô ‹}ˆà�‰Ð>Ô?Ø�‰ŒØ×$Ñ$Ó&ˆ	Ø�‰�mÔ$Ø�‰Ð5Ô6Ø�‰Ð5Ô6Ø�‰�nÔ%à ˆö	ð ˆ	ô —‘Ð:¸DÓAˆà"Ð"ˆ�àó G	1ˆEØ×Ñ Õ$Ø"‘
��sØ ™) 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ä˜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ÛØ—O‘O¤D¨£KÖ0ðOG	1ñR Ø×ÑÐ5°yÀ±}ÔEáŒàŸ™¨¯©Ñ6ò 	HˆHØ×Ñ  H :¨[¸¸ÀAÐFÕGð	Hð 	�‰Ð.Ô/Ø�‰ŒÜ $ÜÜ”cœ3�h‘¤¨#¬s¨(Ñ!3Ð4Üðñð ×ÑÓÐ0Ñ1ó!
ˆÕr   c                óš  — d|v rV|j                  d«      }| j                  |d   «      }|dd D ]'  }| j                  || j                  «       d|› d|› d�}Œ) |S d|v rK|j                  d«      }| j                  |d   «      }d	j	                  d
„ |dd D «       «      }d|› d	|› d�}|S | j                  || j                  «       d|z  }|S )z(Generate a Python expression for `expr`.ú|r   rG   NrZ   ú(ú)ú.rH   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   )rl   )r!   Úds     r   r#   z&Templite._expr_code.<locals>.<genexpr>  s   è ø€ Ò7¨œT !ŸWÑ7ùr$   zdo_dots(zc_%s)rc   re   rh   r`   r%   )r   rx   Úpipesr   ÚfuncÚdotsÚargss          r   re   zTemplite._expr_code  sé   € à�$‰;Ø—J‘J˜s“OˆEØ—?‘? 5¨¡8Ó,ˆDØ˜a˜b˜	ò +�Ø—‘˜t 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                ó"   — t        |› d|›�«      ‚)z6Raise a syntax error using `msg`, and showing `thing`.z: )r	   )r   ÚmsgÚthings      r   rg   zTemplite._syntax_error  s   € ä! S E¨¨E¨9Ð"5Ó6Ð6r   c                óv   — t        j                  d|«      s| j                  d|«       |j                  |«       y)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)rb   Ú	fullmatchrg   Úadd)r   ÚnameÚvars_sets      r   rh   zTemplite._variable  s0   € ô �|‰|Ð5°tÔ<Ø×ÑÐ1°4Ô8Ø�‰�TÕr   Nc                óŠ   — t        | j                  «      }|r|j                  |«       | j                  || j                  «      S )z‚Render this template by applying it to `context`.

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

        )rm   r]   r^   rn   Ú_do_dots)r   r]   Úrender_contexts      r   ÚrenderzTemplite.render#  s:   € ô ˜dŸl™lÓ+ˆÙØ×!Ñ! 'Ô*Ø×$Ñ$ ^°T·]±]ÓCÐCr   c           	     óÒ   — |D ]"  }	 t        ||«      }t        |«      sŒ |«       }Œ$ |S # t        $ r3 	 ||   }n)# t        t        f$ r}t	        d|›d|› �«      |‚d}~ww xY wY ŒRw xY w)z(Evaluate dotted expressions at run-time.zCouldn't evaluate r�   N)ÚgetattrÚAttributeErrorÚ	TypeErrorÚKeyErrorr   Úcallable)r   Úvaluer†   ÚdotÚexcs        r   r‘   zTemplite._do_dots/  s’   € àò 	 ˆCðÜ  sÓ+�ô ˜�Ù›‘ð	 ð ˆøô "ò ðØ! #™J‘EøÜ!¤8Ð,ò Ü,Ø,¨U¨I°Q°s°eÐ<óàðûðúñ ðús/   ‡*ª	A&´:¹A&ºA Á	AÁA Á A&Á%A&)ro   r    rp   rB   r?   r@   )rx   r    r?   r    )r‰   r    rŠ   r   r?   r   )rŽ   r    r�   zset[str]r?   r@   r   )r]   zdict[str, Any] | Noner?   r    )rš   r   r†   r    r?   r   )
r   r   r   r   r   re   rg   rh   r“   r‘   r   r   r   rD   rD   L   s)   „ ñ,ó\D
óLó$7ó
ô
Dôr   rD   )r   Ú
__future__r   rb   Úcollections.abcr   Útypingr   r   r   Ú
ValueErrorr	   r   r   rD   r   r   r   ú<module>r¡      sL   ðñõ #ã 	Ý $ß &Ñ &ô5˜*ô 5ôB˜ô B÷+ ñ + ÷\qò qr   