python-liquid 2.3.6__py3-none-any.whl → 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- liquid/__about__.py +1 -0
- liquid/__init__.py +161 -187
- liquid/_base_tag.py +66 -0
- liquid/{utils/chain_map.py → _chain_map.py} +18 -19
- liquid/_context.py +465 -0
- liquid/_drop.py +108 -0
- liquid/_filter.py +174 -0
- liquid/_io.py +18 -0
- liquid/_lax_parser_mixin.py +100 -0
- liquid/_lexer.py +93 -0
- liquid/_lexer_extended.py +623 -0
- liquid/_lexer_legacy.py +536 -0
- liquid/_loader.py +84 -0
- liquid/{utils/lru_cache.py → _lru_cache.py} +28 -36
- liquid/_markup.py +253 -0
- liquid/_messages.py +292 -0
- liquid/_missing.py +3 -0
- liquid/_nothing.py +28 -0
- liquid/_parser.py +460 -0
- liquid/_parser_extended.py +293 -0
- liquid/_parser_legacy.py +819 -0
- liquid/_resource_limits.py +50 -0
- liquid/_slice.py +41 -0
- liquid/_static_analysis.py +503 -0
- liquid/_strftime.py +186 -0
- liquid/_template.py +536 -0
- liquid/drops/__init__.py +20 -0
- liquid/drops/forloop.py +78 -0
- liquid/drops/iterable.py +25 -0
- liquid/drops/range.py +76 -0
- liquid/drops/self_.py +45 -0
- liquid/drops/tablerowloop.py +142 -0
- liquid/drops/undefined.py +228 -0
- liquid/environment.py +717 -551
- liquid/exceptions.py +67 -214
- liquid/expressions.py +1184 -0
- liquid/filters/__init__.py +134 -0
- liquid/filters/abs.py +7 -0
- liquid/filters/append.py +5 -0
- liquid/filters/at_least.py +9 -0
- liquid/filters/at_most.py +9 -0
- liquid/filters/babel.py +560 -0
- liquid/filters/base64.py +26 -0
- liquid/filters/capitalize.py +5 -0
- liquid/filters/ceil.py +8 -0
- liquid/filters/compact.py +25 -0
- liquid/filters/concat.py +11 -0
- liquid/filters/date.py +27 -0
- liquid/filters/default.py +25 -0
- liquid/filters/divided_by.py +21 -0
- liquid/filters/downcase.py +5 -0
- liquid/filters/escape.py +56 -0
- liquid/filters/find.py +56 -0
- liquid/filters/first.py +19 -0
- liquid/filters/floor.py +8 -0
- liquid/filters/html.py +23 -0
- liquid/filters/index.py +12 -0
- liquid/filters/join.py +13 -0
- liquid/filters/json_.py +30 -0
- liquid/filters/last.py +17 -0
- liquid/filters/map.py +5 -0
- liquid/filters/minus.py +13 -0
- liquid/filters/modulo.py +18 -0
- liquid/filters/newline_to_br.py +16 -0
- liquid/filters/plus.py +13 -0
- liquid/filters/prepend.py +5 -0
- liquid/filters/reject.py +19 -0
- liquid/filters/remove.py +36 -0
- liquid/filters/replace.py +32 -0
- liquid/filters/reverse.py +5 -0
- liquid/filters/round.py +35 -0
- liquid/filters/size.py +25 -0
- liquid/filters/slice.py +39 -0
- liquid/filters/sort.py +148 -0
- liquid/filters/split.py +34 -0
- liquid/filters/squish.py +9 -0
- liquid/filters/strip.py +13 -0
- liquid/filters/strip_html.py +19 -0
- liquid/filters/strip_newlines.py +17 -0
- liquid/filters/sum.py +21 -0
- liquid/filters/times.py +13 -0
- liquid/filters/translate.py +380 -0
- liquid/filters/truncate.py +39 -0
- liquid/filters/uniq.py +11 -0
- liquid/filters/upcase.py +5 -0
- liquid/filters/url.py +18 -0
- liquid/filters/where.py +18 -0
- liquid/loaders/__init__.py +17 -0
- liquid/loaders/caching_file_system_loader.py +64 -0
- liquid/loaders/choice_loader.py +93 -0
- liquid/loaders/dict_loader.py +56 -0
- liquid/{builtin/loaders → loaders}/file_system_loader.py +51 -55
- liquid/{builtin/loaders → loaders}/mixins.py +39 -51
- liquid/loaders/package_loader.py +110 -0
- liquid/tags/__init__.py +61 -0
- liquid/tags/assign.py +68 -0
- liquid/tags/capture.py +83 -0
- liquid/tags/case.py +199 -0
- liquid/tags/comment.py +56 -0
- liquid/tags/cycle.py +131 -0
- liquid/tags/decrement.py +55 -0
- liquid/tags/doc.py +56 -0
- liquid/tags/echo.py +65 -0
- liquid/tags/else_.py +53 -0
- liquid/tags/error.py +51 -0
- liquid/tags/extends.py +448 -0
- liquid/tags/for_.py +421 -0
- liquid/tags/if_.py +156 -0
- liquid/tags/ifchanged.py +69 -0
- liquid/tags/include.py +223 -0
- liquid/tags/increment.py +55 -0
- liquid/tags/inline_comment.py +70 -0
- liquid/tags/liquid.py +56 -0
- liquid/tags/macro.py +281 -0
- liquid/tags/output.py +58 -0
- liquid/tags/raw.py +60 -0
- liquid/tags/render.py +245 -0
- liquid/tags/tablerow.py +254 -0
- liquid/tags/template_comment.py +56 -0
- liquid/tags/translate.py +316 -0
- liquid/tags/unless.py +121 -0
- liquid/tags/with_.py +83 -0
- liquid/tokens.py +370 -0
- {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/METADATA +32 -39
- python_liquid-3.0.0.dist-info/RECORD +128 -0
- {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/WHEEL +1 -1
- {python_liquid-2.3.6.dist-info → python_liquid-3.0.0.dist-info}/licenses/LICENSE +1 -1
- liquid/analyze_tags.py +0 -214
- liquid/ast.py +0 -252
- liquid/builtin/__init__.py +0 -203
- liquid/builtin/content.py +0 -41
- liquid/builtin/drops/__init__.py +0 -3
- liquid/builtin/drops/drops.py +0 -13
- liquid/builtin/expressions/__init__.py +0 -47
- liquid/builtin/expressions/_tokenize.py +0 -186
- liquid/builtin/expressions/arguments.py +0 -207
- liquid/builtin/expressions/filtered.py +0 -387
- liquid/builtin/expressions/logical.py +0 -672
- liquid/builtin/expressions/loop.py +0 -275
- liquid/builtin/expressions/path.py +0 -163
- liquid/builtin/expressions/primitive.py +0 -417
- liquid/builtin/filters/__init__.py +0 -0
- liquid/builtin/filters/array.py +0 -329
- liquid/builtin/filters/extra.py +0 -83
- liquid/builtin/filters/math.py +0 -129
- liquid/builtin/filters/misc.py +0 -137
- liquid/builtin/filters/string.py +0 -416
- liquid/builtin/illegal.py +0 -28
- liquid/builtin/loaders/__init__.py +0 -0
- liquid/builtin/loaders/caching_file_system_loader.py +0 -61
- liquid/builtin/loaders/choice_loader.py +0 -94
- liquid/builtin/loaders/dict_loader.py +0 -64
- liquid/builtin/loaders/package_loader.py +0 -132
- liquid/builtin/output.py +0 -74
- liquid/builtin/tags/__init__.py +0 -0
- liquid/builtin/tags/assign_tag.py +0 -75
- liquid/builtin/tags/capture_tag.py +0 -98
- liquid/builtin/tags/case_tag.py +0 -287
- liquid/builtin/tags/comment_tag.py +0 -77
- liquid/builtin/tags/cycle_tag.py +0 -132
- liquid/builtin/tags/decrement_tag.py +0 -59
- liquid/builtin/tags/doc_tag.py +0 -68
- liquid/builtin/tags/echo_tag.py +0 -45
- liquid/builtin/tags/for_tag.py +0 -337
- liquid/builtin/tags/if_tag.py +0 -209
- liquid/builtin/tags/ifchanged_tag.py +0 -94
- liquid/builtin/tags/include_tag.py +0 -251
- liquid/builtin/tags/increment_tag.py +0 -60
- liquid/builtin/tags/inline_comment_tag.py +0 -47
- liquid/builtin/tags/liquid_tag.py +0 -183
- liquid/builtin/tags/render_tag.py +0 -371
- liquid/builtin/tags/tablerow_tag.py +0 -320
- liquid/builtin/tags/unless_tag.py +0 -218
- liquid/context.py +0 -615
- liquid/expression.py +0 -41
- liquid/extra/__init__.py +0 -98
- liquid/extra/filters/__init__.py +0 -33
- liquid/extra/filters/_json.py +0 -33
- liquid/extra/filters/array.py +0 -60
- liquid/extra/filters/babel.py +0 -552
- liquid/extra/filters/html.py +0 -32
- liquid/extra/filters/translate.py +0 -448
- liquid/extra/tags/__init__.py +0 -17
- liquid/extra/tags/_with.py +0 -80
- liquid/extra/tags/extends_tag.py +0 -576
- liquid/extra/tags/macro_tag.py +0 -270
- liquid/extra/tags/snippet_tag.py +0 -107
- liquid/extra/tags/translate_tag.py +0 -388
- liquid/filter.py +0 -230
- liquid/future/__init__.py +0 -3
- liquid/future/environment.py +0 -30
- liquid/future/filters/__init__.py +0 -1
- liquid/future/tags/__init__.py +0 -1
- liquid/lex.py +0 -260
- liquid/limits.py +0 -66
- liquid/loader.py +0 -141
- liquid/messages.py +0 -357
- liquid/mode.py +0 -12
- liquid/output.py +0 -35
- liquid/parser.py +0 -119
- liquid/span.py +0 -35
- liquid/static_analysis.py +0 -443
- liquid/stream.py +0 -148
- liquid/stringify.py +0 -31
- liquid/tag.py +0 -47
- liquid/template.py +0 -658
- liquid/token.py +0 -145
- liquid/undefined.py +0 -218
- liquid/utils/__init__.py +0 -15
- liquid/utils/html.py +0 -57
- liquid/utils/text.py +0 -28
- python_liquid-2.3.6.dist-info/RECORD +0 -96
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
"""The built-in _unless_ tag."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import sys
|
|
6
|
-
from typing import TYPE_CHECKING
|
|
7
|
-
from typing import Iterable
|
|
8
|
-
from typing import Optional
|
|
9
|
-
from typing import TextIO
|
|
10
|
-
|
|
11
|
-
from liquid.ast import BlockNode
|
|
12
|
-
from liquid.ast import ConditionalBlockNode
|
|
13
|
-
from liquid.ast import IllegalNode
|
|
14
|
-
from liquid.ast import Node
|
|
15
|
-
from liquid.builtin.expressions import BooleanExpression
|
|
16
|
-
from liquid.exceptions import LiquidSyntaxError
|
|
17
|
-
from liquid.mode import Mode
|
|
18
|
-
from liquid.parser import eat_block
|
|
19
|
-
from liquid.parser import get_parser
|
|
20
|
-
from liquid.tag import Tag
|
|
21
|
-
from liquid.token import TOKEN_EOF
|
|
22
|
-
from liquid.token import TOKEN_EXPRESSION
|
|
23
|
-
from liquid.token import TOKEN_TAG
|
|
24
|
-
from liquid.token import Token
|
|
25
|
-
|
|
26
|
-
if TYPE_CHECKING:
|
|
27
|
-
from liquid import Environment
|
|
28
|
-
from liquid.context import RenderContext
|
|
29
|
-
from liquid.expression import Expression
|
|
30
|
-
from liquid.stream import TokenStream
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
TAG_UNLESS = sys.intern("unless")
|
|
34
|
-
TAG_ENDUNLESS = sys.intern("endunless")
|
|
35
|
-
TAG_ELSIF = sys.intern("elsif")
|
|
36
|
-
TAG_ELSE = sys.intern("else")
|
|
37
|
-
|
|
38
|
-
ENDUNLESSBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE, TOKEN_EOF))
|
|
39
|
-
ENDELSIFBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE))
|
|
40
|
-
ENDUNLESSELSEBLOCK = frozenset((TAG_ENDUNLESS, TAG_ELSIF, TAG_ELSE))
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class UnlessNode(Node):
|
|
44
|
-
"""The built-in _unless_ tag."""
|
|
45
|
-
|
|
46
|
-
__slots__ = (
|
|
47
|
-
"condition",
|
|
48
|
-
"consequence",
|
|
49
|
-
"alternatives",
|
|
50
|
-
"default",
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
def __init__(
|
|
54
|
-
self,
|
|
55
|
-
token: Token,
|
|
56
|
-
condition: Expression,
|
|
57
|
-
consequence: BlockNode,
|
|
58
|
-
alternatives: Optional[list[ConditionalBlockNode]] = None,
|
|
59
|
-
default: Optional[BlockNode] = None,
|
|
60
|
-
):
|
|
61
|
-
super().__init__(token)
|
|
62
|
-
self.condition = condition
|
|
63
|
-
self.consequence = consequence
|
|
64
|
-
self.alternatives = alternatives or []
|
|
65
|
-
self.default = default
|
|
66
|
-
|
|
67
|
-
self.blank = (
|
|
68
|
-
consequence.blank
|
|
69
|
-
and all(node.blank for node in self.alternatives)
|
|
70
|
-
and (not default or default.blank)
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
self.consequence.blank = self.blank
|
|
74
|
-
|
|
75
|
-
for node in self.alternatives:
|
|
76
|
-
node.blank = self.blank
|
|
77
|
-
|
|
78
|
-
if self.default:
|
|
79
|
-
self.default.blank = self.blank
|
|
80
|
-
|
|
81
|
-
def __str__(self) -> str:
|
|
82
|
-
alts = "".join(str(alt) for alt in self.alternatives)
|
|
83
|
-
default = ""
|
|
84
|
-
|
|
85
|
-
if self.default:
|
|
86
|
-
default = f"{{% else %}}{self.default}"
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
f"{{% unless {self.condition} %}}"
|
|
90
|
-
f"{self.consequence}"
|
|
91
|
-
f"{alts}"
|
|
92
|
-
f"{default}"
|
|
93
|
-
f"{{% endunless %}}"
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
def render_to_output(self, context: RenderContext, buffer: TextIO) -> int:
|
|
97
|
-
"""Render the node to the output buffer."""
|
|
98
|
-
if not self.condition.evaluate(context):
|
|
99
|
-
return self.consequence.render(context, buffer)
|
|
100
|
-
|
|
101
|
-
for alternative in self.alternatives:
|
|
102
|
-
if alternative.expression.evaluate(context):
|
|
103
|
-
return alternative.block.render(context, buffer)
|
|
104
|
-
|
|
105
|
-
if self.default:
|
|
106
|
-
return self.default.render(context, buffer)
|
|
107
|
-
|
|
108
|
-
return 0
|
|
109
|
-
|
|
110
|
-
async def render_to_output_async(
|
|
111
|
-
self, context: RenderContext, buffer: TextIO
|
|
112
|
-
) -> int:
|
|
113
|
-
"""Render the node to the output buffer."""
|
|
114
|
-
if not await self.condition.evaluate_async(context):
|
|
115
|
-
return await self.consequence.render_async(context, buffer)
|
|
116
|
-
|
|
117
|
-
for alternative in self.alternatives:
|
|
118
|
-
if await alternative.expression.evaluate_async(context):
|
|
119
|
-
return await alternative.block.render_async(context, buffer)
|
|
120
|
-
|
|
121
|
-
if self.default:
|
|
122
|
-
return await self.default.render_async(context, buffer)
|
|
123
|
-
|
|
124
|
-
return 0
|
|
125
|
-
|
|
126
|
-
def children(
|
|
127
|
-
self,
|
|
128
|
-
static_context: RenderContext, # noqa: ARG002
|
|
129
|
-
*,
|
|
130
|
-
include_partials: bool = True, # noqa: ARG002
|
|
131
|
-
) -> Iterable[Node]:
|
|
132
|
-
"""Return this node's children."""
|
|
133
|
-
yield self.consequence
|
|
134
|
-
yield from self.alternatives
|
|
135
|
-
if self.default:
|
|
136
|
-
yield self.default
|
|
137
|
-
|
|
138
|
-
def expressions(self) -> Iterable[Expression]:
|
|
139
|
-
"""Return this node's expressions."""
|
|
140
|
-
yield self.condition
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
class UnlessTag(Tag):
|
|
144
|
-
"""The built-in "unless" tag."""
|
|
145
|
-
|
|
146
|
-
name = TAG_UNLESS
|
|
147
|
-
end = TAG_ENDUNLESS
|
|
148
|
-
node_class = UnlessNode
|
|
149
|
-
|
|
150
|
-
mode = Mode.LAX
|
|
151
|
-
"""Tag specific parsing mode, independent from environment tolerance mode."""
|
|
152
|
-
|
|
153
|
-
def __init__(self, env: Environment):
|
|
154
|
-
super().__init__(env)
|
|
155
|
-
self.parser = get_parser(self.env)
|
|
156
|
-
|
|
157
|
-
def parse(self, stream: TokenStream) -> Node:
|
|
158
|
-
"""Parse tokens from _stream_ into an AST node."""
|
|
159
|
-
token = stream.eat(TOKEN_TAG)
|
|
160
|
-
tokens = stream.into_inner(tag=token)
|
|
161
|
-
condition = BooleanExpression.parse(self.env, tokens)
|
|
162
|
-
parse_block = get_parser(self.env).parse_block
|
|
163
|
-
consequence = parse_block(stream, ENDUNLESSBLOCK)
|
|
164
|
-
alternatives = []
|
|
165
|
-
|
|
166
|
-
while stream.current.is_tag(TAG_ELSIF):
|
|
167
|
-
# If the expression can't be parsed, eat the "elsif" block and
|
|
168
|
-
# continue to parse more "elsif" expression, if any.
|
|
169
|
-
try:
|
|
170
|
-
expr = BooleanExpression.parse(
|
|
171
|
-
self.env, stream.into_inner(tag=next(stream))
|
|
172
|
-
)
|
|
173
|
-
except LiquidSyntaxError as err:
|
|
174
|
-
self.env.error(err)
|
|
175
|
-
eat_block(stream, ENDELSIFBLOCK)
|
|
176
|
-
return IllegalNode(token)
|
|
177
|
-
|
|
178
|
-
alt_tok = stream.current
|
|
179
|
-
alt_block = parse_block(stream, ENDELSIFBLOCK)
|
|
180
|
-
|
|
181
|
-
alternatives.append(
|
|
182
|
-
ConditionalBlockNode(alt_tok, expression=expr, block=alt_block)
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
alternative: Optional[BlockNode] = None
|
|
186
|
-
|
|
187
|
-
if stream.current.is_tag(TAG_ELSE):
|
|
188
|
-
next(stream)
|
|
189
|
-
if stream.current.kind == TOKEN_EXPRESSION:
|
|
190
|
-
if self.mode == Mode.LAX:
|
|
191
|
-
# Superfluous expressions inside an `else` tag are ignored.
|
|
192
|
-
next(stream)
|
|
193
|
-
else:
|
|
194
|
-
raise LiquidSyntaxError(
|
|
195
|
-
"found an 'else' tag expression, did you mean 'elsif'?",
|
|
196
|
-
token=stream.current,
|
|
197
|
-
)
|
|
198
|
-
alternative = parse_block(stream, ENDUNLESSELSEBLOCK)
|
|
199
|
-
|
|
200
|
-
# Extraneous `else` and `elsif` blocks are ignored.
|
|
201
|
-
if not stream.current.is_tag(TAG_ENDUNLESS) and self.mode == Mode.LAX:
|
|
202
|
-
while stream.current.kind != TOKEN_EOF:
|
|
203
|
-
if (
|
|
204
|
-
stream.current.kind == TOKEN_TAG
|
|
205
|
-
and stream.current.value == TAG_ENDUNLESS
|
|
206
|
-
):
|
|
207
|
-
break
|
|
208
|
-
next(stream)
|
|
209
|
-
|
|
210
|
-
stream.expect(TOKEN_TAG, value=TAG_ENDUNLESS)
|
|
211
|
-
|
|
212
|
-
return self.node_class(
|
|
213
|
-
token=token,
|
|
214
|
-
condition=condition,
|
|
215
|
-
consequence=consequence,
|
|
216
|
-
alternatives=alternatives,
|
|
217
|
-
default=alternative,
|
|
218
|
-
)
|