Skip to content

Commit 54906cf

Browse files
committed
WIP Jinja support.
1 parent 6f79c4c commit 54906cf

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Copyright © 2023 Innovatie Ltd. All rights reserved.
2+
"""
3+
Jinja support.
4+
"""
5+
import typing as t
6+
7+
from jinja2 import pass_context
8+
from jinja2.ext import Extension
9+
from jinja2.runtime import Context, Undefined
10+
11+
12+
class ReactPyExtension(Extension):
13+
"""
14+
Jinja has more expressive power than core Django's templates, and can
15+
directly handle expansions such as:
16+
17+
{{ component(*args, **kwargs) }}
18+
"""
19+
#
20+
# Therefore, there is no new tag to parse().
21+
#
22+
tags = {}
23+
24+
def __init__(self, environment):
25+
super().__init__(environment)
26+
#
27+
# All we need is to add global "component" to the environment.
28+
#
29+
environment.globals["component"] = self._component
30+
31+
@pass_context
32+
def _component(self, __context: Context, implementation: str, *args: t.Any,
33+
**kwargs: t.Any) -> t.Union[t.Any, Undefined]:
34+
"""
35+
This method is used to embed an existing ReactPy component into your
36+
Jinja2 template.
37+
38+
Args:
39+
implementation: String of the fully qualified name of a component.
40+
*args: The component's positional arguments.
41+
**kwargs: The component's keyword arguments.
42+
43+
Returns:
44+
Whatever the components returns.
45+
"""
46+
module, name = implementation.rsplit('.', 1)
47+
component = getattr(__import__(module, None, None, [name]), name)
48+
template_args = component(*args, **kwargs).render()
49+
#
50+
# TODO: template_args looks like this:
51+
#
52+
# {'tagName': 'h1', 'children': ['Hello World!']}
53+
#
54+
# and need to be run through the Django template in
55+
# templates/reactpy/component.html, or equivalent.
56+
#
57+
return template_args

0 commit comments

Comments
 (0)