annotate libervia/backend/tools/common/template.py @ 4351:6a0a081485b8

plugin autocrypt: Autocrypt protocol implementation: Implementation of autocrypt: `autocrypt` header is checked, and if present and no public key is known for the peer, the key is imported. `autocrypt` header is also added to outgoing message (only if an email gateway is detected). For the moment, the JID is use as identifier, but the real email used by gateway should be used in the future. rel 456
author Goffi <goffi@goffi.org>
date Fri, 28 Feb 2025 09:23:35 +0100
parents 00837fa13e5a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
3 # SAT: an XMPP client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3478
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
19 """Template generation"""
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
21 from collections import namedtuple
4031
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
22 from datetime import datetime
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
23 import html
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
24 import json
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
25 import os.path
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
26 from pathlib import Path
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
27 import re
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
28 import time
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
29 from typing import List, Optional, Tuple, Union
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
30 from xml.sax.saxutils import quoteattr
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
31
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
32 from babel import support
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
33 from babel import Locale
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
34 from babel.core import UnknownLocaleError
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
35 from jinja2 import is_undefined
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
36 from jinja2 import utils
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
37 from jinja2 import TemplateNotFound
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
38 from jinja2 import pass_context
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
39 from jinja2.loaders import split_template_path
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
40 from lxml import etree
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
41 from markupsafe import Markup as safe
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
42 import pygments
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
43 from pygments import lexers
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
44 from pygments import formatters
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
45
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
46 from libervia.backend.core import exceptions
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
47 from libervia.backend.core.constants import Const as C
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
48 from libervia.backend.core.i18n import _
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
49 from libervia.backend.core.log import getLogger
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
50 from libervia.backend.tools import config
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
51 from libervia.backend.tools.common import date_utils
4165
81faa85c9cfa template: add a `bare_jid` filter
Goffi <goffi@goffi.org>
parents: 4100
diff changeset
52 from libervia.frontends.tools import jid
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
53
3038
5f3068915686 common (template): suppress jinja2 depreaction warning (to be removed once 2.10.1 is released)
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
54 log = getLogger(__name__)
5f3068915686 common (template): suppress jinja2 depreaction warning (to be removed once 2.10.1 is released)
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
55
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 try:
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 import sat_templates
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 except ImportError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
59 raise exceptions.MissingModule(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
60 "sat_templates module is not available, please install it or check your path to "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
61 "use template engine"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
62 )
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 else:
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 sat_templates # to avoid pyflakes warning
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
65
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 try:
3061
948833e3b542 tools (common/template): removed warning catches, jinja2>=2.10.3 now handles them correctly
Goffi <goffi@goffi.org>
parents: 3038
diff changeset
67 import jinja2
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 except:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
69 raise exceptions.MissingModule(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
70 "Missing module jinja2, please install it from http://jinja.pocoo.org or with "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
71 "pip install jinja2"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
72 )
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
73
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
74
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
75 HTML_EXT = ("html", "xhtml")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
76 RE_ATTR_ESCAPE = re.compile(r"[^a-z_-]")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
77 SITE_RESERVED_NAMES = ("sat",)
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
78 TPL_RESERVED_CHARS = r"()/."
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
79 RE_TPL_RESERVED_CHARS = re.compile("[" + TPL_RESERVED_CHARS + "]")
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
80 BROWSER_DIR = "_browser"
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
81 BROWSER_META_FILE = "browser_meta.json"
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
82
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
83 TemplateData = namedtuple("TemplateData", ["site", "theme", "path"])
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
84
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
85
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
86 class TemplateLoader(jinja2.BaseLoader):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
87 """A template loader which handle site, theme and absolute paths"""
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
88
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
89 # TODO: list_templates should be implemented
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
90
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
91 def __init__(self, sites_paths, sites_themes, trusted=False):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93 @param trusted(bool): if True, absolue template paths will be allowed
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
94 be careful when using this option and sure that you can trust the template,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 as this allow the template to open any file on the system that the
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
96 launching user can access.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
97 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
98 if not sites_paths or not "" in sites_paths:
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
99 raise exceptions.InternalError("Invalid sites_paths")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
100 super(jinja2.BaseLoader, self).__init__()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
101 self.sites_paths = sites_paths
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
102 self.sites_themes = sites_themes
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
103 self.trusted = trusted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
104
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
105 @staticmethod
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
106 def parse_template(template):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
107 """Parse template path and return site, theme and path
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
108
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
109 @param template_path(unicode): path to template with parenthesis syntax
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
110 The site and/or theme can be specified in parenthesis just before the path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
111 e.g.: (some_theme)path/to/template.html
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
112 (/some_theme)path/to/template.html (equivalent to previous one)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
113 (other_site/other_theme)path/to/template.html
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
114 (other_site/)path/to/template.html (defaut theme for other_site)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
115 /absolute/path/to/template.html (in trusted environment only)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
116 @return (TemplateData):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
117 site, theme and template_path.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
118 if site is empty, SàT Templates are used
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
119 site and theme can be both None if absolute path is used
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
120 Relative path is the path from theme root dir e.g. blog/articles.html
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
121 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
122 if template.startswith("("):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
123 # site and/or theme are specified
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
124 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
125 theme_end = template.index(")")
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
126 except IndexError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
127 raise ValueError("incorrect site/theme in template")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
128 theme_data = template[1:theme_end]
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
129 theme_splitted = theme_data.split("/")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
130 if len(theme_splitted) == 1:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
131 site, theme = "", theme_splitted[0]
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
132 elif len(theme_splitted) == 2:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
133 site, theme = theme_splitted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
134 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
135 raise ValueError("incorrect site/theme in template")
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
136 template_path = template[theme_end + 1 :]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
137 if not template_path or template_path.startswith("/"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
138 raise ValueError("incorrect template path")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
139 elif template.startswith("/"):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
140 # this is an absolute path, so we have no site and no theme
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
141 site = None
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
142 theme = None
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
143 template_path = template
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
144 else:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
145 # a default template
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
146 site = ""
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
147 theme = C.TEMPLATE_THEME_DEFAULT
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
148 template_path = template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
149
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
150 if site is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
151 site = site.strip()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
152 if not site:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
153 site = ""
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
154 elif site in SITE_RESERVED_NAMES:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
155 raise ValueError(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
156 _("{site} can't be used as site name, " "it's reserved.").format(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
157 site=site
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
158 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
159 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
160
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
161 if theme is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
162 theme = theme.strip()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
163 if not theme:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
164 theme = C.TEMPLATE_THEME_DEFAULT
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
165 if RE_TPL_RESERVED_CHARS.search(theme):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
166 raise ValueError(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
167 _(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
168 "{theme} contain forbidden char. Following chars "
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
169 "are forbidden: {reserved}"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
170 ).format(theme=theme, reserved=TPL_RESERVED_CHARS)
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
171 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
172
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
173 return TemplateData(site, theme, template_path)
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
174
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
175 @staticmethod
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
176 def get_sites_and_themes(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
177 site: str,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
178 theme: str,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
179 settings: Optional[dict] = None,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
180 ) -> List[Tuple[str, str]]:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
181 """Get sites and themes to check for template/file
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
182
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
183 Will add default theme and default site in search list when suitable. Settings'
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
184 `fallback` can be used to modify behaviour: themes in this list will then be used
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
185 instead of default (it can also be empty list or None, in which case no fallback
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
186 is used).
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
187
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
188 @param site: site requested
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
189 @param theme: theme requested
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
190 @return: site and theme couples to check
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
191 """
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
192 if settings is None:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
193 settings = {}
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
194 sites_and_themes = [[site, theme]]
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
195 fallback = settings.get("fallback", [C.TEMPLATE_THEME_DEFAULT])
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
196 for fb_theme in fallback:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
197 if theme != fb_theme:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
198 sites_and_themes.append([site, fb_theme])
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
199 if site:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
200 for fb_theme in fallback:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
201 sites_and_themes.append(["", fb_theme])
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
202 return sites_and_themes
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
203
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
204 def _get_template_f(self, site, theme, path_elts):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
205 """Look for template and return opened file if found
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
206
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
207 @param site(unicode): names of site to check
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
208 (default site will also checked)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
209 @param theme(unicode): theme to check (default theme will also be checked)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
210 @param path_elts(iterable[str]): elements of template path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
211 @return (tuple[(File, None), (str, None)]): a tuple with:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
212 - opened template, or None if not found
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
213 - absolute file path, or None if not found
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
214 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
215 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
216 raise exceptions.InternalError(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
217 "_get_template_f must not be used with absolute path"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
218 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
219 settings = self.sites_themes[site][theme]["settings"]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
220 for site_to_check, theme_to_check in self.get_sites_and_themes(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
221 site, theme, settings
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
222 ):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
223 try:
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
224 base_path = self.sites_paths[site_to_check]
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
225 except KeyError:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
226 log.warning(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
227 _("Unregistered site requested: {site_to_check}").format(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
228 site_to_check=site_to_check
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
229 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
230 )
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
231 filepath = os.path.join(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
232 base_path, C.TEMPLATE_TPL_DIR, theme_to_check, *path_elts
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
233 )
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
234 f = utils.open_if_exists(filepath, "r")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
235 if f is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
236 return f, filepath
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
237 return None, None
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
238
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
239 def get_source(self, environment, template):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
240 """Retrieve source handling site and themes
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
241
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
242 If the path is absolute it is used directly if in trusted environment
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
243 else and exception is raised.
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
244 if the path is just relative, "default" theme is used.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
245 @raise PermissionError: absolute path used in untrusted environment
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
246 """
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
247 site, theme, template_path = self.parse_template(template)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
248
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
249 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
250 # we have an abolute template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
251 if theme is not None:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
252 raise exceptions.InternalError(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
253 "We can't have a theme with absolute " "template."
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
254 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
255 if not self.trusted:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
256 log.error(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
257 _(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
258 "Absolute template used while unsecure is disabled, hack "
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
259 "attempt? Template: {template}"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
260 ).format(template=template)
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
261 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
262 raise exceptions.PermissionError("absolute template is not allowed")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
263 filepath = template_path
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
264 f = utils.open_if_exists(filepath, "r")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
265 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
266 # relative path, we have to deal with site and theme
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
267 assert theme and template_path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
268 path_elts = split_template_path(template_path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
269 # if we have non default site, we check it first, else we only check default
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
270 f, filepath = self._get_template_f(site, theme, path_elts)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
271
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
272 if f is None:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
273 if (
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
274 site is not None
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
275 and path_elts[0] == "error"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
276 and os.path.splitext(template_path)[1][1:] in HTML_EXT
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
277 ):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
278 # if an HTML error is requested but doesn't exist, we try again
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
279 # with base error.
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
280 f, filepath = self._get_template_f(site, theme, ("error", "base.html"))
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
281 if f is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
282 raise exceptions.InternalError("error/base.html should exist")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
283 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
284 raise TemplateNotFound(template)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
285
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
286 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
287 contents = f.read()
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
288 finally:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
289 f.close()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
290
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
291 mtime = os.path.getmtime(filepath)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
292
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
293 def uptodate():
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
294 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
295 return os.path.getmtime(filepath) == mtime
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
296 except OSError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
297 return False
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
298
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
299 return contents, filepath, uptodate
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
300
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
301
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
302 class Indexer(object):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
303 """Index global to a page"""
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
304
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
305 def __init__(self):
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
306 self._indexes = {}
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
307
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
308 def next(self, value):
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
309 if value not in self._indexes:
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
310 self._indexes[value] = 0
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
311 return 0
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
312 self._indexes[value] += 1
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
313 return self._indexes[value]
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
314
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
315 def current(self, value):
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
316 return self._indexes.get(value)
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
317
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
318
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
319 class ScriptsHandler(object):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
320 def __init__(self, renderer, template_data):
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
321 self.renderer = renderer
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
322 self.template_data = template_data
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
323 self.scripts = [] #  we don't use a set because order may be important
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
324
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
325 def include(self, library_name, attribute="defer"):
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
326 """Mark that a script need to be imported.
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
327
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
328 Must be used before base.html is extended, as <script> are generated there.
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
329 If called several time with the same library, it will be imported once.
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
330 @param library_name(unicode): name of the library to import
2465
bb0bbcc80fc8 template: boolean attribute can now be specified when importing a script, and default to "defer"
Goffi <goffi@goffi.org>
parents: 2454
diff changeset
331 @param loading:
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
332 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
333 if attribute not in ("defer", "async", ""):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
334 raise exceptions.DataError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
335 _('Invalid attribute, please use one of "defer", "async" or ""')
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
336 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
337 if not library_name.endswith(".js"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
338 library_name = library_name + ".js"
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
339 if (library_name, attribute) not in self.scripts:
2465
bb0bbcc80fc8 template: boolean attribute can now be specified when importing a script, and default to "defer"
Goffi <goffi@goffi.org>
parents: 2454
diff changeset
340 self.scripts.append((library_name, attribute))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
341 return ""
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
342
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
343 def generate_scripts(self):
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
344 """Generate the <script> elements
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
345
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
346 @return (unicode): <scripts> HTML tags
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
347 """
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
348 scripts = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
349 tpl = "<script src={src} {attribute}></script>"
2465
bb0bbcc80fc8 template: boolean attribute can now be specified when importing a script, and default to "defer"
Goffi <goffi@goffi.org>
parents: 2454
diff changeset
350 for library, attribute in self.scripts:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
351 library_path = self.renderer.get_static_path(self.template_data, library)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
352 if library_path is None:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
353 log.warning(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
354 _("Can't find {libary} javascript library").format(library=library)
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
355 )
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
356 continue
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
357 path = self.renderer.get_front_url(library_path)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
358 scripts.append(tpl.format(src=quoteattr(path), attribute=attribute))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
359 return safe("\n".join(scripts))
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
360
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
361
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
362 class Environment(jinja2.Environment):
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
363
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
364 def get_template(self, name, parent=None, globals=None):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
365 if name[0] not in ("/", "("):
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
366 # if name is not an absolute path or a full template name (this happen on
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
367 # extend or import during rendering), we convert it to a full template name.
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
368 # This is needed to handle cache correctly when a base template is overriden.
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
369 # Without that, we could not distinguish something like base/base.html if
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
370 # it's launched from some_site/some_theme or from [default]/default
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
371 name = "({site}/{theme}){template}".format(
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
372 site=self._template_data.site,
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
373 theme=self._template_data.theme,
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
374 template=name,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
375 )
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
376
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
377 return super(Environment, self).get_template(name, parent, globals)
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
378
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
379
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
380 class Renderer(object):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
381
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
382 def __init__(self, host, front_url_filter=None, trusted=False, private=False):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
383 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
384 @param front_url_filter(callable): filter to retrieve real url of a directory/file
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
385 The callable will get a two arguments:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
386 - a dict with a "template_data" key containing TemplateData instance of
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
387 current template. Only site and theme should be necessary.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
388 - the relative URL of the file to retrieve, relative from theme root
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
389 None to use default filter which return real path on file
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
390 Need to be specified for web rendering, to reflect URL seen by end user
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
391 @param trusted(bool): if True, allow to access absolute path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
392 Only set to True if environment is safe (e.g. command line tool)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
393 @param private(bool): if True, also load sites from sites_path_private_dict
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
394 """
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
395 self.host = host
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
396 self.trusted = trusted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
397 self.sites_paths = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
398 "": os.path.dirname(sat_templates.__file__),
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
399 }
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
400 self.sites_themes = {}
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
401 conf = config.parse_main_conf()
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
402 public_sites = config.config_get(conf, None, "sites_path_public_dict", {})
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
403 sites_data = [public_sites]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
404 if private:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
405 private_sites = config.config_get(conf, None, "sites_path_private_dict", {})
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
406 sites_data.append(private_sites)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
407 for sites in sites_data:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
408 normalised = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
409 for name, path in sites.items():
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
410 if RE_TPL_RESERVED_CHARS.search(name):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
411 log.warning(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
412 _(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
413 'Can\'t add "{name}" site, it contains forbidden '
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
414 "characters. Forbidden characters are {forbidden}."
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
415 ).format(name=name, forbidden=TPL_RESERVED_CHARS)
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
416 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
417 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
418 path = os.path.expanduser(os.path.normpath(path))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
419 if not path or not path.startswith("/"):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
420 log.warning(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
421 _(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
422 'Can\'t add "{name}" site, it should map to an '
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
423 "absolute path"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
424 ).format(name=name)
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
425 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
426 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
427 normalised[name] = path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
428 self.sites_paths.update(normalised)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
429
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
430 for site, site_path in self.sites_paths.items():
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
431 tpl_path = Path(site_path) / C.TEMPLATE_TPL_DIR
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
432 for p in tpl_path.iterdir():
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
433 if not p.is_dir():
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
434 continue
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
435 log.debug(f"theme found for {site or 'default site'}: {p.name}")
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
436 theme_data = self.sites_themes.setdefault(site, {})[p.name] = {
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
437 "path": p,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
438 "settings": {},
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
439 }
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
440 theme_settings = p / "settings.json"
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
441 if theme_settings.is_file:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
442 try:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
443 with theme_settings.open() as f:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
444 settings = json.load(f)
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
445 except Exception as e:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
446 log.warning(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
447 _("Can't load theme settings at {path}: {e}").format(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
448 path=theme_settings, e=e
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
449 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
450 )
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
451 else:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
452 log.debug(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
453 f"found settings for theme {p.name!r} at {theme_settings}"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
454 )
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
455 fallback = settings.get("fallback")
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
456 if fallback is None:
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
457 settings["fallback"] = []
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
458 elif isinstance(fallback, str):
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
459 settings["fallback"] = [fallback]
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
460 elif not isinstance(fallback, list):
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
461 raise ValueError(
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
462 'incorrect type for "fallback" in settings '
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
463 f"({type(fallback)}) at {theme_settings}: {fallback}"
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
464 )
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
465 theme_data["settings"] = settings
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
466 browser_path = p / BROWSER_DIR
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
467 if browser_path.is_dir():
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
468 theme_data["browser_path"] = browser_path
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
469 browser_meta_path = browser_path / BROWSER_META_FILE
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
470 if browser_meta_path.is_file():
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
471 try:
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
472 with browser_meta_path.open() as f:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
473 theme_data["browser_meta"] = json.load(f)
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
474 except Exception as e:
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
475 log.error(
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
476 f"Can't parse browser metadata at {browser_meta_path}: {e}"
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
477 )
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
478 continue
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
479
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
480 self.env = Environment(
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
481 loader=TemplateLoader(
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
482 sites_paths=self.sites_paths,
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
483 sites_themes=self.sites_themes,
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
484 trusted=trusted,
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
485 ),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
486 autoescape=jinja2.select_autoescape(["html", "xhtml", "xml"]),
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
487 trim_blocks=True,
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
488 lstrip_blocks=True,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
489 extensions=["jinja2.ext.i18n"],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
490 )
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
491 self.env._template_data = None
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
492 self._locale_str = C.DEFAULT_LOCALE
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
493 self._locale = Locale.parse(self._locale_str)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
494 self.install_translations()
2906
7dbdbd132649 template (i18n): activate ext.i18n.trimmed policy, to have clean translation strings. Set minimal jinja2 version to 2.10
Goffi <goffi@goffi.org>
parents: 2903
diff changeset
495
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
496 # we want to have access to SàT constants in templates
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
497 self.env.globals["C"] = C
2906
7dbdbd132649 template (i18n): activate ext.i18n.trimmed policy, to have clean translation strings. Set minimal jinja2 version to 2.10
Goffi <goffi@goffi.org>
parents: 2903
diff changeset
498
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
499 # custom filters
4165
81faa85c9cfa template: add a `bare_jid` filter
Goffi <goffi@goffi.org>
parents: 4100
diff changeset
500 self.env.filters["bare_jid"] = self._bare_jid
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
501 self.env.filters["next_gidx"] = self._next_gidx
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
502 self.env.filters["cur_gidx"] = self._cur_gidx
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
503 self.env.filters["date_fmt"] = self._date_fmt
4031
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
504 self.env.filters["timestamp_to_hour"] = self._timestamp_to_hour
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
505 self.env.filters["delta_to_human"] = date_utils.delta2human
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
506 self.env.filters["xmlui_class"] = self._xmlui_class
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
507 self.env.filters["attr_escape"] = self.attr_escape
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
508 self.env.filters["item_filter"] = self._item_filter
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
509 self.env.filters["adv_format"] = self._adv_format
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
510 self.env.filters["dict_ext"] = self._dict_ext
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
511 self.env.filters["highlight"] = self.highlight
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
512 self.env.filters["front_url"] = (
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
513 self._front_url if front_url_filter is None else front_url_filter
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
514 )
4100
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
515 self.env.filters["media_type_main"] = self.media_type_main
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
516 self.env.filters["media_type_sub"] = self.media_type_sub
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
517 # custom tests
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
518 self.env.tests["in_the_past"] = self._in_the_past
4322
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
519 self.fa_svgs_path = Path(host.media_dir, "fonts/fontawesome/svgs")
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
520
2906
7dbdbd132649 template (i18n): activate ext.i18n.trimmed policy, to have clean translation strings. Set minimal jinja2 version to 2.10
Goffi <goffi@goffi.org>
parents: 2903
diff changeset
521 # policies
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
522 self.env.policies["ext.i18n.trimmed"] = True
3306
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
523 self.env.policies["json.dumps_kwargs"] = {
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
524 "sort_keys": True,
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
525 # if object can't be serialised, we use None
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
526 "default": lambda o: o.to_json() if hasattr(o, "to_json") else None,
3306
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
527 }
2906
7dbdbd132649 template (i18n): activate ext.i18n.trimmed policy, to have clean translation strings. Set minimal jinja2 version to 2.10
Goffi <goffi@goffi.org>
parents: 2903
diff changeset
528
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
529 def get_front_url(self, template_data, path=None):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
530 """Give front URL (i.e. URL seen by end-user) of a path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
531
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
532 @param template_data[TemplateData]: data of current template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
533 @param path(unicode, None): relative path of file to get,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
534 if set, will remplate template_data.path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
535 """
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
536 return self.env.filters["front_url"](
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
537 {"template_data": template_data}, path or template_data.path
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
538 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
539
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
540 def install_translations(self):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
541 # TODO: support multi translation
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
542 # for now, only translations in sat_templates are handled
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
543 self.translations = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
544 for site_key, site_path in self.sites_paths.items():
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
545 site_prefix = "[{}] ".format(site_key) if site_key else ""
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
546 i18n_dir = os.path.join(site_path, "i18n")
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
547 for lang_dir in os.listdir(i18n_dir):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
548 lang_path = os.path.join(i18n_dir, lang_dir)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
549 if not os.path.isdir(lang_path):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
550 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
551 po_path = os.path.join(lang_path, "LC_MESSAGES/sat.mo")
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
552 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
553 locale = Locale.parse(lang_dir)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
554 with open(po_path, "rb") as f:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
555 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
556 translations = self.translations[locale]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
557 except KeyError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
558 self.translations[locale] = support.Translations(f, "sat")
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
559 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
560 translations.merge(support.Translations(f, "sat"))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
561 except EnvironmentError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
562 log.error(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
563 _("Can't find template translation at {path}").format(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
564 path=po_path
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
565 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
566 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
567 except UnknownLocaleError as e:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
568 log.error(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
569 _("{site}Invalid locale name: {msg}").format(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
570 site=site_prefix, msg=e
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
571 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
572 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
573 else:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
574 log.info(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
575 _("{site}loaded {lang} templates translations").format(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
576 site=site_prefix, lang=lang_dir
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
577 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
578 )
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
579
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
580 default_locale = Locale.parse(self._locale_str)
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
581 if default_locale not in self.translations:
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
582 # default locale disable gettext,
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
583 # so we can use None instead of a Translations instance
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
584 self.translations[default_locale] = None
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
585
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
586 self.env.install_null_translations(True)
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
587 # we generate a tuple of locales ordered by display name that templates can access
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
588 # through the "locales" variable
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
589 self.locales = tuple(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
590 sorted(list(self.translations.keys()), key=lambda l: l.language_name.lower())
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
591 )
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
592
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
593 def set_locale(self, locale_str):
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
594 """set current locale
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
595
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
596 change current translation locale and self self._locale and self._locale_str
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
597 """
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
598 if locale_str == self._locale_str:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
599 return
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
600 if locale_str == "en":
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
601 # we default to GB English when it's not specified
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
602 # one of the main reason is to avoid the nonsense U.S. short date format
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
603 locale_str = "en_GB"
2323
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
604 try:
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
605 locale = Locale.parse(locale_str)
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
606 except ValueError as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
607 log.warning(_("invalid locale value: {msg}").format(msg=e))
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
608 locale_str = self._locale_str = C.DEFAULT_LOCALE
2323
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
609 locale = Locale.parse(locale_str)
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
610
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
611 locale_str = str(locale)
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
612 if locale_str != C.DEFAULT_LOCALE:
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
613 try:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
614 translations = self.translations[locale]
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
615 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
616 log.warning(_("Can't find locale {locale}".format(locale=locale)))
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
617 locale_str = C.DEFAULT_LOCALE
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
618 locale = Locale.parse(self._locale_str)
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
619 else:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
620 self.env.install_gettext_translations(translations, True)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
621 log.debug(_("Switched to {lang}").format(lang=locale.english_name))
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
622
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
623 if locale_str == C.DEFAULT_LOCALE:
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
624 self.env.install_null_translations(True)
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
625
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
626 self._locale = locale
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
627 self._locale_str = locale_str
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
628
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
629 def get_theme_and_root(self, template):
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
630 """retrieve theme and root dir of a given template
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
631
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
632 @param template(unicode): template to parse
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
633 @return (tuple[unicode, unicode]): theme and absolute path to theme's root dir
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
634 @raise NotFound: requested site has not been found
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
635 """
4075
47401850dec6 refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
636 # FIXME: check use in CLI frontend, and include site
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
637 site, theme, __ = self.env.loader.parse_template(template)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
638 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
639 # absolute template
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
640 return "", os.path.dirname(template)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
641 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
642 site_root_dir = self.sites_paths[site]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
643 except KeyError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
644 raise exceptions.NotFound
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
645 return theme, os.path.join(site_root_dir, C.TEMPLATE_TPL_DIR, theme)
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
646
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
647 def get_themes_data(self, site_name):
3266
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
648 try:
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
649 return self.sites_themes[site_name]
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
650 except KeyError:
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
651 raise exceptions.NotFound(f"no theme found for {site_name}")
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
652
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
653 def get_static_path(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
654 self, template_data: TemplateData, filename: str, settings: Optional[dict] = None
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
655 ) -> Optional[TemplateData]:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
656 """Retrieve path of a static file if it exists with current theme or default
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
657
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
658 File will be looked at <site_root_dir>/<theme_dir>/<static_dir>/filename,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
659 then <site_root_dir>/<default_theme_dir>/<static_dir>/filename anf finally
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
660 <default_site>/<default_theme_dir>/<static_dir> (i.e. sat_templates).
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
661 In case of absolute URL, base dir of template is used as base. For instance if
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
662 template is an absolute template to "/some/path/template.html", file will be
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
663 checked at "/some/path/<filename>"
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
664 @param template_data: data of current template
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
665 @param filename: name of the file to retrieve
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
666 @param settings: theme settings, can be used to modify behaviour
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
667 @return: built template data instance where .path is
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
668 the relative path to the file, from theme root dir.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
669 None if not found.
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
670 """
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
671 if template_data.site is None:
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
672 # we have an absolue path
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
673 if not template_data.theme is None or not template_data.path.startswith("/"):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
674 raise exceptions.InternalError(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
675 "invalid template data, was expecting absolute URL"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
676 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
677 static_dir = os.path.dirname(template_data.path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
678 file_path = os.path.join(static_dir, filename)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
679 if os.path.exists(file_path):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
680 return TemplateData(site=None, theme=None, path=file_path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
681 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
682 return None
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
683
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
684 sites_and_themes = TemplateLoader.get_sites_and_themes(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
685 template_data.site, template_data.theme, settings
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
686 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
687 for site, theme in sites_and_themes:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
688 site_root_dir = self.sites_paths[site]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
689 relative_path = os.path.join(C.TEMPLATE_STATIC_DIR, filename)
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
690 absolute_path = os.path.join(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
691 site_root_dir, C.TEMPLATE_TPL_DIR, theme, relative_path
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
692 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
693 if os.path.exists(absolute_path):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
694 return TemplateData(site=site, theme=theme, path=relative_path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
695
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
696 return None
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
697
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
698 def _append_css_paths(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
699 self,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
700 template_data: TemplateData,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
701 css_files: list,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
702 css_files_noscript: list,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
703 name_root: str,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
704 settings: dict,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
705 ) -> None:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
706 """Append found css to css_files and css_files_noscript
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
707
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
708 @param css_files: list to fill of relative path to found css file
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
709 @param css_files_noscript: list to fill of relative path to found css file
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
710 with "_noscript" suffix
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
711 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
712 name = name_root + ".css"
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
713 css_path = self.get_static_path(template_data, name, settings)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
714 if css_path is not None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
715 css_files.append(self.get_front_url(css_path))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
716 noscript_name = name_root + "_noscript.css"
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
717 noscript_path = self.get_static_path(template_data, noscript_name, settings)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
718 if noscript_path is not None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
719 css_files_noscript.append(self.get_front_url(noscript_path))
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
720
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
721 def get_css_files(self, template_data):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
722 """Retrieve CSS files to use according template_data
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
723
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
724 For each element of the path, a .css file is looked for in /static, and returned
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
725 if it exists.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
726 Previous element are kept by replacing '/' with '_'.
2877
f8427bf8c072 tools (common/template): always use highlight.css if present.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
727 styles_extra.css, styles.css, highlight.css and fonts.css are always used if they
f8427bf8c072 tools (common/template): always use highlight.css if present.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
728 exist.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
729 For each found file, if a file with the same name and "_noscript" suffix exists,
3267
2eeca6fd08f7 tools (common/template): typos
Goffi <goffi@goffi.org>
parents: 3266
diff changeset
730 it will be returned is second part of resulting tuple.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
731 For instance, if template_data is (some_site, some_theme, blog/articles.html),
3267
2eeca6fd08f7 tools (common/template): typos
Goffi <goffi@goffi.org>
parents: 3266
diff changeset
732 following files are returned, each time trying [some_site root] first,
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
733 then default site (i.e. sat_templates) root:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
734 - some_theme/static/styles.css is returned if it exists
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
735 else default/static/styles.css
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
736 - some_theme/static/blog.css is returned if it exists
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
737 else default/static/blog.css (if it exists too)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
738 - some_theme/static/blog_articles.css is returned if it exists
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
739 else default/static/blog_articles.css (if it exists too)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
740 and for each found files, if same file with _noscript suffix exists, it is put
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
741 in noscript list (for instance (some_theme/static/styles_noscript.css)).
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
742 The behaviour may be changed with theme settings: if "fallback" is set, specified
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
743 themes will be checked instead of default. The theme will be checked in given
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
744 order, and "fallback" may be None or empty list to not check anything.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
745 @param template_data(TemplateData): data of the current template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
746 @return (tuple[list[unicode], list[unicode]]): a tuple with:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
747 - front URLs of CSS files to use
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
748 - front URLs of CSS files to use when scripts are not enabled
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
749 """
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
750 # TODO: some caching would be nice
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
751 css_files = []
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
752 css_files_noscript = []
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
753 path_elems = template_data.path.split("/")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
754 path_elems[-1] = os.path.splitext(path_elems[-1])[0]
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
755 site = template_data.site
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
756 if site is None:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
757 # absolute path
3478
b65175eb7769 tools (common/template): new `fallback` settings:
Goffi <goffi@goffi.org>
parents: 3311
diff changeset
758 settings = {}
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
759 else:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
760 settings = self.sites_themes[site][template_data.theme]["settings"]
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
761
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
762 css_path = self.get_static_path(template_data, "fonts.css", settings)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
763 if css_path is not None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
764 css_files.append(self.get_front_url(css_path))
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
765
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
766 for name_root in ("styles", "styles_extra", "highlight"):
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
767 self._append_css_paths(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
768 template_data, css_files, css_files_noscript, name_root, settings
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
769 )
2683
38af118a7d74 template: better css files order
Goffi <goffi@goffi.org>
parents: 2680
diff changeset
770
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
771 for idx in range(len(path_elems)):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
772 name_root = "_".join(path_elems[: idx + 1])
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
773 self._append_css_paths(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
774 template_data, css_files, css_files_noscript, name_root, settings
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
775 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
776
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
777 return css_files, css_files_noscript
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
778
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
779 ## custom filters ##
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
780
4081
84f6bee6440d installation: moved from `setup.py` to `pyproject.toml`:
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
781 @pass_context
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
782 def _front_url(self, ctx, relative_url):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
783 """Get front URL (URL seen by end-user) from a relative URL
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
784
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
785 This default method return absolute full path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
786 """
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
787 template_data = ctx["template_data"]
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
788 if template_data.site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
789 assert template_data.theme is None
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
790 assert template_data.path.startswith("/")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
791 return os.path.join(os.path.dirname(template_data.path, relative_url))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
792
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
793 site_root_dir = self.sites_paths[template_data.site]
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
794 return os.path.join(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
795 site_root_dir, C.TEMPLATE_TPL_DIR, template_data.theme, relative_url
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
796 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
797
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
798 def _bare_jid(self, full_jid: str | jid.JID) -> str:
4165
81faa85c9cfa template: add a `bare_jid` filter
Goffi <goffi@goffi.org>
parents: 4100
diff changeset
799 """Return the bare JID"""
81faa85c9cfa template: add a `bare_jid` filter
Goffi <goffi@goffi.org>
parents: 4100
diff changeset
800 return str(jid.JID(str(full_jid)).bare)
81faa85c9cfa template: add a `bare_jid` filter
Goffi <goffi@goffi.org>
parents: 4100
diff changeset
801
4081
84f6bee6440d installation: moved from `setup.py` to `pyproject.toml`:
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
802 @pass_context
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
803 def _next_gidx(self, ctx, value):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
804 """Use next current global index as suffix"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
805 next_ = ctx["gidx"].next(value)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
806 return value if next_ == 0 else "{}_{}".format(value, next_)
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
807
4081
84f6bee6440d installation: moved from `setup.py` to `pyproject.toml`:
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
808 @pass_context
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
809 def _cur_gidx(self, ctx, value):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
810 """Use current current global index as suffix"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
811 current = ctx["gidx"].current(value)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
812 return value if not current else "{}_{}".format(value, current)
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
813
4030
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
814 def _date_fmt(
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
815 self,
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
816 timestamp: Union[int, float],
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
817 fmt: str = "short",
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
818 date_only: bool = False,
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
819 auto_limit: int = 7,
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
820 auto_old_fmt: str = "short",
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
821 auto_new_fmt: str = "relative",
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
822 tz_name: Optional[str] = None,
4030
73936abc6838 tools (common/template): let specify timezone name in `date_fmt` filter
Goffi <goffi@goffi.org>
parents: 3747
diff changeset
823 ) -> str:
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
824 if is_undefined(fmt):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
825 fmt = "short"
4031
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
826
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
827 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
828 return date_utils.date_fmt(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
829 timestamp,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
830 fmt,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
831 date_only,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
832 auto_limit,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
833 auto_old_fmt,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
834 auto_new_fmt,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
835 locale_str=self._locale_str,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
836 tz_info=tz_name or date_utils.TZ_UTC,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
837 )
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
838 except Exception as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
839 log.warning(_("Can't parse date: {msg}").format(msg=e))
4031
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
840 return str(timestamp)
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
841
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
842 def _timestamp_to_hour(self, timestamp: float) -> int:
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
843 """Get hour of day corresponding to a timestamp"""
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
844 dt = datetime.fromtimestamp(timestamp)
a2d4bd1943ba tools (common/template): add 2 new filters: `timestamp_to_hour` and `delta_to_human`:
Goffi <goffi@goffi.org>
parents: 4030
diff changeset
845 return dt.hour
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
846
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
847 def attr_escape(self, text):
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
848 """escape a text to a value usable as an attribute
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
849
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
850 remove spaces, and put in lower case
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
851 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
852 return RE_ATTR_ESCAPE.sub("_", text.strip().lower())[:50]
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
853
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
854 def _xmlui_class(self, xmlui_item, fields):
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
855 """return classes computed from XMLUI fields name
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
856
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
857 will return a string with a series of escaped {name}_{value} separated by spaces.
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
858 @param xmlui_item(xmlui.XMLUIPanel): XMLUI containing the widgets to use
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
859 @param fields(iterable(unicode)): names of the widgets to use
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
860 @return (unicode, None): computer string to use as class attribute value
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
861 None if no field was specified
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
862 """
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
863 classes = []
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
864 for name in fields:
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
865 escaped_name = self.attr_escape(name)
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
866 try:
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
867 for value in xmlui_item.widgets[name].values:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
868 classes.append(escaped_name + "_" + self.attr_escape(value))
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
869 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
870 log.debug(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
871 _('ignoring field "{name}": it doesn\'t exists').format(name=name)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
872 )
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
873 continue
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
874 return " ".join(classes) or None
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
875
4081
84f6bee6440d installation: moved from `setup.py` to `pyproject.toml`:
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
876 @pass_context
2422
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
877 def _item_filter(self, ctx, item, filters):
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
878 """return item's value, filtered if suitable
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
879
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
880 @param item(object): item to filter
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
881 value must have name and value attributes,
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
882 mostly used for XMLUI items
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
883 @param filters(dict[unicode, (callable, dict, None)]): map of name => filter
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
884 if filter is None, return the value unchanged
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
885 if filter is a callable, apply it
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
886 if filter is a dict, it can have following keys:
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
887 - filters: iterable of filters to apply
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
888 - filters_args: kwargs of filters in the same order as filters (use empty
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
889 dict if needed)
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
890 - template: template to format where {value} is the filtered value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
891 """
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
892 value = item.value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
893 filter_ = filters.get(item.name, None)
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
894 if filter_ is None:
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
895 return value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
896 elif isinstance(filter_, dict):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
897 filters_args = filter_.get("filters_args")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
898 for idx, f_name in enumerate(filter_.get("filters", [])):
2422
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
899 kwargs = filters_args[idx] if filters_args is not None else {}
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
900 filter_func = self.env.filters[f_name]
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
901 try:
4081
84f6bee6440d installation: moved from `setup.py` to `pyproject.toml`:
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
902 eval_context_filter = filter_func.evalpass_context
2422
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
903 except AttributeError:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
904 eval_context_filter = False
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
905
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
906 if eval_context_filter:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
907 value = filter_func(ctx.eval_ctx, value, **kwargs)
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
908 else:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
909 value = filter_func(value, **kwargs)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
910 template = filter_.get("template")
2422
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
911 if template:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
912 # format will return a string, so we need to check first
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
913 # if the value is safe or not, and re-mark it after formatting
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
914 is_safe = isinstance(value, safe)
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
915 value = template.format(value=value)
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
916 if is_safe:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
917 value = safe(value)
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
918 return value
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
919
2391
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
920 def _adv_format(self, value, template, **kwargs):
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
921 """Advancer formatter
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
922
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
923 like format() method, but take care or special values like None
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
924 @param value(unicode): value to format
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
925 @param template(None, unicode): template to use with format() method.
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
926 It will be formatted using value=value and **kwargs
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
927 None to return value unchanged
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
928 @return (unicode): formatted value
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
929 """
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
930 if template is None:
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
931 return value
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
932 #  jinja use string when no special char is used, so we have to convert to unicode
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
933 return str(template).format(value=value, **kwargs)
2391
07e1543d6992 template: new "adv_format" filter which use Python's format and return whole value if template is None
Goffi <goffi@goffi.org>
parents: 2385
diff changeset
934
2425
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
935 def _dict_ext(self, source_dict, extra_dict, key=None):
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
936 """extend source_dict with extra dict and return the result
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
937
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
938 @param source_dict(dict): dictionary to extend
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
939 @param extra_dict(dict, None): dictionary to use to extend first one
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
940 None to return source_dict unmodified
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
941 @param key(unicode, None): if specified extra_dict[key] will be used
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
942 if it doesn't exists, a copy of unmodified source_dict is returned
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
943 @return (dict): resulting dictionary
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
944 """
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
945 if extra_dict is None:
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
946 return source_dict
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
947 if key is not None:
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
948 extra_dict = extra_dict.get(key, {})
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
949 ret = source_dict.copy()
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
950 ret.update(extra_dict)
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
951 return ret
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
952
2454
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
953 def highlight(self, code, lexer_name=None, lexer_opts=None, html_fmt_opts=None):
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
954 """Do syntax highlighting on code
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
955
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
956 Under the hood, pygments is used, check its documentation for options possible
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
957 values.
2454
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
958 @param code(unicode): code or markup to highlight
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
959 @param lexer_name(unicode, None): name of the lexer to use
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
960 None to autodetect it
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
961 @param html_fmt_opts(dict, None): kword arguments to use for HtmlFormatter
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
962 @return (unicode): HTML markup with highlight classes
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
963 """
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
964 if lexer_opts is None:
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
965 lexer_opts = {}
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
966 if html_fmt_opts is None:
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
967 html_fmt_opts = {}
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
968 if lexer_name is None:
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
969 lexer = lexers.guess_lexer(code, **lexer_opts)
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
970 else:
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
971 lexer = lexers.get_lexer_by_name(lexer_name, **lexer_opts)
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
972 formatter = formatters.HtmlFormatter(**html_fmt_opts)
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
973 return safe(pygments.highlight(code, lexer, formatter))
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
974
4100
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
975 def media_type_main(self, value: Optional[str]) -> Optional[str]:
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
976 """Return main type of a media type"""
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
977 if not value:
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
978 return None
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
979 return value.partition("/")[0]
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
980
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
981 def media_type_sub(self, value: Optional[str]) -> Optional[str]:
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
982 """Return main type of a media type"""
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
983 if not value:
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
984 return None
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
985 return value.partition("/")[1]
810921c33a47 tools (common/template): add filter to get media types:
Goffi <goffi@goffi.org>
parents: 4089
diff changeset
986
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
987 ## custom tests ##
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
988
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
989 def _in_the_past(self, timestamp):
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
990 """check if a date is in the past
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
991
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
992 @param timestamp(unicode, int): unix time
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
993 @return (bool): True if date is in the past
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
994 """
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
995 return time.time() > int(timestamp)
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
996
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
997 ## template methods ##
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
998
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
999 def _icon_defs(self, *names):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1000 """Define svg icons which will be used in the template.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1001 Their name is used as id
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1002 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1003 svg_elt = etree.Element(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1004 "svg",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1005 nsmap={None: "http://www.w3.org/2000/svg"},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1006 width="0",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1007 height="0",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1008 style="display: block",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1009 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1010 defs_elt = etree.SubElement(svg_elt, "defs")
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
1011 for name in names:
4322
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1012 if "/" in name:
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1013 raise ValueError("SVG name must not have a `/` in it.")
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1014 if name.startswith("regular "):
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1015 name = name[8:]
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1016 path = self.fa_svgs_path / f"regular/{name}.svg"
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1017 else:
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1018 if name.startswith("solid "):
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1019 # "solid" can be explicitely specified, and it's the default value.
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1020 name = name[6:]
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1021 path = self.fa_svgs_path / f"solid/{name}.svg"
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1022
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1023 # Parse the source SVG
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1024 try:
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1025 icon_svg_elt = etree.parse(path).getroot()
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1026 except OSError:
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1027 log.exception(f"Can't load icon at {path}.")
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1028 return safe("")
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1029
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1030 if not icon_svg_elt.tag == "{http://www.w3.org/2000/svg}svg":
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1031 raise exceptions.DataError("invalid SVG element")
4322
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1032
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1033 # Extract the viewBox and path data
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1034 viewbox = icon_svg_elt.get("viewBox")
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1035 path_element = icon_svg_elt.find(".//{http://www.w3.org/2000/svg}path")
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1036
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1037 # Create a new symbol element
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1038 symbol = etree.SubElement(
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1039 defs_elt,
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1040 "symbol",
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1041 id=name,
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1042 viewBox=viewbox,
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1043 )
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1044
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1045 # Add the path to the symbol
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1046 if path_element is not None:
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1047 path = etree.SubElement(
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1048 symbol,
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1049 "path",
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1050 d=path_element.get("d"),
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1051 )
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1052
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1053 return safe(etree.tostring(svg_elt, encoding="unicode"))
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
1054
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1055 def _icon_use(self, name: str, cls: str = "", **kwargs: str) -> safe:
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1056 """Insert a icon previously defined with [_icon_defs]"""
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1057 extra_attrs = " ".join(f'{k}="{html.escape(str(v))}"' for k, v in kwargs.items())
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1058 return safe(
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1059 '<svg class="svg-icon{cls}"{extra_attrs} xmlns="http://www.w3.org/2000/svg" '
4322
00837fa13e5a tools (common/template), cli (call/gui): use font-awesome instead of fontello:
Goffi <goffi@goffi.org>
parents: 4270
diff changeset
1060 'width="1em" height="1em" fill="currentColor" >\n'
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1061 ' <use href="#{name}"/>'
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1062 "</svg>\n".format(
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1063 name=name,
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1064 cls=(" " + cls) if cls else "",
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1065 extra_attrs=" " + extra_attrs if extra_attrs else "",
4089
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1066 )
e7ee611fc860 tools (common/template): allow use of extra attributes in `icon` function
Goffi <goffi@goffi.org>
parents: 4084
diff changeset
1067 )
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
1068
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1069 def _icon_from_client(self, client):
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1070 """Get icon name to represent a disco client"""
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1071 if client is None:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1072 return "desktop"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1073 elif "pc" in client:
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1074 return "desktop"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1075 elif "phone" in client:
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1076 return "mobile"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1077 elif "web" in client:
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1078 return "globe"
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1079 elif "console" in client:
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1080 return "terminal"
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1081 else:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1082 return "desktop"
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1083
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1084 def render(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1085 self,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1086 template,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1087 site=None,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1088 theme=None,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1089 locale=C.DEFAULT_LOCALE,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1090 media_path="",
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1091 css_files=None,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1092 css_inline=False,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1093 **kwargs,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1094 ):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1095 """Render a template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1096
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1097 @param template(unicode): template to render (e.g. blog/articles.html)
3267
2eeca6fd08f7 tools (common/template): typos
Goffi <goffi@goffi.org>
parents: 3266
diff changeset
1098 @param site(unicode): site name
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1099 None or empty string for defaut site (i.e. SàT templates)
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1100 @param theme(unicode): template theme
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1101 @param media_path(unicode): prefix of the SàT media path/URL to use for
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1102 template root. Must end with a u'/'
3267
2eeca6fd08f7 tools (common/template): typos
Goffi <goffi@goffi.org>
parents: 3266
diff changeset
1103 @param css_files(list[unicode],None): CSS files to use
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1104 CSS files must be in static dir of the template
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1105 use None for automatic selection of CSS files based on template category
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1106 None is recommended. General static/style.css and theme file name will be
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1107 used.
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1108 @param css_inline(bool): if True, CSS will be embedded in the HTML page
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1109 @param **kwargs: variable to transmit to the template
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1110 """
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1111 if not template:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1112 raise ValueError("template can't be empty")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1113 if site is not None or theme is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1114 # user wants to set site and/or theme, so we add it to the template path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1115 if site is None:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1116 site = ""
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1117 if theme is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1118 theme = C.TEMPLATE_THEME_DEFAULT
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1119 if template[0] == "(":
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1120 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1121 "you can't specify site or theme in template path and in argument "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1122 "at the same time"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1123 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1124
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1125 template_data = TemplateData(site, theme, template)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1126 template = "({site}/{theme}){template}".format(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1127 site=site, theme=theme, template=template
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1128 )
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1129 else:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1130 template_data = self.env.loader.parse_template(template)
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1131
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1132 # we need to save template_data in environment, to load right templates when they
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1133 # are referenced from other templates (e.g. import)
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1134 # FIXME: this trick will not work anymore if we use async templates (it works
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1135 # here because we know that the rendering will be blocking until we unset
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1136 # _template_data)
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1137 self.env._template_data = template_data
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1138
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1139 template_source = self.env.get_template(template)
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1140
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1141 if css_files is None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
1142 css_files, css_files_noscript = self.get_css_files(template_data)
3747
dd1d1a582438 tools (common/template): fix setting of `css_files_noscript` when `css_file` is specified
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
1143 else:
dd1d1a582438 tools (common/template): fix setting of `css_files_noscript` when `css_file` is specified
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
1144 css_files_noscript = []
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1145
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1146 kwargs["icon_defs"] = self._icon_defs
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1147 kwargs["icon"] = self._icon_use
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
1148 kwargs["icon_from_client"] = self._icon_from_client
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
1149
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1150 if css_inline:
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
1151 css_contents = []
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1152 for files, suffix in ((css_files, ""), (css_files_noscript, "_noscript")):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1153 site_root_dir = self.sites_paths[template_data.site]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1154 for css_file in files:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1155 css_file_path = os.path.join(site_root_dir, css_file)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1156 with open(css_file_path) as f:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1157 css_contents.append(f.read())
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1158 if css_contents:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
1159 kwargs["css_content" + suffix] = "\n".join(css_contents)
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
1160
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1161 scripts_handler = ScriptsHandler(self, template_data)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4031
diff changeset
1162 self.set_locale(locale)
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1163
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1164 # XXX: theme used in template arguments is the requested theme, which may differ
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1165 # from actual theme if the template doesn't exist in the requested theme.
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1166 rendered = template_source.render(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1167 template_data=template_data,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1168 media_path=media_path,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1169 css_files=css_files,
2680
ae5340b57ff8 template: fixed by variable used in css_files_noscript
Goffi <goffi@goffi.org>
parents: 2676
diff changeset
1170 css_files_noscript=css_files_noscript,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1171 locale=self._locale,
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
1172 locales=self.locales,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1173 gidx=Indexer(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1174 script=scripts_handler,
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4165
diff changeset
1175 **kwargs,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1176 )
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1177 self.env._template_data = None
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1178 return rendered