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
liquid/tags/decrement.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from ..tokens import TOKEN_TAG_END
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .._context import RenderContext
|
|
9
|
+
from .._io import StringBuffer
|
|
10
|
+
from .._markup import Expression, Markup, Partial
|
|
11
|
+
from .._parser import Parser
|
|
12
|
+
from ..expressions import Name
|
|
13
|
+
from ..tokens import Token
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DecrementTag:
|
|
17
|
+
blank = False
|
|
18
|
+
tag = "decrement"
|
|
19
|
+
|
|
20
|
+
__slots__ = ("name", "token")
|
|
21
|
+
|
|
22
|
+
def __init__(self, token: Token, name: Name) -> None:
|
|
23
|
+
self.token = token
|
|
24
|
+
self.name = name
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def parse(token: Token, parser: Parser) -> Markup:
|
|
28
|
+
name = parser.parse_identifier()
|
|
29
|
+
parser.carry_whitespace_control()
|
|
30
|
+
parser.eat(TOKEN_TAG_END)
|
|
31
|
+
return DecrementTag(token, name)
|
|
32
|
+
|
|
33
|
+
def render(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
34
|
+
buffer.write(str(context.decrement(self.name.value)))
|
|
35
|
+
|
|
36
|
+
async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
37
|
+
buffer.write(str(context.decrement(self.name.value)))
|
|
38
|
+
|
|
39
|
+
def children(self) -> list[Markup]:
|
|
40
|
+
return []
|
|
41
|
+
|
|
42
|
+
def expressions(self) -> list[Expression]:
|
|
43
|
+
return []
|
|
44
|
+
|
|
45
|
+
def block_scope(self) -> list[Name]:
|
|
46
|
+
return []
|
|
47
|
+
|
|
48
|
+
def template_scope(self) -> list[Name]:
|
|
49
|
+
return [self.name]
|
|
50
|
+
|
|
51
|
+
def partials(self, context: RenderContext) -> list[Partial]:
|
|
52
|
+
return []
|
|
53
|
+
|
|
54
|
+
async def partials_async(self, context: RenderContext) -> list[Partial]:
|
|
55
|
+
return []
|
liquid/tags/doc.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from ..tokens import TOKEN_COMMENT, TOKEN_TAG_END, token_value
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .._context import RenderContext
|
|
9
|
+
from .._io import StringBuffer
|
|
10
|
+
from .._markup import Expression, Markup, Partial
|
|
11
|
+
from .._parser import Parser
|
|
12
|
+
from ..expressions import Name
|
|
13
|
+
from ..tokens import Token
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DocTag:
|
|
17
|
+
blank = True
|
|
18
|
+
tag = "doc"
|
|
19
|
+
|
|
20
|
+
__slots__ = ("text", "token")
|
|
21
|
+
|
|
22
|
+
def __init__(self, token: Token, text: str) -> None:
|
|
23
|
+
self.token = token
|
|
24
|
+
self.text = text
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def parse(token: Token, parser: Parser) -> Markup:
|
|
28
|
+
parser.carry_whitespace_control()
|
|
29
|
+
parser.eat(TOKEN_TAG_END)
|
|
30
|
+
comment = parser.eat(TOKEN_COMMENT)
|
|
31
|
+
parser.eat_tag_prefix("enddoc")
|
|
32
|
+
return DocTag(token, token_value(comment, parser.source))
|
|
33
|
+
|
|
34
|
+
def render(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
def children(self) -> list[Markup]:
|
|
41
|
+
return []
|
|
42
|
+
|
|
43
|
+
def expressions(self) -> list[Expression]:
|
|
44
|
+
return []
|
|
45
|
+
|
|
46
|
+
def block_scope(self) -> list[Name]:
|
|
47
|
+
return []
|
|
48
|
+
|
|
49
|
+
def template_scope(self) -> list[Name]:
|
|
50
|
+
return []
|
|
51
|
+
|
|
52
|
+
def partials(self, context: RenderContext) -> list[Partial]:
|
|
53
|
+
return []
|
|
54
|
+
|
|
55
|
+
async def partials_async(self, context: RenderContext) -> list[Partial]:
|
|
56
|
+
return []
|
liquid/tags/echo.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from ..tokens import TOKEN_TAG_END
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .._context import RenderContext
|
|
9
|
+
from .._io import StringBuffer
|
|
10
|
+
from .._markup import Expression, Markup, Partial
|
|
11
|
+
from .._parser import Parser
|
|
12
|
+
from ..expressions import Name
|
|
13
|
+
from ..tokens import Token
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class EchoTag:
|
|
17
|
+
blank = False
|
|
18
|
+
tag = "echo"
|
|
19
|
+
|
|
20
|
+
__slots__ = ("expression", "token")
|
|
21
|
+
|
|
22
|
+
def __init__(self, token: Token, expression: Expression) -> None:
|
|
23
|
+
self.token = token
|
|
24
|
+
self.expression = expression
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def parse(token: Token, parser: Parser) -> Markup:
|
|
28
|
+
expr = parser.parse_filtered_expression()
|
|
29
|
+
parser.carry_whitespace_control()
|
|
30
|
+
parser.eat(TOKEN_TAG_END)
|
|
31
|
+
return EchoTag(token, expr)
|
|
32
|
+
|
|
33
|
+
def render(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
34
|
+
buffer.write(
|
|
35
|
+
context.env.serialize(
|
|
36
|
+
self.expression.evaluate(context), context, self.expression.span
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
41
|
+
buffer.write(
|
|
42
|
+
context.env.serialize(
|
|
43
|
+
await self.expression.evaluate_async(context),
|
|
44
|
+
context,
|
|
45
|
+
self.expression.span,
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def children(self) -> list[Markup]:
|
|
50
|
+
return []
|
|
51
|
+
|
|
52
|
+
def expressions(self) -> list[Expression]:
|
|
53
|
+
return [self.expression]
|
|
54
|
+
|
|
55
|
+
def block_scope(self) -> list[Name]:
|
|
56
|
+
return []
|
|
57
|
+
|
|
58
|
+
def template_scope(self) -> list[Name]:
|
|
59
|
+
return []
|
|
60
|
+
|
|
61
|
+
def partials(self, context: RenderContext) -> list[Partial]:
|
|
62
|
+
return []
|
|
63
|
+
|
|
64
|
+
async def partials_async(self, context: RenderContext) -> list[Partial]:
|
|
65
|
+
return []
|
liquid/tags/else_.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from .._markup import is_blank_block, render_block, render_block_async
|
|
6
|
+
from ..expressions import BooleanLiteral
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .._context import RenderContext
|
|
10
|
+
from .._io import StringBuffer
|
|
11
|
+
from .._markup import Block, Expression, Markup, Partial
|
|
12
|
+
from ..expressions import Name
|
|
13
|
+
from ..tokens import Token
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ElseBlock:
|
|
17
|
+
tag = "else"
|
|
18
|
+
|
|
19
|
+
__slots__ = ("blank", "block", "expression", "token")
|
|
20
|
+
|
|
21
|
+
def __init__(self, token: Token, block: Block) -> None:
|
|
22
|
+
self.token = token
|
|
23
|
+
self.block = block
|
|
24
|
+
self.blank = is_blank_block(self.block)
|
|
25
|
+
self.expression = BooleanLiteral(token, True)
|
|
26
|
+
|
|
27
|
+
def render(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
28
|
+
render_block(self.block, context, buffer)
|
|
29
|
+
|
|
30
|
+
async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
31
|
+
await render_block_async(self.block, context, buffer)
|
|
32
|
+
|
|
33
|
+
def children(self) -> list[Markup]:
|
|
34
|
+
return [node for node in self.block if not isinstance(node, str)]
|
|
35
|
+
|
|
36
|
+
def expressions(self) -> list[Expression]:
|
|
37
|
+
return []
|
|
38
|
+
|
|
39
|
+
def block_scope(self) -> list[Name]:
|
|
40
|
+
return []
|
|
41
|
+
|
|
42
|
+
def template_scope(self) -> list[Name]:
|
|
43
|
+
return []
|
|
44
|
+
|
|
45
|
+
def partials(self, context: RenderContext) -> list[Partial]:
|
|
46
|
+
return []
|
|
47
|
+
|
|
48
|
+
async def partials_async(self, context: RenderContext) -> list[Partial]:
|
|
49
|
+
return []
|
|
50
|
+
|
|
51
|
+
def filter_strings(self) -> None:
|
|
52
|
+
markup: Block = [node for node in self.block if not isinstance(node, str)]
|
|
53
|
+
self.block = markup
|
liquid/tags/error.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .._context import RenderContext
|
|
7
|
+
from .._io import StringBuffer
|
|
8
|
+
from .._markup import Expression, Markup, Partial
|
|
9
|
+
from ..exceptions import LiquidSyntaxError
|
|
10
|
+
from ..expressions import Name
|
|
11
|
+
from ..tokens import Token
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ErrorNode:
|
|
15
|
+
blank = True
|
|
16
|
+
tag = ""
|
|
17
|
+
|
|
18
|
+
__slots__ = ("error", "token")
|
|
19
|
+
|
|
20
|
+
def __init__(self, token: Token, err: LiquidSyntaxError) -> None:
|
|
21
|
+
self.token = token
|
|
22
|
+
self.error = err
|
|
23
|
+
|
|
24
|
+
def __str__(self) -> str:
|
|
25
|
+
return self.error.detailed_message()
|
|
26
|
+
|
|
27
|
+
def render(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
28
|
+
if context.capture_errors:
|
|
29
|
+
raise self.error
|
|
30
|
+
|
|
31
|
+
async def render_async(self, context: RenderContext, buffer: StringBuffer) -> None:
|
|
32
|
+
if context.capture_errors:
|
|
33
|
+
raise self.error
|
|
34
|
+
|
|
35
|
+
def children(self) -> list[Markup]:
|
|
36
|
+
return []
|
|
37
|
+
|
|
38
|
+
def expressions(self) -> list[Expression]:
|
|
39
|
+
return []
|
|
40
|
+
|
|
41
|
+
def block_scope(self) -> list[Name]:
|
|
42
|
+
return []
|
|
43
|
+
|
|
44
|
+
def template_scope(self) -> list[Name]:
|
|
45
|
+
return []
|
|
46
|
+
|
|
47
|
+
def partials(self, context: RenderContext) -> list[Partial]:
|
|
48
|
+
return []
|
|
49
|
+
|
|
50
|
+
async def partials_async(self, context: RenderContext) -> list[Partial]:
|
|
51
|
+
return []
|