Files
intellecton/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc
T

230 lines
60 KiB
Plaintext
Raw Normal View History

Ë
j¿ãó>UdZddlZddlZddlmZddlmZddlmZddlm Z ddlm
Z
ejr
ddl Z
dd lmZej d
ej"ej$«Zej d ej(ej*«Zegd ¢«Zegd
¢«Zej4ej6ej8ej:ej<ej>dœZ ejBe"ejFejHfe%d<Gdd«Z&y)z8Parse tokens from the lexer into nodes for the compiler.é)Únodes)ÚTemplateAssertionError)ÚTemplateSyntaxError)Údescribe_token)Údescribe_token_expr)Ú EnvironmentÚ_ImportIncludeÚ
_MacroCall) ÚforÚifÚblockÚextendsÚprintÚmacroÚincludeÚfromÚimportÚsetÚwithÚ
autoescape)ÚeqÚneÚltÚlteqÚgtÚgteq)ÚaddÚsubÚmulÚdivÚfloordivÚmodÚ _math_nodescó"
eZdZdZ dSdddedej edej edej ed df d
Zdefd ed ej e d
ejed dfdZ dej edejejedfd ej e d dfdZ dTded ej e d dfdZ dUdej ejedfd ej e d dfdZ dTdej ejedfd efdZdTd ej e d ej(fdZd ej,ej.ejej.ffdZ dVdejedfded ejej.fdZd ej,ej4ej6ffdZd ej:fdZd ej>fdZ d ejBfdZ"d ejFfd „Z$d ejJfd!„Z&d ejNfd"„Z(d#e)d$ed e)fd%„Z*d ejVfd&„Z,d ejZfd'„Z.d ej^fd(„Z0d#e1d dfd)„Z2d ejffd*„Z4d ejjfd+„Z6d ejnfd,„Z8d ejrfd-„Z:e;jx dWd.ed/d0d ejzfd1„«Z>e;jx dXd.ed/edej ejedfd2ed ej,ej~ejzejff
d3„«Z> dXd.ed/edej ejedfd2ed ej,ej~ejzejff
d4„Z>dYd5ed ej€fd6„ZAd ej€fd7„ZBd ej€fd8„ZCd ej€fd9„ZDd ej€fd:„ZEd ej€fd;„ZFd ej€fd<„ZGd ej€fd=„ZHd ej€fd>„ZId ej€fd?„ZJdYd@ed ej€fdA„ZKdVd2ed ej€fdB„ZL dZdCed5edej ejedfdDed2ed ej,ejej€ff dE„ZMd ejfdF„ZNd efdG„ZPd#ej€d ej€fdH„ZQd#ej€d ej€fdI„ZRd#ej€d ej,eeffdJ„ZUd ej€fdK„ZVd ejejej€ejeej ej€ej ej€ffdL„ZXd#ej€d efdM„ZZ dVd#ej ej€dNed ej ej€fdO„Z[d#ej€d ej€fdP„Z\ dTdej ejedfd ejej.fdQ„Z]d efdR„Z_y)[ÚParserz…This is the central parsing class Jinja uses. It's passed to
extensions and can be used to parse expressions or statements.
environmentr ÚsourceÚnameÚfilenameÚstateÚreturncó$||_|j||||«|_||_||_d|_i|_|j«D],}|jD]}|j|j |<ŒŒ.d|_
g|_ g|_ y)NFr)
r'Ú _tokenizeÚstreamr)r*ÚclosedÚ
extensionsÚiter_extensionsÚtagsÚparseÚ_last_identifierÚ
_tag_stackÚ_end_token_stack)Úselfr'r(r)r*r+Ú extensionÚtags úP/home/antigravity/intellecton/venv/lib/python3.12/site-packages/jinja2/parser.pyÚ__init__zParser.__init__5sð'ˆÔØ+¨F°D¸(ÀEÓŒ ؈Œ Ø ˆŒ
؈Œ ð
ð
Œð 7ˆIØ —~
7Ø'0§¡ Ò
!"ˆÔØ')ˆŒØ;=ˆÕóÚmsgÚlinenoÚexcz te.NoReturncó„|€ |jjj}||||j|j«)z Convenience method that raises `exc` with the message, passed
line number or last line number as well as the current name and
filename.
)r/Úcurrentr?r)r*)r8r>r?r@s r;Úfailz Parser.failLs7ð ˆ—[‘[×(×/ˆFÙ#v˜tŸy™y¨$¯-©-Ó8r=Úend_token_stack.c
óìt«}|D]!}|jtt|««Œ#|r1dj tt
tt|d«««}nd}|dg}nd|dg}|r1|||vr|j
d|d«n|j
d|d«|jr"|j
d|jdd«|jd j |«|«y)
Nz or éÿÿÿÿzUnexpected end of template.zEncountered unknown tag ú.z\You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for z*Jinja was looking for the following tags: z/The innermost block that needs to be closed is ú ) rÚupdateÚmaprÚjoinÚreprÚappendr6rC)r8r)rDr?ÚexpectedÚexprsÚcurrently_lookingÚmessages r;Ú _fail_ut_eofzParser._fail_ut_eofZsô #uˆØ =ˆEØ O‰OœCÔ 3°UÓ  Ø17·±Ü”Dœ#Ô1°?À2Ñ3FÓ2Ñ ð!%Ð à ˆ5‰Gà1°$°¸Ð<ˆGá ØÐ D¨HÑ$4Øð2Ø2CÐ1DÀAðGõð
Ø@ÐARÐ@SÐSTÐð ?Š?Ø N‰NðØ—OO *¨!ð
ð
#—((˜# ,r=có>|j||j|«y)z¤Called if the parser encounters an unknown tag. Tries to fail
with a human readable error message that could help to identify
the problem.
N)rRr7)r8r)r?s r;Úfail_unknown_tagzParser.fail_unknown_tagsð
×ј$ × 5Ñ 5°vÕ>r=Ú
end_tokenscózt|j«}||j|«|jd||«y)z9Like fail_unknown_tag but for end of template situations.N)Úlistr7rMrR)r8rUr?Ústacks r;Úfail_eofzParser.fail_eofs8ô Ø Ð L‰L˜Ô  ×ј$  .r=Úextra_end_rulescó˜|jjjdvry|%|jjj|«Sy)zAre we at the end of a tuple?)Ú variable_endÚ block_endÚrparenTF)r/rBÚtypeÚtest_any)r8rZs r;Ú is_tuple_endzParser.is_tuple_endsDð ;‰;× Ñ × #Ð'NÑ Ø
Ð
—;;×&×Ó r=cóÔ|xjdz
c_tjtj«}tj
j
|d|j|¬«|S)zDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.rÚfi©r?)r5ÚobjectÚ__new__rÚ InternalNameÚNoder<)r8r?Úrvs r;Úfree_identifierzParser.free_identifier sSà ×Ò ÑÜ
^‰^œE×
/ˆÜ
×јB " T×%:Ñ%:Ð$;Ð <ÀVÐÔˆ r=có&|jj}|jdk7r|jd|j«|j
j
|j«d} |jtvrQt|d|jjj«}|«|r|j
j«SS|jdk(r-|j«|r|j
j«SS|jdk(r-|j«|r|j
j«SS|jj|j«}|%||«|r|j
j«SS|j
j«d}|j|j|j«|r|j
j«yy#|r|j
j«wwxYw) zParse a single statement.r)ztag name expectedTÚparse_ÚcallÚfilterNF)r/rBr_rCr?r6rMÚvalueÚ_statement_keywordsÚgetattrÚpopÚparse_call_blockÚparse_filter_blockr1ÚgetrT)r8ÚtokenÚpop_tagÚexts r;Úparse_statementzParser.parse_statement§à ר :‰:˜Ò Ø I‰IÐ)¨5¯<©<Ô  ×јuŸ{™{Ôˆð{‰{Ô˜D F¨4¯;©;×+>Ñ+>×+DÑ+DÐ*EÐ"FÓGÙ“sñ Ø×ð{‰{˜fÒר×ð{‰{˜×Ø×ð—/‘/×% e§k¡kÓ2ˆC؈٘4“yñØ×ð
O‰O× Ñ Ô ˆGØ × ! %§+¡+¨u¯|©|Ô Ø×ø‰wØ×ús&Á*AG1Ã
G1Ä G1Å.G1ÆAG1Ç1HÚ drop_needlecó*|jjd«|jjd«|j|«}|jjj
dk(r|j
|«|rt|j«|S)aRParse multiple statements into a list until one of the end tokens
is reached. This is used to parse the body of statements as it also
parses template data if appropriate. The parser checks first if the
current token is a colon and skips it if there is one. Then it checks
for the block end and parses until if one of the `end_tokens` is
reached. Per default the active token in the stream at the end of
the call is the matched end token. If this is not wanted `drop_needle`
can be set to `True` and the end token is removed.
Úcolonr]Úeof)r/Úskip_ifÚexpectÚsubparserBr_rYÚnext)r8rUr{Úresults r;Úparse_statementszParser.parse_statementsÄsrð
×јGÔ
×ј;Ô˜zÓð ;‰;× Ñ × # uÒ M‰M˜*Ô Ü Ô Øˆ
r=códt|j«j}|jd¬«}|jj d«r(|j «}t
j|||¬«S|jd«}|jdd¬«}t
j||||¬«S)zParse an assign statement.T©Úwith_namespaceÚassignrdN)z name:endset©r{) rr/r?Úparse_assign_targetrÚ parse_tuplerÚAssignÚ parse_filterr„Ú AssignBlock)r8r?ÚtargetÚexprÚ filter_nodeÚbodys r;Ú parse_setzParser.parse_setás™äd—k)ˆØ×)¸ÐØ ;‰;× Ñ ˜xÔ ×%ˆ—<< ¨°VÔ ×Ó-ˆ Ø×$Ð%5À4ÐÜ× Ñ  ¨°dÀ6ÔJr=c ó&|jjd«j}|jd¬«}|jjd«|j dd¬«}d}|jj d «r|j
«}|jj d
«}|jd «}t|j«jd k(rg}n|jd
d¬«}tj|||||||¬«S)zParse a for loop.zname:for)úname:in)rZr•F)úname:recursive)Ú
with_condexprrZname:ifr)ú name:endforú name:elseÚendfor)r™Tr‰rd) r/r€r?rrÚparse_expressionr„rrorÚFor)r8r?rÚiterÚtestÚ recursiverÚelse_s r;Ú parse_forzParser.parse_forìà×# JÓØ×)¸,ÐØ ×ј9Ô×ÑØÐ1Dð ó
ˆðˆØ ;‰;× Ñ ˜yÔ ×*ˆ—KK×'Ð(8Ó9ˆ Ø×$Ð%AÓÜ  Ó × "  ‰Eà×)Ð*:ÈÐMˆEÜy‰y˜  t¨U°D¸)ÈFÔSr=có4tj|jjd«j¬«x}} |j d¬«|_|jd«|_g|_ g|_
t|j«}|j
d«rPtj|jjj¬«}|jj|«Œ²|j
d«r|jd d¬
«|_
|S) zParse an if construct.r˜rdTF©r—)ú name:elifršú
name:endifr¥)r‰)rÚIfr/r€r?rr„rÚelif_r¡rrBrM)r8Únoderƒrvs r;Úparse_ifzParser.parse_ifÿ䟨¯ © ×(:Ñ(:¸9Ó(E×(LÑ(LÔˆvØØ×(°uÐ=ˆDŒIØ×-Ð.VÓWˆDŒI؈DŒJ؈DŒJܘŸÓ%ˆEØz‰z˜—xx t§{¡{×':Ñ':×'AÑ'AÔBØ ×# DÔØ˜KÔ4°_ÐRVÐW Ø Øˆ
r=có`tjt|j«j¬«}g}g}|jj
j dk7r­|r|jjd«|j«}|jd«|j|«|jjd«|j|j««|jj
j dk7rŒ­||_ ||_
|jdd¬«|_|S) Nrdr]ÚcommaÚparamrˆ)z name:endwithTr‰)rÚWithrr/r?rBr_r€Úset_ctxrMÚtargetsÚvaluesr„r)r8rs r;Ú
parse_withzParser.parse_withÜz‰z¤ d§k¡kÓ!2×!9Ñ!9Ô:ˆØ&(ˆØ%'ˆØk‰k×!×&¨+ÒØ ×" ×/ˆ N‰N˜ N‰N˜ K‰K× Ñ ˜ M‰M˜$× k‰k×!×&¨+ÓˆŒ ؈Œ Ø×)Ð*;ÈÐŒ ؈ r=cótjt|j«j¬«}tj
d|j
««g|_|jdd¬«|_ tj|g«S)Nrdr)zname:endautoescapeTr‰) rÚScopedEvalContextModifierrr/r?ÚKeywordrœÚoptionsr„rÚScope©r8s r;Úparse_autoescapezParser.parse_autoescape"shÜ×.´d¸4¿;¹;Ó6G×6NÑ6NÔOˆÜŸ
 l°D×4IÑ4IÓ4KÓMˆŒ Ø×)Ð*AÈtÐTˆŒ Ü{‰{˜D˜"r=cóòtjt|j«j¬«}|jj d«j |_|jjd«|_ |jjd«|_
|jjjdk(r|jd«|jdd¬ «|_|jrY|jD]J}t!|tj"«rt%d
|jD««sŒ:|jd «ŒL|jjd |jz«|S)
Nrdr)z name:scopedz
name:requiredrzpBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.)z
name:endblockTr‰c3óŒK|]<}t|tj« xs|jj « Œ>y­w©N)Ú
isinstancerÚ TemplateDataÚdataÚisspace)Ú.0Ú output_nodes r;ú <genexpr>z%Parser.parse_block.<locals>.<genexpr>>sKèø€òBð# ;´×0BÑ0BÓ&×+×BùsAAz7Required blocks can only contain comments or whitespacezname:)rÚBlockrr/r?r€ror)rÚscopedÚrequiredrBr_rCr„rÚOutputÚany)r8Ú body_nodes r;Ú parse_blockzParser.parse_block(s%Ü{‰{¤$ t§{¡{Ó"3×":Ñ":Ô;ˆØ—KK×& .×4ˆŒ Ø—k‘k×)¨-ÓŒ ØŸ ×+¨OÓŒ
ð
;‰;× Ñ × # uÒ I‰Ið
ð
×)Ð*<È$ÐOˆŒ ð
=Š=Ø!ŸY™Yò
Y Ü! )¬U¯\©\Ô:¼cñBð(1§¡ôBõ?ð
—I

Yð
×јG d§i¡iш r=có–tjt|j«j¬«}|j «|_|S©Nrd)rÚExtendsrr/r?Útemplater¸s r;Ú
parse_extendszParser.parse_extendsHs4Ü}‰}¤D¨¯©Ó$5×$<Ñ$<Ô=ˆØ×Œ
؈ r=Údefaultcó8|jjjdd«rl|jj«j d«rCt |j«j dk(|_|jj«|S||_|S)Nz name:withz name:withoutú name:contextr) r/rBr`ÚlookrŸrroÚ with_contextÚskip)r8s r;Úparse_import_contextzParser.parse_import_contextMs~ð ;‰;× Ñ × ˜ô
àk‰k×ÑÓ ×% nÔ5Ü $ T§[¡[Ó 1× 7Ñ 7¸6Ñ AˆDÔ Ø K‰K× Ñ Ô ðˆ ð!(ˆDÔ Øˆ r=có¦tjt|j«j¬«}|j «|_|jjjd«rL|jj«jd«r#d|_
|jjd«nd|_
|j|d«S)Nrdz name:ignorez name:missingTéF)
rÚIncluderr/r?rBÚignore_missingrÕr¸s r;Ú
parse_includezParser.parse_includeYsÜ}‰}¤D¨¯©Ó$5×$<Ñ$<Ô=ˆØ×Œ
Ø ;‰;× Ñ × #  2°t·{±{×7GÑ7GÓ7I×7NÑ7NØ ô8
ð#'ˆ Ø K‰K× Ñ ˜ à"'ˆ Ø×¨tÓ4r=có.tjt|j«j¬«}|j «|_|jjd«|jd¬«j|_
|j|d«S)Nrdúname:asT©Ú name_onlyF) rÚImportrr/r?r€r)rr¸s r;Ú parse_importzParser.parse_importesoÜ|‰|¤4¨¯ © Ó#4×#;Ñ#;Ô<ˆØ×Œ
Ø ×ј9Ô×ÐŒ Ø×¨uÓ5r=cóþtjtj«j¬«Šj «_jjd«g_dtfˆˆfd } jrjjd«jjjdk(r|«rnjd¬«}|jjd «r"‰jd
|jt ¬ «jj#d «rD‰jd¬«}jj%|j|jf«n%‰jj%|j«|«s#‰jjjdk7rnjjd«Œot'd
«sd_S)Nrdz name:importr,có jjjdvrk‰jj«j d«rBt j«jdk(_jj«yy)N>rÚwithoutrÒrTF)r/rBror)r8s€€r;Ú
parse_contextz(Parser.parse_from.<locals>.parse_contextrsoø€Ø{‰{×"×-ñð—++×$×)¨.Ô9Ü$(¨¯©Ó$5×$;Ñ$;¸vÑ$EÔ × Ñ ÔØr=Tr¬r)Ú_z4names starting with an underline can not be imported)r@F)rÚ
FromImportrr/r?r€ÚnamesÚboolrBr_r)Ú
startswithrCrrrMÚhasattrrÔ)r8rÚaliasr©s` @r;Ú
parse_fromzParser.parse_fromlù€Ü×Ѥt¨D¯K©KÓ'8×'?Ñ'?Ô@ˆØ×Œ
Ø ×ј=ÔˆŒ
ð œtö ðØzŠzØ ×" {‰{×"×'¨6Ó ”?ÙØ×1¸DÐAØ—;‘;×)¨#Ô—I‘IØŸ
Üôð
—;;×&  ×4¸D—JJ×% v§{¡{°E·J±JÐ&?Õ—JJ×% f§k¡kÔ ”? d§k¡k×&9Ñ&9×&>Ñ&>À'Ò&IØà ×" *ñ+ô,t˜,Ø %ˆ ؈ r=có`gx}|_gx}|_|jjd«|jjj
dk7rÃ|r|jjd«|j
d¬«}|jd«|jjd«r |j|j««n|r|jd«|j|«|jjj
dk7rŒÃ|jjd«y) NÚlparenr^TrÞr­rˆz-non-default argument follows default argument) ÚargsÚdefaultsr/r€rBr_rrMrC)r8Úargs r;Úparse_signaturezParser.parse_signatureØÐˆˆtŒyØ#%Ð4”=Ø ×ј8Ôk‰k×!×&¨(ÒØ ×" ×*°TÐ:ˆCØ K‰K˜Ô Ø{‰{×"  × 5Ñ 5Ó 7ÕØ— ‘ Ð K‰K˜Ô ðk‰k×!×&¨(Ó
×ј8Õ$r=có¼tjt|j«j¬«}|jj
j dk(r|j|«ng|_g|_ |j«}t|tj«s|jd|j«||_|jdd¬«|_|S)Nrdz
expected call)z name:endcallTr‰)rÚ CallBlockrr/r?rBr_ÚCallrCrmr„r)r8Ú call_nodes r;rszParser.parse_call_block¦Ü¤d¨4¯;©;Ó&7×&>Ñ&>Ô?ˆØ ;‰;× Ñ × # xÒ × Ñ  Õ ˆDŒI؈DŒMà×+ˆ ܘ)¤U§Z¡ZÔ I‰Io t§{¡{Ô ˆŒ Ø×)Ð*;ÈÐŒ ؈ r=cóÌtjt|j«j¬«}|j dd¬«|_|jdd¬«|_|S)NrdT)Ú start_inline)zname:endfilterr‰) rÚ FilterBlockrr/r?rrnr„rr¸s r;rtzParser.parse_filter_blockµsUÜ× Ñ ¬¨T¯[©[Ó(9×(@Ñ(@ÔAˆØ×¸@ˆŒ Ø×)Ð*=È4ÐŒ ؈ r=cótjt|j«j¬«}|j d¬«j |_|j|«|jdd¬«|_ |S)NrdTrÞ)z
name:endmacror‰)
rÚMacrorr/r?r)r„rr¸s r;Ú parse_macrozParser.parse_macro»seÜ{‰{¤$ t§{¡{Ó"3×":Ñ":Ô;ˆØ×,°tÐAˆŒ Ø ×јTÔ×)Ð*<È$ÐOˆŒ ؈ r=có¨tjt|j«j¬«}g|_|jj
j dk7rt|jr|jjd«|jj|j««|jj
j dk7rŒt|S)Nrdr])
rrr/r?rBr_r€rMr¸s r;Ú parse_printzParser.parse_printÂs“Ü|‰|¤4¨¯ © Ó#4×#;Ñ#;Ô<ˆØˆŒ
Øk‰k×!×&¨+ÒzŠzØ ×"  J‰J× Ñ ˜d× k‰k×!×&¨+Óˆ r=Ú
with_tuplerßzte.Literal[True]cóy©)r8rs r;zParser.parse_assign_targetËsðr=r‡cóyr)r8rrZr‡s r;zParser.parse_assign_targetÐsð9<r=có®|rH|jjd«}tj|jd|j
¬«}n:|r|j
d||¬«}n|j|¬«}|jd«|j«s@|jdt|«jj«|j
«|S)aParse an assignment target. As Jinja allows assignments to
tuples, this function can parse all allowed assignment targets. Per
default assignments to tuples are parsed, that can be disable however
by setting `with_tuple` to `False`. If only assignments to names are
wanted `name_only` can be set to `True`. The `extra_end_rules`
parameter is forwarded to the tuple parsing function. If
`with_namespace` is enabled, a namespace assignment may be parsed.
r)ÚstorerdT)Ú
simplifiedrZr‡r†zcan't assign to )r/r€rÚNameror?rÚ
parse_primaryr¯Ú
can_assignrCr_Ú__name__Úlower)r8rrZr‡rvrs r;zParser.parse_assign_targetÙñ" Ø—KK×& .ˆ—ZZ § ¡ ¨W¸U¿\¹\ÔJ‰FáØ×#Ø$3Ø#1ðð ×+¸Jà N‰N˜ × Ñ Ô I‰IØ"¤4¨£<×#8Ñ#8×#>Ñ#>Ó#@Ð"CÐDÀfÇmÁmô
ðˆ
r=r—cóF|r|j«S|j«S)zºParse an expression. Per default all expressions are parsed, if
the optional `with_condexpr` parameter is set to `False` conditional
expressions are not parsed.
)Úparse_condexprÚparse_or©r8r—s r;zParser.parse_expressions"ñ
Ø× }‰}Ðr=cóÂ|jjj}|j«}|jj d«r“|j«}|jj d«r|j «}nd}t
j||||¬«}|jjj}|jj d«rŒ“|S)Nr˜rd)r/rBr?rrr
rÚCondExpr)r8r?Úexpr1Úexpr2Úexpr3s r;r
zParser.parse_condexpr Ø×Ø
ˆðk‰k×! )Ô—MM“Oˆ{‰{×" ×-‘àÜ—N‘N 5¨%°¸vÔFˆEØ—[‘[×/ˆFðk‰k×! ˆ r=cód|jjj}|j«}|jj d«rd|j«}t j |||¬«}|jjj}|jj d«rŒd|S)name:orrd)r/rBr?Ú parse_andrrÚOr©r8r?ÚleftÚrights r;rzParser.parse_orØ×Ø~‰~ÓˆØk‰k×! )Ô—N‘NÓ$ˆEÜ—8‘8˜D %°Ô7ˆDØ—[‘[×/ˆFðk‰k×! ˆ r=cód|jjj}|j«}|jj d«rd|j«}t j |||¬«}|jjj}|jj d«rŒd|S)name:andrd)r/rBr?Ú parse_notrrÚAndrs r;rzParser.parse_and!Ø×Ø~‰~ÓˆØk‰k×! *Ô—N‘NÓ$ˆEÜ—9‘9˜T 5°Ô8ˆDØ—[‘[×/ˆFðk‰k×! ˆ r=cóô|jjjd«rDt|j«j}t j |j«|¬«S|j«S)name:notrd) r/rBrr?rÚNotrÚ
parse_compare)r8r?s r;rzParser.parse_not*sUØ ;‰;× Ñ × #  ˜$Ÿ+™+Ó&×-ˆ—99˜TŸ^™^Ó-°fÔ ×#r=có |jjj}|j«}g} |jjj}|t
vrIt
|j«|jtj||j«««ní|jjd«r4|jtjd|j«««nž|jjjd«rx|jj«jd«rO|jjd«|jtjd|j«««nn"|jjj}Œ€|s|Stj|||¬«S)Nr•Úinr!Únotinrd)r/rBr?Ú parse_math1r_Ú_compare_operatorsrrMrÚOperandrÚCompare)r8r?rÚopsÚ
token_types r;r#zParser.parse_compare0sLØ×Ø×ÑÓØˆØØŸ×1ˆJØÔT—[‘[Ô
œ5Ÿ=™=¨°T×5EÑ5EÓ5GÓ×$ YÔ
œ5Ÿ=™=¨¨t×/?Ñ/?Ó/AÓ×)¨*Ô5¸$¿+¹+×:JÑ:JÓ:L×:QÑ:QØô;ð × Ñ  Ô
œ5Ÿ=™=¨°$×2BÑ2BÓ2DÓØ—[‘[×/ˆFññ؈KÜ}‰}˜T 3¨vÔ6r=cóÞ|jjj}|j«}|jjjdvršt
|jjj}t
|j«|j«}||||¬«}|jjj}|jjjdvrŒš|S)N)rrrd)r/rBr?Ú parse_concatr_r$r©r8r?rÚclsrs r;r'zParser.parse_math1GØ×Ø× Ñ Ó"ˆØk‰k×!×&¨.јdŸk™k×7ˆCÜ Ô Ø×'ˆEÙt˜U¨6Ô2ˆ—[‘[×/ˆFð k‰k×!×&¨.Ò ˆ r=có®|jjj}|j«g}|jjjdk(rXt |j«|j
|j««|jjjdk(rŒXt|«dk(r|dStj||¬«S)tilderrrd)
r/rBr?Ú parse_math2r_rrMÚlenrÚConcat)r8r?s r;r.zParser.parse_concatRØ×Ø× Ñ Ó#ˆØk‰k×!×&¨'Ò Ô Ø K‰K˜× k‰k×!×&¨'Ó ˆt9˜Š>ؘ‘7ˆNÜ|‰|˜Ô0r=cóÞ|jjj}|j«}|jjjdvršt
|jjj}t
|j«|j«}||||¬«}|jjj}|jjjdvrŒš|S)N)r r!r"r#rd)r/rBr?Ú parse_powr_r$rr/s r;r3zParser.parse_math2\Ø×Ø~‰~ÓˆØk‰k×!×&Ð*KјdŸk™k×7ˆCÜ Ô Ø—N‘NÓ$ˆEÙt˜U¨6Ô2ˆDØ—[‘[×/ˆFð k‰k×!×&Ð*KÒ ˆ r=có®|jjj}|j«}|jjjdk(rt |j«|j«}t
j|||¬«}|jjj}|jjjdk(rŒ|S)powrd)r/rBr?Ú parse_unaryr_rrÚPowrs r;r7zParser.parse_powgØ×Ø×ÑÓØk‰k×!×&¨%Ò Ô Ø×&ˆ—99˜T Ô8ˆDØ—[‘[×/ˆk‰k×!×&¨%Ó
ˆ r=Ú with_filtercóò|jjj}|jjj}|dk(r<t |j«t j |jd«|¬«}nQ|dk(r<t |j«t j|jd«|¬«}n|j«}|j|«}|r|j|«}|S)NrFrdr) r/rBr_r?rrÚNegr:ÚPosrÚ
parse_postfixÚparse_filter_expr)r8r<r,r?s r;r:zParser.parse_unaryqØ—[[×
Ø×ð ˜Ò Ü Ô Ü—9‘9˜T×-¨eÓ4¸VÔD‰DØ
˜
Ü Ô Ü—9‘9˜T×-¨eÓ4¸VÔD‰Dà×'ˆ×! Ù Ø×)¨$Ó/ˆD؈ r=cóÈ|jj}|jdk(r>t|j«|jdvr/t j |jdv|j¬«}|S|jdvr#t j d|j¬«}|S|r|jjjdk(rht|j«|jjd«}t j|j|j|j¬«}|St j|jd|j¬«}|S|jd k(rát|j«|jg}|j}|jjjd k(rh|j|jjj«t|j«|jjjd k(rŒht j d
j|«|¬«}|S|jd vrBt|j«t j |j|j¬«}|S|jd k(rDt|j«|jd
¬«}|jjd«|S|jdk(r|j«}|S|jdk(r|j«}|S|j!dt#|«|j«S)z€Parse a name or literal value. If ``with_namespace`` is enabled, also
parse namespace attr refs, for use in assignments.r))ÚtrueÚfalseÚTrueÚFalse)rCrErd)ÚnoneÚNoneNÚdotÚloadÚstringÚ)ÚintegerÚfloatrïT)Úexplicit_parenthesesr^ÚlbracketÚlbracez unexpected )r/rBr_rrorÚConstr?r€ÚNSRefrrMrKrÚ
parse_listÚ
parse_dictrCr)r8r‡rvÚattrÚbufr?s r;rzParser.parse_primaryƒð ×à :‰:˜Ó Ü Ô Ø{‰{З{{ 5§;¡;Ð2BÐ#BÈ5Ï<É<ÔXð@ˆ ð?Ð 0Ñ—{‘{ 4°· ± Ô=ð<ˆ ñ;  D§K¡K×$7Ñ$7×$<Ñ$<ÀÒ$EôT—[—{{×)¨&Ó1Ü—{{ 5§;¡;°·
±
À5Ç<Á<ÔPð0ˆ ô-—zz %§+¡+¨v¸e¿l¹lÔKð,ˆ ð+Z‰Z˜
Ô Ø—;‘;-ˆCØ—\‘\ˆFØ—+‘+×*¨hÒ
˜4Ÿ;™;×T—[‘[Ô—+‘+×*¨hÓ—;‘;˜rŸw™w s›|°FÔ;ˆDðˆ ðZ‰ZÐ
Ô Ü—;;˜uŸ{™{°5·<±<Ô@ˆˆ ðZ‰Z˜8Ò
Ô Ø×Ð>ˆDØ K‰K× Ñ ˜xÔ ˆ ð
Z‰Z˜
—?$ˆ
ˆ ð Z‰Z˜
—?‘?Ó$ˆDðˆ ð
I‰I˜ ¤N°5Ó$9Ð#<Ð=¸u¿|¹|Ô ˆ r=rrOcóvjjj}|rdtjfˆˆfd }ndtjfˆˆfd }g}d} |rjj d«j
|«rn^|j|««jjjdk(rd} nn!‰jjj}Œ| s:|r|dS|s1‰jdtjj««tj|d |¬
«S) Works like `parse_expression` but if multiple expressions are
delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
This method could also return a regular expression instead of a tuple
if no commas where found.
The default parsing mode is a full tuple. If `simplified` is `True`
only names and literals are parsed; ``with_namespace`` allows namespace
attr refs as well. The `no_condexpr` parameter is forwarded to
:meth:`parse_expression`.
Because tuples do not require delimiters and may end in a bogus comma
an extra hint is needed that marks the end of a tuple. For example
for loops support tuples between `for` and `in`. In that case the
`extra_end_rules` is set to ``['name:in']``.