annotate libervia/web/pages/_browser/template.py @ 1533:285c49d7aad3

_browser (template): add `media_type_main` and `media_type_sub` filters: this is to follow main template module change, as string slicing is not done the same way in jinja2 and nunjucks.
author Goffi <goffi@goffi.org>
date Thu, 22 Jun 2023 16:36:18 +0200
parents de7e468e2d44
children 8d61654cb34f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 """Integrate templating system using nunjucks"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 from js_modules.nunjucks import nunjucks
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 from browser import window, document
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 import javascript
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
7
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 safe = nunjucks.runtime.SafeString.new
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 env = nunjucks.configure(
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 window.templates_root_url,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 {
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 'autoescape': True,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 'trimBlocks': True,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 'lstripBlocks': True,
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1333
diff changeset
15 'web': {'use_cache': True},
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 })
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
17
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 nunjucks.installJinjaCompat()
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
19 env.addGlobal("profile", window.profile)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
20 env.addGlobal("csrf_token", window.csrf_token)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
21 # FIXME: integrate gettext or equivalent here
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
22 env.addGlobal("_", lambda txt: txt)
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
23
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
24
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 class Indexer:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 """Index global to a page"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
27
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 def __init__(self):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 self._indexes = {}
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 def next(self, value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 if value not in self._indexes:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 self._indexes[value] = 0
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 return 0
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 self._indexes[value] += 1
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 return self._indexes[value]
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
37
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 def current(self, value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 return self._indexes.get(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
40
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 gidx = Indexer()
1529
de7e468e2d44 browser (template): fix use of `auto*` in `date_fmt`
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
43 # suffix used to avoid collision with IDs generated in static page
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 SCRIPT_SUFF = "__script__"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
45
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
46 def escape_html(txt):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
47 return (
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
48 txt
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
49 .replace('&', '&amp;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
50 .replace('<', '&lt;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
51 .replace('>', '&gt;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
52 .replace('"', '&quot;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
53 )
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
54
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
55
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
56 def get_args(n_args, *sig_args, **sig_kwargs):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
57 """Retrieve function args when they are transmitted using nunjucks convention
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
58
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
59 cf. https://mozilla.github.io/nunjucks/templating.html#keyword-arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
60 @param n_args: argument from nunjucks call
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
61 @param sig_args: expected positional arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
62 @param sig_kwargs: expected keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
63 @return: all expected arguments, with default value if not specified in nunjucks
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
64 """
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
65 # nunjucks set kwargs in last argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
66 given_args = list(n_args)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
67 try:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
68 given_kwargs = given_args.pop().to_dict()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
69 except (AttributeError, IndexError):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
70 # we don't have a dict as last argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
71 # that happens when there is no keyword argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
72 given_args = list(n_args)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
73 given_kwargs = {}
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
74 ret = given_args[:len(sig_args)]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
75 # we check if we have remaining positional arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
76 # in which case they may be specified in keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
77 for name in sig_args[len(given_args):]:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
78 try:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
79 value = given_kwargs.pop(name)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
80 except KeyError:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
81 raise ValueError(f"missing positional arguments {name!r}")
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
82 ret.append(value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
83
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
84 extra_pos_args = given_args[len(sig_args):]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
85 # and now the keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
86 for name, default in sig_kwargs.items():
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
87 if extra_pos_args:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
88 # kw args has been specified with a positional argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
89 ret.append(extra_pos_args.pop(0))
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
90 continue
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
91 value = given_kwargs.get(name, default)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
92 ret.append(value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
93
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
94 return ret
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
95
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
96
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 def _next_gidx(value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 """Use next current global index as suffix"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 next_ = gidx.next(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 return f"{value}{SCRIPT_SUFF}" if next_ == 0 else f"{value}_{SCRIPT_SUFF}{next_}"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
101
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 env.addFilter("next_gidx", _next_gidx)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
103
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
104
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 def _cur_gidx(value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 """Use current current global index as suffix"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 current = gidx.current(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 return f"{value}{SCRIPT_SUFF}" if not current else f"{value}_{SCRIPT_SUFF}{current}"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
109
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 env.addFilter("cur_gidx", _cur_gidx)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
111
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
112
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
113 def _xmlattr(d, autospace=True):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
114 if not d:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
115 return
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
116 d = d.to_dict()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
117 ret = [''] if autospace else []
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
118 for key, value in d.items():
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
119 if value is not None:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
120 ret.append(f'{escape_html(key)}="{escape_html(str(value))}"')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
121
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
122 return safe(' '.join(ret))
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
123
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
124 env.addFilter("xmlattr", _xmlattr)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
125
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
126
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 def _tojson(value):
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
128 return safe(escape_html(window.JSON.stringify(value)))
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
129
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 env.addFilter("tojson", _tojson)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
131
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
132
1533
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
133 def _media_type_main(value: str|None) -> str|None:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
134 """Return main type of a media type"""
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
135 if not value:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
136 return None
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
137 return value.partition("/")[0]
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
138
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
139 env.addFilter("media_type_main", _media_type_main)
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
140
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
141
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
142 def _media_type_sub(value: str|None) -> str|None:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
143 """Return main type of a media type"""
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
144 if not value:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
145 return None
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
146 return value.partition("/")[1]
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
147
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
148 env.addFilter("media_type_sub", _media_type_sub)
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
149
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
150
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 def _icon_use(name, cls=""):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 kwargs = cls.to_dict()
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 cls = kwargs.get('cls')
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 return safe(
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 '<svg class="svg-icon{cls}" xmlns="http://www.w3.org/2000/svg" '
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 'viewBox="0 0 100 100">\n'
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 ' <use href="#{name}"/>'
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 '</svg>\n'.format(name=name, cls=(" " + cls) if cls else "")
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 )
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
160
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 env.addGlobal("icon", _icon_use)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
162
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
163
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
164 def _date_fmt(
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
165 timestamp, *args
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
166 ):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
167 """Date formatting
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
168
1518
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
169 cf. libervia.backend.tools.common.date_utils for arguments details
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
170 """
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
171 fmt, date_only, auto_limit, auto_old_fmt, auto_new_fmt = get_args(
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
172 args, fmt="short", date_only=False, auto_limit=7, auto_old_fmt="short",
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
173 auto_new_fmt="relative",
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
174 )
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
175 from js_modules.moment import moment
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
176 date = moment.unix(timestamp)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
177
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
178 if fmt == "auto_day":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
179 fmt, auto_limit, auto_old_fmt, auto_new_fmt = "auto", 0, "short", "HH:mm"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
180 if fmt == "auto":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
181 limit = moment().startOf('day').subtract(auto_limit, 'days')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
182 m_fmt = auto_old_fmt if date < limit else auto_new_fmt
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
183
1529
de7e468e2d44 browser (template): fix use of `auto*` in `date_fmt`
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
184 elif fmt == "short":
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
185 m_fmt = "DD/MM/YY" if date_only else "DD/MM/YY HH:mm"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
186 elif fmt == "medium":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
187 m_fmt = "ll" if date_only else "lll"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
188 elif fmt == "long":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
189 m_fmt = "LL" if date_only else "LLL"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
190 elif fmt == "full":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
191 m_fmt = "dddd, LL" if date_only else "LLLL"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
192 elif fmt == "relative":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
193 return date.fromNow()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
194 elif fmt == "iso":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
195 if date_only:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
196 m_fmt == "YYYY-MM-DD"
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
197 else:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
198 return date.toISOString()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
199 else:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
200 raise NotImplementedError("free format is not implemented yet")
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
201
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
202 return date.format(m_fmt)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
203
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
204 env.addFilter("date_fmt", _date_fmt)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
205
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
206
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
207 class I18nExtension:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
208 """Extension to handle the {% trans %}{% endtrans %} statement"""
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
209 # FIXME: for now there is no translation, this extension only returns the string
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
210 # unmodified
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
211 tags = ['trans']
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
212
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
213 def parse(self, parser, nodes, lexer):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
214 tok = parser.nextToken()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
215 args = parser.parseSignature(None, True)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
216 parser.advanceAfterBlockEnd(tok.value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
217 body = parser.parseUntilBlocks('endtrans')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
218 parser.advanceAfterBlockEnd()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
219 return nodes.CallExtension.new(self._js_ext, 'run', args, [body])
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
220
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
221 def run(self, context, *args):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
222 body = args[-1]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
223 return body()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
224
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
225 @classmethod
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
226 def install(cls, env):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
227 ext = cls()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
228 ext_dict = {
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
229 "tags": ext.tags,
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
230 "parse": ext.parse,
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
231 "run": ext.run
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
232 }
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
233 ext._js_ext = javascript.pyobj2jsobj(ext_dict)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
234 env.addExtension(cls.__name__, ext._js_ext)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
235
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
236 I18nExtension.install(env)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
237
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
238
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 class Template:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
240
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 def __init__(self, tpl_name):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 self._tpl = env.getTemplate(tpl_name, True)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
243
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 def render(self, context):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 return self._tpl.render(context)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
246
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
247 def get_elt(self, context=None):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
248 if context is None:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
249 context = {}
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 raw_html = self.render(context)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 template_elt = document.createElement('template')
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 template_elt.innerHTML = raw_html
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
253 return template_elt.content.firstElementChild