§
    0›jF,  ã                  óª   — 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dS )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dS )ÚTempliteSyntaxErrorz*Raised when a template has a syntax error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úP/home/lighthouse/health/venv/lib64/python3.11/site-packages/coverage/templite.pyr	   r	      s   € € € € € Ø4Ð4à€Dr   r	   c                  ó   — e Zd ZdZdS )ÚTempliteValueErrorz7Raised when an expression won't evaluate in a template.Nr
   r   r   r   r   r      s   € € € € € ØAÐAà€Dr   r   c                  óP   — 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dS )ÚCodeBuilderzBuild source code conveniently.r   ÚindentÚintÚreturnÚNonec                ó"   — g | _         || _        d S ©N)ÚcodeÚindent_level)Úselfr   s     r   Ú__init__zCodeBuilder.__init__#   s   € Ø-/ˆŒ	Ø"ˆÔÐÐr   Ústrc                óJ   — d                      d„ | j        D ¦   «         ¦  «        S )NÚ c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )r    )Ú.0Úcs     r   ú	<genexpr>z&CodeBuilder.__str__.<locals>.<genexpr>(   s(   è è € Ð1Ð1 !•s˜1‘v”vÐ1Ð1Ð1Ð1Ð1Ð1r   )Újoinr   ©r   s    r   Ú__str__zCodeBuilder.__str__'   s%   € Ø�wŠwÐ1Ð1 t¤yÐ1Ñ1Ô1Ñ1Ô1Ð1r   Úlinec                óP   — | j                              d| j        z  |dg¦  «         dS )zwAdd a line of source to the code.

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

        ú ú
N)r   Úextendr   )r   r*   s     r   Úadd_linezCodeBuilder.add_line*   s/   € ð 	Œ	×Ò˜# Ô 1Ñ1°4¸Ð>Ñ?Ô?Ð?Ð?Ð?r   c                ób   — t          | j        ¦  «        }| j                             |¦  «         |S )z!Add a section, a sub-CodeBuilder.)r   r   r   Úappend)r   Úsections     r   Úadd_sectionzCodeBuilder.add_section2   s-   € å˜dÔ/Ñ0Ô0ˆØŒ	×Ò˜Ñ!Ô!Ð!Øˆr   é   c                ó0   — | xj         | j        z  c_         dS )z0Increase the current indent for following lines.N©r   ÚINDENT_STEPr(   s    r   r   zCodeBuilder.indent:   ó   € àÐÔ˜TÔ-Ñ-ÐÔÐÐr   c                ó0   — | xj         | j        z  c_         dS )z0Decrease the current indent for following lines.Nr6   r(   s    r   ÚdedentzCodeBuilder.dedent>   r8   r   údict[str, Any]c                ób   — | 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_globalsB   s@   € ð Ô  AÒ%Ð%Ð%Ð%å˜D™	œ	ˆà+-ÐÝˆ]Ð,Ñ-Ô-Ð-ØÐr   N)r   )r   r   r   r   )r   r    )r*   r    r   r   )r   r   ©r   r   )r   r;   )r   r   r   r   r   r)   r/   r3   r7   r   r:   r@   r   r   r   r   r       s¶   € € € € € Ø)Ð)ð#ð #ð #ð #ð #ð2ð 2ð 2ð 2ð@ð @ð @ð @ðð ð ð ð €Kð.ð .ð .ð .ð.ð .ð .ð .ð	 ð 	 ð 	 ð 	 ð 	 ð 	 r   r   c                  óD   — 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	dS )"Ú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"],
        })

    Útextr    Úcontextsr;   r   r   c           
     ó^  ‡‡— i | _         |D ]}| j                              |¦  «         Œt          ¦   «         | _        t          ¦   «         | _        t          ¦   «         Š‰                     d¦  «         ‰                     ¦   «          ‰                     ¦   «         }‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         g Šd6ˆˆfd„}g }t          j
        d	|¦  «        }d
x}}	|D �].}
|
                     d¦  «        �r°d\  }}|
d         dk    }|rd}|
                     d¦  «        rŒD|
                     d¦  «        rH|                      |
||…                              ¦   «         ¦  «        }‰                     d|z  ¦  «         Œ¡ |¦   «          |
||…                              ¦   «          
                    ¦   «         }|d         dk    r…t          |¦  «        dk    r|                      d|
¦  «         |                     d¦  «         ‰                     d|                      |d         ¦  «        z  ¦  «         ‰                     ¦   «          �Œj|d         dk    rŒt          |¦  «        dk    r|                      d|
¦  «         |r|d         dk    r|                      d|
¦  «         ‰                     ¦   «          ‰                     d¦  «         ‰                     ¦   «          �Œ|d         dk    r¼t          |¦  «        dk    s|d         dk    r|                      d |
¦  «         |                     d¦  «         |                      |d         | j        ¦  «         ‰                     d!|d         › d"|                      |d#         ¦  «        › d$�¦  «         ‰                     ¦   «          �ŒÊ|d         d%k    r|                     d%¦  «         d&}	�Œï|d                              d'¦  «        r¡t          |¦  «        dk    r|                      d(|
¦  «         |d         d#d)…         }|s|                      d*|
¦  «         |                     ¦   «         }||k    r|                      d+|¦  «         |d%k    rd
}	�Œ•‰                     ¦   «          �Œ«|                      d,|d         ¦  «         �ŒÉ|	r)t          j        d-d.|
                     ¦   «         ¦  «        }
n|r|
                     ¦   «         }
|
r"‰                     t-          |
¦  «        ¦  «         �Œ0|r|                      d/|d         ¦  «          |¦   «          | j        | j        z
  D ]}|                     d0|› d1|›d2�¦  «         Œ‰                     d3¦  «         ‰                     ¦   «          t/          t0          t2          t4          t6          f         t0          d4t6          f         gt4          f         ‰                     ¦   «         d5         ¦  «        | _        d)S )7z¸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 = strr   r   c                 óò   •— t          ‰ ¦  «        dk    r‰                     d‰ d         z  ¦  «         n>t          ‰ ¦  «        dk    r+‰                     dd                     ‰ ¦  «        z  ¦  «         ‰ dd…= dS )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™   sw   ø€ å�8‰}Œ} Ò!Ð!Ø—’Ð1°H¸Q´KÑ?Ñ@Ô@Ð@Ð@Ý�X‘” Ò"Ð"Ø—’Ð3°d·i²iÀÑ6IÔ6IÑIÑJÔJÐJØ˜˜˜���r   z(?s)({{.*?}}|{%.*?%}|{#.*?#})FÚ{)é   éþÿÿÿéýÿÿÿú-z{#z{{z
to_str(%s)r   ÚifrN   zDon't understand ifzif %s:rH   ÚelsezDon't understand elseéÿÿÿÿzMismatched elsezelse:Úforr4   Ú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   r3   ÚreÚsplitÚ
startswithÚ
_expr_codeÚstripr1   rJ   Ú_syntax_errorr:   Ú	_variableÚpopÚsubÚlstripÚreprr   r   Údictr    r   r@   Ú_render_function)r   rD   rE   r^   Ú	vars_coderL   Ú	ops_stackÚtokensÚsquashÚ	in_joinedÚtokenÚstartrZ   ÚexprÚwordsÚend_whatÚ
start_whatÚvar_namerK   r   s                     @@r   r   zTemplite.__init__}   s2  øø€ ð ˆŒØð 	)ð 	)ˆGØŒL×Ò Ñ(Ô(Ð(Ð(å"%¡%¤%ˆŒÝ#&¡5¤5ˆŒõ ‰}Œ}ˆà�ŠÐ>Ñ?Ô?Ð?Ø�Š‰ŒˆØ×$Ò$Ñ&Ô&ˆ	Ø�Š�mÑ$Ô$Ð$Ø�ŠÐ5Ñ6Ô6Ð6Ø�ŠÐ5Ñ6Ô6Ð6Ø�Š�nÑ%Ô%Ð%à ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ	õ ”Ð:¸DÑAÔAˆà"Ð"ˆ�àð G	1ñ G	1ˆEØ×Ò Ñ$Ô$ñ F1Ø"‘
��sØ œ) sÒ*�Øð Ø�Cà×#Ò# DÑ)Ô)ð 8MàØ×%Ò% dÑ+Ô+ð 5MàŸ?š?¨5°°s°Ô+;×+AÒ+AÑ+CÔ+CÑDÔD�DØ—O’O L°4Ñ$7Ñ8Ô8Ð8Ð8ð !�L‘N”N�Nà! %¨ )Ô,×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<�EØ˜Q”x 4Ò'Ð'å˜u™:œ:¨š?˜?Ø ×.Ò.Ð/DÀeÑLÔLÐLØ!×(Ò(¨Ñ.Ô.Ð.ØŸš h°·²ÀÀqÄÑ1JÔ1JÑ&JÑKÔKÐKØŸš™œ˜™Ø˜qœ VÒ+Ð+Ý˜u™:œ:¨š?˜?Ø ×.Ò.Ð/FÈÑNÔNÐNØ(ð I¨I°b¬M¸TÒ,AÐ,AØ ×.Ò.Ð/@À%ÑHÔHÐHØŸš™œ˜ØŸš gÑ.Ô.Ð.ØŸš™œ˜™Ø˜qœ UÒ*Ð*å˜u™:œ:¨š?˜?¨e°A¬h¸$Ò.>Ð.>Ø ×.Ò.Ð/EÀuÑMÔMÐMØ!×(Ò(¨Ñ/Ô/Ð/ØŸš u¨Q¤x°´Ñ@Ô@Ð@ØŸšØO U¨1¤XÐOÐO°4·?²?À5ÈÄ8Ñ3LÔ3LÐOÐOÐOñô ð ð Ÿš™œ˜™Ø˜qœ XÒ-Ð-Ø!×(Ò(¨Ñ2Ô2Ð2Ø$(˜	™	Ø˜qœ×,Ò,¨UÑ3Ô3ð Må˜u™:œ:¨š?˜?Ø ×.Ò.Ð/EÀuÑMÔMÐMØ#(¨¤8¨A¨B¨B¤<˜Ø(ð GØ ×.Ò.¨ÀÑFÔFÐFØ%.§]¢]¡_¤_˜
Ø%¨Ò1Ð1Ø ×.Ò.Ð/CÀXÑNÔNÐNØ# xÒ/Ð/Ø(-˜I™Ià ŸKšK™MœM˜M™Mà×*Ò*Ð+AÀ5ÈÄ8ÑLÔLÐLÑLð ð +ÝœF ;°°E·K²K±M´MÑBÔB�E�EØð +Ø!ŸLšL™NœN�EØð 1Ø—O’O¥D¨¡K¤KÑ0Ô0Ð0ùàð 	FØ×ÒÐ5°yÀ´}ÑEÔEÐEàˆ‰Œˆàœ¨¬Ñ6ð 	Hð 	HˆHØ×ÒÐF HÐFÐF¸ÐFÐFÐFÑGÔGÐGÐGà�ŠÐ.Ñ/Ô/Ð/Ø�Š‰ŒˆÝ $ÝÝ•c�3�h”¥¨#­s¨(Ô!3Ð4Ýðôð ×ÒÑÔÐ0Ô1ñ!
ô !
ˆÔÐÐr   rw   c                óÜ  — d|v rb|                      d¦  «        }|                      |d         ¦  «        }|dd…         D ]&}|                      || j        ¦  «         d|› d|› d�}Œ'n…d|v ra|                      d¦  «        }|                      |d         ¦  «        }d	                     d
„ |dd…         D ¦   «         ¦  «        }d|› d	|› d�}n |                      || j        ¦  «         d|z  }|S )z(Generate a Python expression for `expr`.ú|r   rH   Nr[   ú(ú)ú.rI   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )rm   )r$   Úds     r   r&   z&Templite._expr_code.<locals>.<genexpr>  s(   è è € Ð7Ð7¨�T !™WœWÐ7Ð7Ð7Ð7Ð7Ð7r   zdo_dots(zc_%s)rd   rf   ri   ra   r'   )r   rw   Úpipesr   ÚfuncÚdotsÚargss          r   rf   zTemplite._expr_code  s  € à�$ˆ;ˆ;Ø—J’J˜s‘O”OˆEØ—?’? 5¨¤8Ñ,Ô,ˆDØ˜a˜b˜bœ	ð +ð +�Ø—’˜t T¤]Ñ3Ô3Ð3Ø*˜DÐ*Ð* 4Ð*Ð*Ð*��ð+ð �Dˆ[ˆ[Ø—:’:˜c‘?”?ˆDØ—?’? 4¨¤7Ñ+Ô+ˆDØ—9’9Ð7Ð7¨d°1°2°2¬hÐ7Ñ7Ô7Ñ7Ô7ˆDØ-˜dÐ-Ð- dÐ-Ð-Ð-ˆDˆDà�NŠN˜4 ¤Ñ/Ô/Ð/Ø˜D‘=ˆDØˆr   ÚmsgÚthingr   r   c                ó*   — t          |› d|›�¦  «        ‚)z6Raise a syntax error using `msg`, and showing `thing`.z: )r	   )r   r‡   rˆ   s      r   rh   zTemplite._syntax_error  s   € å! SÐ"5Ð"5¨EÐ"5Ð"5Ñ6Ô6Ð6r   ÚnameÚvars_setúset[str]c                ó†   — t          j        d|¦  «        s|                      d|¦  «         |                     |¦  «         dS )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)rc   Úmatchrh   Úadd)r   rŠ   r‹   s      r   ri   zTemplite._variable  sH   € õ ŒxÐ2°DÑ9Ô9ð 	9Ø×ÒÐ1°4Ñ8Ô8Ð8Ø�Š�TÑÔÐÐÐr   Nr^   údict[str, Any] | Nonec                óŽ   — t          | j        ¦  «        }|r|                     |¦  «         |                      || j        ¦  «        S )z‚Render this template by applying it to `context`.

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

        )rn   r^   r_   ro   Ú_do_dots)r   r^   Úrender_contexts      r   ÚrenderzTemplite.render%  sG   € õ ˜dœlÑ+Ô+ˆØð 	+Ø×!Ò! 'Ñ*Ô*Ð*Ø×$Ò$ ^°T´]ÑCÔCÐCr   Úvaluer…   c           	     óø   — |D ]v}	 t          ||¦  «        }nI# t          $ r< 	 ||         }n/# t          t          f$ r}t	          d|›d|› �¦  «        |‚d}~ww xY wY nw xY wt          |¦  «        r
 |¦   «         }Œw|S )z(Evaluate dotted expressions at run-time.zCouldn't evaluate r€   N)ÚgetattrÚAttributeErrorÚ	TypeErrorÚKeyErrorr   Úcallable)r   r•   r…   ÚdotÚexcs        r   r’   zTemplite._do_dots1  sÆ   € àð 	 ð 	 ˆCðÝ  sÑ+Ô+��øÝ!ð ð ð ðØ! #œJ�E�EøÝ!¥8Ð,ð ð ð Ý,Ø<¨UÐ<Ð<°sÐ<Ð<ñô àðøøøøðøøøð �Eðøøøõ ˜‰Œð  Ø˜™œ�øØˆs.   †—
A¢+ªA«A¼AÁAÁAÁA)rD   r    rE   r;   r   r   )rw   r    r   r    )r‡   r    rˆ   r   r   r   )rŠ   r    r‹   rŒ   r   r   r   )r^   r�   r   r    )r•   r   r…   r    r   r   )
r   r   r   r   r   rf   rh   ri   r”   r’   r   r   r   rC   rC   N   s¦   € € € € € ð,ð ,ð\D
ð D
ð D
ð D
ðLð ð ð ð$7ð 7ð 7ð 7ð
ð 
ð 
ð 
ð
Dð 
Dð 
Dð 
Dð 
Dðð ð ð ð ð r   rC   )r   Ú
__future__r   rc   Úcollections.abcr   Útypingr   r   r   Ú
ValueErrorr	   r   r   rC   r   r   r   ú<module>r¢      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø $Ð $Ð $Ð $Ð $Ð $Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ð	ð 	ð 	ð 	ð 	˜*ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜ñ 	ô 	ð 	ð+ ð + ð + ð + ð + ñ + ô + ð + ð\qð qð qð qð qñ qô qð qð qð qr   