1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
U
Þ=®dtã@sUdZddlZddlZddlmZddlmZddlm    Z    ddl
m Z ddl mZdd    lmZejrxddlZdd
lmZed ƒZejejd fed <e d¡Ze d¡Ze dej¡Ze dejej B¡Z!e dejej B¡Z"e    dƒZ#e    dƒZ$e    dƒZ%e    dƒZ&e    dƒZ'e    dƒZ(e    dƒZ)e    dƒZ*e    dƒZ+e    dƒZ,e    dƒZ-e    dƒZ.e    dƒZ/e    d ƒZ0e    d!ƒZ1e    d"ƒZ2e    d#ƒZ3e    d$ƒZ4e    d%ƒZ5e    d&ƒZ6e    d'ƒZ7e    d(ƒZ8e    d)ƒZ9e    d*ƒZ:e    d+ƒZ;e    d,ƒZ<e    d-ƒZ=e    d.ƒZ>e    d/ƒZ?e    d0ƒZ@e    d1ƒZAe    d2ƒZBe    d3ƒZCe    d4ƒZDe    d5ƒZEe    d6ƒZFe    d7ƒZGe    d8ƒZHe    d9ƒZIe    d:ƒZJe    d;ƒZKe    d<ƒZLe    d=ƒZMe    d>ƒZNe    d?ƒZOe    d@ƒZPe    dAƒZQe    dBƒZRe    dCƒZSe#e;e'e*e3e2e6e<e.e8e/e9e-e7e)e4e+e,e0e1e$e(e%e5e&e:dDœZTdEdF„eT U¡DƒZVeWeTƒeWeVƒksÌtXdGƒ‚e dHdI YdJdK„eZeTdLdM„dNDƒ¡›dO¡Z[e\eIeKeJe=eNeOePgƒZ]e\e=eQeKePgƒZ^e_e_dPœdQdR„Z`dSe_dTœdUdV„Zae_e_dWœdXdY„Zbe_ecdZœd[d\„Zdd]ejeeje_e_fd^œd_d`„ZfGdadb„dbƒZgGdcdS„dSejhƒZiGddde„deƒZjGdfdg„dgƒZkd]d d^œdhdi„ZlGdjdk„dkemƒZnGdldm„dmejhƒZoGdnd „d ƒZpdS)ozúImplements a Jinja / Python combination lexer. The ``Lexer`` class
is used to do some preprocessing. It filters out invalid operators like
the bitshift operators we don't allow in templates. It separates
template code and python code in expressions.
éN)Ú literal_eval)Údeque)Úinterné)Úpattern)ÚTemplateSyntaxError)ÚLRUCache)Ú Environmenté2ÚLexerÚ _lexer_cachez\s+z (\r\n|\r|\n)z7('([^'\\]*(?:\\.[^'\\]*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")z¿
    (
        0b(_?[0-1])+ # binary
    |
        0o(_?[0-7])+ # octal
    |
        0x(_?[\da-f])+ # hex
    |
        [1-9](_?\d)* # decimal
    |
        0(_?0)* # decimal zero
    )
    zü
    (?<!\.)  # doesn't start with a .
    (\d+_)*\d+  # digits, possibly _ separated
    (
        (\.(\d+_)*\d+)?  # optional fractional part
        e[+\-]?(\d+_)*\d+  # exponent part
    |
        \.(\d+_)*\d+  # required fractional part
    )
    ÚaddZassignÚcolonÚcommaÚdivÚdotÚeqÚfloordivÚgtZgteqZlbraceZlbracketZlparenÚltZlteqÚmodÚmulÚneÚpipeÚpowÚrbraceZrbracketZrparenZ    semicolonÚsubÚtildeÚ
whitespaceÚfloatÚintegerÚnameÚstringÚoperatorZ block_beginZ    block_endZvariable_beginZ variable_endZ    raw_beginZraw_endZ comment_beginZ comment_endÚcommentZlinestatement_beginZlinestatement_endZlinecomment_beginZlinecomment_endZ linecommentÚdataÚinitialÚeof)ú+ú-ú/z//Ú*ú%z**ú~ú[ú]ú(ú)Ú{Ú}z==z!=ú>z>=ú<z<=ú=Ú.ú:ú|ú,ú;cCsi|]\}}||“qS©r<)Ú.0ÚkÚvr<r<úCd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\jinja2/lexer.pyÚ
<dictcomp>srAzoperators droppedr0r9ccs|]}t |¡VqdS©N)ÚreÚescape©r=Úxr<r<r@Ú    <genexpr>srGcCs
t|ƒ SrB)Úlen©rFr<r<r@Ú<lambda>órJ)Úkeyr1)Ú
token_typeÚreturncCsL|tkrt|Stdtdtdtdtdtdtdtdt    dt
d    t d
t d i   ||¡S) Nzbegin of commentzend of commentr$zbegin of statement blockzend of statement blockzbegin of print statementzend of print statementzbegin of line statementzend of line statementztemplate data / textzend of template)Úreverse_operatorsÚTOKEN_COMMENT_BEGINÚTOKEN_COMMENT_ENDÚ TOKEN_COMMENTÚTOKEN_LINECOMMENTÚTOKEN_BLOCK_BEGINÚTOKEN_BLOCK_ENDÚTOKEN_VARIABLE_BEGINÚTOKEN_VARIABLE_ENDÚTOKEN_LINESTATEMENT_BEGINÚTOKEN_LINESTATEMENT_ENDÚ
TOKEN_DATAÚ    TOKEN_EOFÚget)rMr<r<r@Ú_describe_token_type£s<ô ór]ÚToken©ÚtokenrNcCs|jtkr|jSt|jƒS)z#Returns a description of the token.)ÚtypeÚ
TOKEN_NAMEÚvaluer])r`r<r<r@Údescribe_token·s
rd©ÚexprrNcCs2d|kr&| dd¡\}}|tkr*|Sn|}t|ƒS)z0Like `describe_token` but for token expressions.r8r)Úsplitrbr])rfrarcr<r<r@Údescribe_token_expr¿s rh©rcrNcCstt |¡ƒS)zsCount the number of newline characters in the string.  This is
    useful for extensions that filter a stream.
    )rHÚ
newline_reÚfindall)rcr<r<r@Úcount_newlinesÌsrlr    ©Ú environmentrNcCs°tj}t|jƒt||jƒft|jƒt||jƒft|jƒt||jƒfg}|j    dk    rp| 
t|j    ƒt d||j    ƒf¡|j dk    rš| 
t|j ƒt d||j ƒf¡dd„t|ddDƒS)zACompiles all the rules from the environment into a list of rules.Nz    ^[ \t\v]*z(?:^|(?<=\S))[^\S\r\n]*cSsg|]}|dd…‘qS)rNr<rEr<r<r@Ú
<listcomp>ùsz!compile_rules.<locals>.<listcomp>T)Úreverse)rCrDrHÚcomment_start_stringrPÚblock_start_stringrTÚvariable_start_stringrVÚline_statement_prefixÚappendrXÚline_comment_prefixÚTOKEN_LINECOMMENT_BEGINÚsorted)rnÚeÚrulesr<r<r@Ú compile_rulesÓs:ýýýõ
 ýÿ
 ýÿr{c@s>eZdZdZefeejeddœdd„Ze    eddœdd    „Z
dS)
ÚFailurezjClass that raises a `TemplateSyntaxError` if called.
    Used by the `Lexer` to specify known errors.
    N)ÚmessageÚclsrNcCs||_||_dSrB)r}Ú error_class)Úselfr}r~r<r<r@Ú__init__szFailure.__init__z te.NoReturn)ÚlinenoÚfilenamerNcCs| |j||¡‚dSrB)rr})r€r‚rƒr<r<r@Ú__call__szFailure.__call__) Ú__name__Ú
__module__Ú __qualname__Ú__doc__rÚstrÚtÚTyperÚintr„r<r<r<r@r|üsÿþ r|c@sTeZdZUeed<eed<eed<edœdd„Zeedœdd    „Zeed
œd d „Z    d S)r^r‚rarc©rNcCst|ƒSrB)rd©r€r<r<r@Ú__str__sz Token.__str__recCs2|j|krdSd|kr.| dd¡|j|jgkSdS)z¸Test a token against a token expression.  This can either be a
        token type or ``'token_type:token_value'``.  This can only test
        against string values and types.
        Tr8rF)rargrc©r€rfr<r<r@Útests
 
z
Token.test)ÚiterablerNcst‡fdd„|DƒƒS)z(Test against multiple token expressions.c3s|]}ˆ |¡VqdSrB)r‘)r=rfrŽr<r@rG$sz!Token.test_any.<locals>.<genexpr>)Úany)r€r’r<rŽr@Útest_any"szToken.test_anyN)
r…r†r‡rŒÚ__annotations__r‰rÚboolr‘r”r<r<r<r@r^ s
c@s<eZdZdZdddœdd„Zddœdd    „Zedœd
d „ZdS) ÚTokenStreamIteratorz`The iterator for tokenstreams.  Iterate over the stream
    until the eof token is reached.
    Ú TokenStreamN)ÚstreamrNcCs
||_dSrB)r™)r€r™r<r<r@r,szTokenStreamIterator.__init__rcCs|SrBr<rŽr<r<r@Ú__iter__/szTokenStreamIterator.__iter__cCs.|jj}|jtkr |j ¡t‚t|jƒ|SrB)r™Úcurrentrar[ÚcloseÚ StopIterationÚnext©r€r`r<r<r@Ú__next__2s 
 
 
zTokenStreamIterator.__next__)r…r†r‡rˆrršr^r r<r<r<r@r—'sr—c@säeZdZdZejeejeejedœdd„Z    e
dœdd„Z e dœdd    „Z ee dœd
d „ƒZed d œdd„Zedœdd„Zd!ed dœdd„Zeejedœdd„Zee dœdd„Zedœdd„Zd dœdd„Zeedœdd „Zd S)"r˜zÛA token stream is an iterable that yields :class:`Token`\s.  The
    parser however does not iterate over it but calls :meth:`next` to go
    one token ahead.  The current active token is stored as :attr:`current`.
    )Ú    generatorr!rƒcCs>t|ƒ|_tƒ|_||_||_d|_tdtdƒ|_    t
|ƒdS)NFrÚ) ÚiterÚ_iterrÚ_pushedr!rƒÚclosedr^Ú TOKEN_INITIALr›rž)r€r¡r!rƒr<r<r@rCs
zTokenStream.__init__rcCst|ƒSrB)r—rŽr<r<r@ršQszTokenStream.__iter__cCst|jƒp|jjtk    SrB)r–r¥r›rar[rŽr<r<r@Ú__bool__TszTokenStream.__bool__cCs| S)z Are we at the end of the stream?r<rŽr<r<r@ÚeosWszTokenStream.eosNr_cCs|j |¡dS)z Push a token back to the stream.N)r¥rurŸr<r<r@Úpush\szTokenStream.pushcCs"t|ƒ}|j}| |¡||_|S)zLook at the next token.)ržr›rª)r€Z    old_tokenÚresultr<r<r@Úlook`s
 
zTokenStream.lookr)ÚnrNcCst|ƒD] }t|ƒqdS)zGot n tokens ahead.N)Úrangerž)r€r­Ú_r<r<r@Úskiphs zTokenStream.skiprecCs|j |¡rt|ƒSdS)zqPerform the token test and return the token if it matched.
        Otherwise the return value is `None`.
        N)r›r‘ržrr<r<r@Únext_ifms zTokenStream.next_ifcCs| |¡dk    S)z8Like :meth:`next_if` but only returns `True` or `False`.N)r±rr<r<r@Úskip_ifvszTokenStream.skip_ifcCsX|j}|jr|j ¡|_n:|jjtk    rTzt|jƒ|_Wntk
rR| ¡YnX|S)z|Go one token ahead and return the old one.
 
        Use the built-in :func:`next` instead of calling this directly.
        )    r›r¥Úpopleftrar[ržr¤rrœ)r€Úrvr<r<r@r zs zTokenStream.__next__cCs&t|jjtdƒ|_tdƒ|_d|_dS)zClose the stream.r¢r<TN)r^r›r‚r[r£r¤r¦rŽr<r<r@rœ‹s
zTokenStream.closecCsn|j |¡sft|ƒ}|jjtkr>td|›d|jj|j|jƒ‚td|›dt    |jƒ›|jj|j|jƒ‚t
|ƒS)z}Expect a given token type and return it.  This accepts the same
        argument as :meth:`jinja2.lexer.Token.test`.
        z%unexpected end of template, expected r7zexpected token z, got ) r›r‘rhrar[rr‚r!rƒrdržrr<r<r@Úexpect‘s   
üüzTokenStream.expect)r)r…r†r‡rˆrŠÚIterabler^ÚOptionalr‰rr—ršr–r¨Úpropertyr©rªr¬rŒr°r±r²r rœrµr<r<r<r@r˜=s"ü     r˜c CsZ|j|j|j|j|j|j|j|j|j|j    |j
|j f }t   |¡}|dkrVt|ƒt |<}|S)z(Return a lexer which is probably cached.N)rrÚblock_end_stringrsÚvariable_end_stringrqÚcomment_end_stringrtrvÚ trim_blocksÚ lstrip_blocksÚnewline_sequenceÚkeep_trailing_newliner r\r )rnrLÚlexerr<r<r@Ú    get_lexerªs"ô
rÁcs$eZdZdZdZ‡fdd„Z‡ZS)ÚOptionalLStripzWA special tuple for marking a point in the state that can have
    lstrip applied.
    r<cstƒ ||¡SrB)ÚsuperÚ__new__)r~ÚmembersÚkwargs©Ú    __class__r<r@rÄËszOptionalLStrip.__new__)r…r†r‡rˆÚ    __slots__rÄÚ __classcell__r<r<rÇr@rÂÂsrÂc@sNeZdZUejeed<ejeejedfeje    fed<ej
eed<dS)Ú_Ruler.ÚtokensÚcommandN) r…r†r‡rŠÚPatternr‰r•ÚUnionÚTupler|r·r<r<r<r@rËÏs
$rËc
@sÐeZdZdZdddœdd„Zeedœdd    „Zdeejeejeejee    d
œd d „Z
dej ej e eefejeejeejed œdd„Zdeejeejeejeejej e eefd
œdd„ZdS)r a Class that implements a lexer for a given environment. Automatically
    created by the environment class, usually you don't have to do that.
 
    Note that the lexer is not automatically bound to an environment.
    Multiple environments can share the same lexer.
    r    Nrmc Cs$tj}ttjtdœdd„}tttdƒttt    dƒtt
t dƒtt t dƒtttdƒtttdƒg}t|ƒ}||jƒ}||jƒ}||jƒ}||jƒ}    |jr–dnd}
|j|_|j|_|j|_d|›d|›d|›d    } d
 | gd d „|Dƒ¡} d t|d| ›dƒttdƒdƒt|dƒtdƒgtt|d|›d|›d|›|
›d    ƒtt fdƒt|dƒt!dƒfdƒgt"t|d|›d|›d|›|
›dƒt#dƒg|t$t|d|    ›d|    ›ƒt%dƒg|t&t|d|›d|›d|›d|›|
›d    
ƒttt'ƒdƒt|dƒt!dƒfdƒgt(t|dƒt)dƒg|t*t|dƒt+t,fdƒgi|_-dS)N)rFrNcSst |tjtjB¡SrB)rCÚcompileÚMÚSrIr<r<r@ÚcászLexer.__init__.<locals>.cz\n?r¢z(?P<raw_begin>z(\-|\+|)\s*raw\s*(?:\-z\s*|z))r9cSs"g|]\}}d|›d|›d‘qS)z(?P<r4z    (\-|\+|))r<)r=r­Úrr<r<r@rosz"Lexer.__init__.<locals>.<listcomp>Úrootz(.*?)(?:r1ú#bygroupz.+z (.*?)((?:\+z|\-ú#popz(.)zMissing end of comment tagz(?:\+z\-z    (.*?)((?:z(\-|\+|))\s*endraw\s*(?:\+zMissing end of raw directivez    \s*(\n|$)z(.*?)()(?=\n|$)).rCrDr‰rŠrÎrËÚ whitespace_reÚTOKEN_WHITESPACEÚfloat_reÚ TOKEN_FLOATÚ
integer_reÚ TOKEN_INTEGERÚname_rerbÚ    string_reÚ TOKEN_STRINGÚ operator_reÚTOKEN_OPERATORr{rrr¹r»rºr¼r½r¾r¿ÚjoinrÂrZrPrRrQr|rTrUrVrWÚTOKEN_RAW_BEGINÚ TOKEN_RAW_ENDrXrYrwrSÚTOKEN_LINECOMMENT_ENDrz) r€rnryrÔZ    tag_rulesZroot_tag_rulesZblock_start_reZ block_end_reZcomment_end_reZvariable_end_reZblock_suffix_reZ root_raw_reZ root_parts_rer<r<r@rÝs¨
 
 
 
 
 
ú
 
 
 
ÿÿýø ÿú÷ ÿúÿ
ö ýÿù     ÿù    ö ÿýýÿÁzLexer.__init__ricCst |j|¡S)z`Replace all newlines with the configured sequence in strings
        and template data.
        )rjrr¾)r€rcr<r<r@Ú_normalize_newlinesTszLexer._normalize_newlines)Úsourcer!rƒÚstaterNcCs&| ||||¡}t| |||¡||ƒS)z:Calls tokeniter + tokenize and wraps it in a token stream.)Ú    tokeniterr˜Úwrap)r€rér!rƒrêr™r<r<r@ÚtokenizeZszLexer.tokenize)r™r!rƒrNc
csr|D]f\}}}|tkrq|}|tkr.t}n0|tkr>t}n |ttfkrPqn|tkrd| |¡}nú|dkrr|}nì|t    kr–|}| 
¡s”t d|||ƒ‚nÈ|t krz$| |dd…¡  dd¡ d¡}WnJtk
r}z*t|ƒ d¡d ¡}    t |    |||ƒ|‚W5d    }~XYnXnL|tkr0t| d
d ¡d ƒ}n.|tkrLt| d
d ¡ƒ}n|tkr^t|}t|||ƒVqd    S) z‹This is called with the stream as returned by `tokenize` and wraps
        every token in a :class:`Token` and converts the value.
        ÚkeywordzInvalid character in identifierréÿÿÿÿÚasciiÚbackslashreplacezunicode-escaper8Nr¯r¢r)Úignored_tokensrXrTrYrUrårærZrèrbÚ isidentifierrráÚencodeÚdecodeÚ    Exceptionr‰rgÚstriprÞrŒÚreplacerÜrrãÚ    operatorsr^)
r€r™r!rƒr‚r`Z    value_strrcryÚmsgr<r<r@rìesT      ÿ
ÿþÿ$
 
 
z
Lexer.wrapccs@t |¡ddd…}|js,|ddkr,|d=d |¡}d}d}dg}|dk    rr|dkrr|d    ksdtd
ƒ‚| |d ¡|j|d}    t|ƒ}
g} d} d } |    D]r\}}}| ||¡}|dkrºq˜| rÎ|t    t
t fkrÎq˜t |t ƒrz| ¡}t |tƒr¶|d}td d„|ddd…Dƒƒ}|dkrN| ¡}|t|ƒd… d¡} |f|dd…•}nh|dkr¶|jr¶| ¡ t¡s¶| d¡d}|dksŽ| r¶t ||¡r¶|d|…f|dd…•}t|ƒD]¸\}}|jtkrÞ|||ƒ‚n–|dkr:| ¡ ¡D]4\}}|dk    rô|||fV|| d¡7}qtqôt|›dƒ‚n:||}|sR|tkr^|||fV|| d¡| 7}d} q¾nÒ|  ¡}|t!kr"|dkr¢|  d¡n€|dkr¸|  d¡nj|dkrÎ|  d¡nT|dkr"| sôt"d|›d|||ƒ‚|  #¡}||kr"t"d|›d|›d|||ƒ‚|s2|tkr>|||fV|| d¡7}|  ¡dd…dk} | $¡}|dk    rì|dkr†| #¡nV|dkrÒ| ¡ ¡D]$\}}|dk    rœ| |¡qܐqœt|›dƒ‚n
| |¡|j|d}    n||krt|›dƒ‚|}q”q˜||
krdSt"d ||›d!|›|||ƒ‚q”dS)"aThis method tokenizes the text and returns the tokens in a
        generator. Use this method if you just want to tokenize a template.
 
        .. versionchanged:: 3.0
            Only ``\n``, ``\r\n`` and ``\r`` are treated as line
            breaks.
        Nérïr¢Ú
rrrÖ)ÚvariableÚblockz invalid stateZ_beginTcss|]}|dk    r|VqdSrBr<)r=Úgr<r<r@rGÜsz"Lexer.tokeniter.<locals>.<genexpr>r)r(r×z= wanted to resolve the token dynamically but no group matchedr2r3r0r1r.r/)r3r1r/z unexpected 'ú'z ', expected 'rØzA wanted to resolve the new state dynamically but no group matchedz* yielded empty string without stack changezunexpected char z at )%rjrgr¿räÚAssertionErrorrurzrHÚmatchrWrUrYÚ
isinstanceÚtupleÚgroupsrÂržÚrstripÚcountr½Ú    groupdictr\rVÚrfindrÙÚ    fullmatchÚ    enumeraterÈr|ÚitemsÚ RuntimeErrorÚignore_if_emptyÚgrouprãrÚpopÚend)r€rér!rƒrêÚlinesÚposr‚ÚstackZ statetokensZ source_lengthZbalancing_stackZnewlines_strippedZ line_startingÚregexrÌZ    new_stateÚmrÚtextZ
strip_signÚstrippedZl_posÚidxr`rLrcr%Z expected_opÚpos2r<r<r@rë›sê
 ý  
þü ú      
 
 
ÿ 
 
 
 
 
 
 
ÿ
ü 
 
 
 
 
 
 
ÿ
 
ÿ
ÿzLexer.tokeniter)NNN)NN)NN)r…r†r‡rˆrr‰rèrŠr·r˜rír¶rÐrŒÚIteratorr^rìrër<r<r<r@r Õs<w    ûú üû :ûú)qrˆrCÚtypingrŠÚastrÚ collectionsrÚsysrZ _identifierrrßÚ
exceptionsrÚutilsrÚ TYPE_CHECKINGZtyping_extensionsÚternr    r ÚMutableMappingrÐr•rÑrÙrjrÓràÚ
IGNORECASEÚVERBOSErÝrÛZ    TOKEN_ADDZ TOKEN_ASSIGNZ TOKEN_COLONZ TOKEN_COMMAZ    TOKEN_DIVZ    TOKEN_DOTZTOKEN_EQZTOKEN_FLOORDIVZTOKEN_GTZ
TOKEN_GTEQZ TOKEN_LBRACEZTOKEN_LBRACKETZ TOKEN_LPARENZTOKEN_LTZ
TOKEN_LTEQZ    TOKEN_MODZ    TOKEN_MULZTOKEN_NEZ
TOKEN_PIPEZ    TOKEN_POWZ TOKEN_RBRACEZTOKEN_RBRACKETZ TOKEN_RPARENZTOKEN_SEMICOLONZ    TOKEN_SUBZ TOKEN_TILDErÚrÜrÞrbrárãrTrUrVrWrårærPrQrRrXrYrwrçrSrZr§r[rùr rOrHrrärxrâÚ    frozensetròrr‰r]rdrhrŒrlÚListr{r|Ú
NamedTupler^r—r˜rÁrrÂrËr r<r<r<r@Ú<module>s
 
 
ÿ
ò
 
õæ&ÿùÿ 
ÿ  )m