annotate sat/tools/common/template.py @ 3410:55f9a38864af

jp (file/receive): display or answer to C.META_TYPE_NOT_IN_ROSTER_LEAK dialog: when a file is proposed by an entity not in roster, the dialog asking for confirmation is displayed. If the bare jid of the sender is explicitely waited (i.e. it's in arguments), then the dialog is automatically confirmed.
author Goffi <goffi@goffi.org>
date Thu, 12 Nov 2020 14:53:16 +0100
parents 29f8122f00f3
children b65175eb7769
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
3136
9d0df638c8b4 dates update
Goffi <goffi@goffi.org>
parents: 3061
diff changeset
4 # Copyright (C) 2009-2020 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
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
21 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
22 import time
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
23 import re
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
24 import json
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
25 from pathlib import Path
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
26 from collections import namedtuple
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
27 from typing import Optional, List, Tuple
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
28 from xml.sax.saxutils import quoteattr
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
29 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
30 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
31 from babel.core import UnknownLocaleError
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 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
33 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
34 from pygments import formatters
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from sat.core.constants import Const as C
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
36 from sat.core.i18n import _
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 from sat.core import exceptions
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
38 from sat.tools import config
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
39 from sat.tools.common import date_utils
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
41
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
42 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
43
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 try:
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 import sat_templates
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 except ImportError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
47 raise exceptions.MissingModule(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
48 "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
49 "use template engine"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
50 )
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 else:
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 sat_templates # to avoid pyflakes warning
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 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
55 import jinja2
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 except:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
57 raise exceptions.MissingModule(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
58 "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
59 "pip install jinja2"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
60 )
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
61
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
62 from lxml import etree
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
63 from jinja2 import Markup as safe
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
64 from jinja2 import is_undefined
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
65 from jinja2 import utils
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
66 from jinja2 import TemplateNotFound
2675
39d187f3698d template: import contextfilter as module attribute
Goffi <goffi@goffi.org>
parents: 2671
diff changeset
67 from jinja2 import contextfilter
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
68 from jinja2.loaders import split_template_path
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
69
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
70 HTML_EXT = ("html", "xhtml")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
71 RE_ATTR_ESCAPE = re.compile(r"[^a-z_-]")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
72 SITE_RESERVED_NAMES = ("sat",)
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
73 TPL_RESERVED_CHARS = r"()/."
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
74 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
75 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
76 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
77
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
78 TemplateData = namedtuple("TemplateData", ['site', 'theme', 'path'])
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
79
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
80
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
81 class TemplateLoader(jinja2.BaseLoader):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
82 """A template loader which handle site, theme and absolute paths"""
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
83 # TODO: list_templates should be implemented
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
84
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
85 def __init__(self, sites_paths, trusted=False):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
86 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
87 @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
88 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
89 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
90 launching user can access.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
91 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
92 if not sites_paths or not "" in sites_paths:
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
93 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
94 super(jinja2.BaseLoader, self).__init__()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 self.sites_paths = sites_paths
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
96 self.trusted = trusted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
97
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
98 @staticmethod
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
99 def parse_template(template):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
100 """Parse template path and return site, theme and path
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
101
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
102 @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
103 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
104 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
105 (/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
106 (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
107 (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
108 /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
109 @return (TemplateData):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
110 site, theme and template_path.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
111 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
112 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
113 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
114 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
115 if template.startswith("("):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
116 # site and/or theme are specified
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
117 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
118 theme_end = template.index(")")
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
119 except IndexError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
120 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
121 theme_data = template[1:theme_end]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
122 theme_splitted = theme_data.split('/')
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
123 if len(theme_splitted) == 1:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
124 site, theme = "", theme_splitted[0]
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
125 elif len(theme_splitted) == 2:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
126 site, theme = theme_splitted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
127 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
128 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
129 template_path = template[theme_end+1:]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
130 if not template_path or template_path.startswith("/"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
131 raise ValueError("incorrect template path")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
132 elif template.startswith("/"):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
133 # 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
134 site = None
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
135 theme = None
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
136 template_path = template
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
137 else:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
138 # a default template
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
139 site = ""
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
140 theme = C.TEMPLATE_THEME_DEFAULT
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
141 template_path = template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
142
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
143 if site is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
144 site = site.strip()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
145 if not site:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
146 site = ""
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
147 elif site in SITE_RESERVED_NAMES:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
148 raise ValueError(_("{site} can't be used as site name, "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
149 "it's reserved.").format(site=site))
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
150
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
151 if theme is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
152 theme = theme.strip()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
153 if not theme:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
154 theme = C.TEMPLATE_THEME_DEFAULT
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
155 if RE_TPL_RESERVED_CHARS.search(theme):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
156 raise ValueError(_("{theme} contain forbidden char. Following chars "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
157 "are forbidden: {reserved}").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
158 theme=theme, reserved=TPL_RESERVED_CHARS))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
159
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
160 return TemplateData(site, theme, template_path)
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
161
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
162 @staticmethod
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
163 def getSitesAndThemes(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
164 site: str,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
165 theme: str,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
166 default_fallback: bool=True
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
167 ) -> List[Tuple[str, str]]:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
168 """Get sites and themes to check for template/file
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
169
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
170 Will add default theme and default site in search list when suitable
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
171 @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
172 @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
173 @return: site and theme couples to check
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 sites_and_themes = [[site, theme]]
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
176 if theme != C.TEMPLATE_THEME_DEFAULT and default_fallback:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
177 sites_and_themes.append([site, C.TEMPLATE_THEME_DEFAULT])
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
178 if site and default_fallback:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
179 # the site is not the default one, so we add default at the end
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
180 sites_and_themes.append(['', C.TEMPLATE_THEME_DEFAULT])
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
181 return sites_and_themes
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
182
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
183 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
184 """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
185
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
186 @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
187 (default site will also checked)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
188 @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
189 @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
190 @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
191 - 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
192 - 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
193 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
194 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
195 raise exceptions.InternalError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
196 "_get_template_f must not be used with absolute path")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
197 for site, theme in self.getSitesAndThemes(site, theme):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
198 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
199 base_path = self.sites_paths[site]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
200 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
201 log.warning(_("Unregistered site requested: {site}").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
202 site=site))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
203 filepath = os.path.join(base_path, C.TEMPLATE_TPL_DIR, theme, *path_elts)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
204 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
205 if f is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
206 return f, filepath
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
207 return None, None
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
208
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
209 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
210 """Retrieve source handling site and themes
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
211
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
212 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
213 else and exception is raised.
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
214 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
215 @raise PermissionError: absolute path used in untrusted environment
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
216 """
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
217 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
218
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
219 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
220 # we have an abolute template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
221 if theme is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
222 raise exceptions.InternalError("We can't have a theme with absolute "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
223 "template.")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
224 if not self.trusted:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
225 log.error(_("Absolute template used while unsecure is disabled, hack "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
226 "attempt? Template: {template}").format(template=template))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
227 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
228 filepath = template_path
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
229 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
230 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
231 # 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
232 assert theme and template_path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
233 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
234 # 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
235 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
236
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
237 if f is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
238 if (site is not None and path_elts[0] == "error"
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
239 and os.path.splitext(template_path)[1][1:] in HTML_EXT):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
240 # 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
241 # with base error.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
242 f, filepath = self._get_template_f(
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
243 site, theme, ("error", "base.html"))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
244 if f is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
245 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
246 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
247 raise TemplateNotFound(template)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
248
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
249 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
250 contents = f.read()
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
251 finally:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
252 f.close()
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
253
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
254 mtime = os.path.getmtime(filepath)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
255
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
256 def uptodate():
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
257 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
258 return os.path.getmtime(filepath) == mtime
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
259 except OSError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
260 return False
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
261
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
262 return contents, filepath, uptodate
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
263
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
264
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
265 class Indexer(object):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
266 """Index global to a page"""
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
267
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
268 def __init__(self):
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
269 self._indexes = {}
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
270
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
271 def next(self, value):
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
272 if value not in self._indexes:
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
273 self._indexes[value] = 0
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
274 return 0
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
275 self._indexes[value] += 1
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
276 return self._indexes[value]
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
277
2385
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
278 def current(self, value):
39d30cf722cb template: gidx methods improvment:
Goffi <goffi@goffi.org>
parents: 2384
diff changeset
279 return self._indexes.get(value)
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
280
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
281
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
282 class ScriptsHandler(object):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
283 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
284 self.renderer = renderer
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
285 self.template_data = template_data
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
286 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
287
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
288 def include(self, library_name, attribute="defer"):
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
289 """Mark that a script need to be imported.
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
290
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
291 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
292 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
293 @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
294 @param loading:
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
295 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
296 if attribute not in ("defer", "async", ""):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
297 raise exceptions.DataError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
298 _('Invalid attribute, please use one of "defer", "async" or ""')
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
299 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
300 if not library_name.endswith(".js"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
301 library_name = library_name + ".js"
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
302 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
303 self.scripts.append((library_name, attribute))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
304 return ""
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
305
2265
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
306 def generate_scripts(self):
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
307 """Generate the <script> elements
322694543225 tools (common/template): ScriptsHandler fix/improvments:
Goffi <goffi@goffi.org>
parents: 2249
diff changeset
308
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
309 @return (unicode): <scripts> HTML tags
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
310 """
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
311 scripts = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
312 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
313 for library, attribute in self.scripts:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
314 library_path = self.renderer.getStaticPath(self.template_data, library)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
315 if library_path is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
316 log.warning(_("Can't find {libary} javascript library").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
317 library=library))
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
318 continue
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
319 path = self.renderer.getFrontURL(library_path)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
320 scripts.append(tpl.format(src=quoteattr(path), attribute=attribute))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
321 return safe("\n".join(scripts))
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
322
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
323
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
324 class Environment(jinja2.Environment):
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
325
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
326 def get_template(self, name, parent=None, globals=None):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
327 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
328 # 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
329 # 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
330 # 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
331 # 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
332 # 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
333 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
334 site=self._template_data.site,
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
335 theme=self._template_data.theme,
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
336 template=name)
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
337
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
338 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
339
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
340
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 class Renderer(object):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
342
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
343 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
344 """
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
345 @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
346 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
347 - 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
348 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
349 - 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
350 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
351 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
352 @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
353 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
354 @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
355 """
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 self.host = host
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
357 self.trusted = trusted
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
358 self.sites_paths = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
359 "": 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
360 }
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
361 self.sites_themes = {
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
362 }
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
363 conf = config.parseMainConf()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
364 public_sites = config.getConfig(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
365 sites_data = [public_sites]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
366 if private:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
367 private_sites = config.getConfig(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
368 sites_data.append(private_sites)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
369 for sites in sites_data:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
370 normalised = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
371 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
372 if RE_TPL_RESERVED_CHARS.search(name):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
373 log.warning(_("Can't add \"{name}\" site, it contains forbidden "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
374 "characters. Forbidden characters are {forbidden}.")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
375 .format(name=name, forbidden=TPL_RESERVED_CHARS))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
376 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
377 path = os.path.expanduser(os.path.normpath(path))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
378 if not path or not path.startswith("/"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
379 log.warning(_("Can't add \"{name}\" site, it should map to an "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
380 "absolute path").format(name=name))
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
381 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
382 normalised[name] = path
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
383 self.sites_paths.update(normalised)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
384
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
385 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
386 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
387 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
388 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
389 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
390 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
391 theme_data = self.sites_themes.setdefault(site, {})[p.name] = {
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
392 'path': p,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
393 'settings': {}}
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
394 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
395 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
396 try:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
397 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
398 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
399 except Exception as e:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
400 log.warning(_(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
401 "Can't load theme settings at {path}").format(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
402 path=theme_settings))
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
403 else:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
404 log.debug(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
405 f"found settings for theme {p.name!r} at {theme_settings}")
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
406 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
407 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
408 if browser_path.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
409 theme_data['browser_path'] = browser_path
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
410 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
411 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
412 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
413 with browser_meta_path.open() as f:
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
414 theme_data['browser_meta'] = json.load(f)
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
415 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
416 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
417 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
418 )
8ec5ddb4e759 tools (common/template): list themes and parse their browser data, available through new `getThemesData` method
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
419 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
420
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
421 self.env = Environment(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
422 loader=TemplateLoader(sites_paths=self.sites_paths, trusted=trusted),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
423 autoescape=jinja2.select_autoescape(["html", "xhtml", "xml"]),
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
424 trim_blocks=True,
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
425 lstrip_blocks=True,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
426 extensions=["jinja2.ext.i18n"],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
427 )
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
428 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
429 self._locale_str = C.DEFAULT_LOCALE
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
430 self._locale = Locale.parse(self._locale_str)
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
431 self.installTranslations()
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
432
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
433 # we want to have access to SàT constants in templates
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
434 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
435
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
436 # custom filters
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
437 self.env.filters["next_gidx"] = self._next_gidx
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
438 self.env.filters["cur_gidx"] = self._cur_gidx
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
439 self.env.filters["date_fmt"] = self._date_fmt
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
440 self.env.filters["xmlui_class"] = self._xmlui_class
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
441 self.env.filters["attr_escape"] = self.attr_escape
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
442 self.env.filters["item_filter"] = self._item_filter
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
443 self.env.filters["adv_format"] = self._adv_format
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
444 self.env.filters["dict_ext"] = self._dict_ext
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
445 self.env.filters["highlight"] = self.highlight
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
446 self.env.filters["front_url"] = (self._front_url if front_url_filter is None
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
447 else front_url_filter)
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
448 # custom tests
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
449 self.env.tests["in_the_past"] = self._in_the_past
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
450 self.icons_path = os.path.join(host.media_dir, "fonts/fontello/svg")
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
451
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
452 # policies
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
453 self.env.policies["ext.i18n.trimmed"] = True
3306
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
454 self.env.policies["json.dumps_kwargs"] = {
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
455 "sort_keys": True,
3af0909629a2 common (template): better json dumping:
Goffi <goffi@goffi.org>
parents: 3274
diff changeset
456 # if object can't be serialised, we use None
3311
29f8122f00f3 tools (common/template): use `to_json` instead of `json` + added missing args to `date_fmt`
Goffi <goffi@goffi.org>
parents: 3306
diff changeset
457 "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
458 }
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
459
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
460 def getFrontURL(self, template_data, path=None):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
461 """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
462
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
463 @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
464 @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
465 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
466 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
467 return self.env.filters["front_url"]({"template_data": template_data},
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
468 path or template_data.path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
469
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
470 def installTranslations(self):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
471 # TODO: support multi translation
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
472 # 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
473 self.translations = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
474 for site_key, site_path in self.sites_paths.items():
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
475 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
476 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
477 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
478 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
479 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
480 continue
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
481 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
482 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
483 locale = Locale.parse(lang_dir)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
484 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
485 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
486 translations = self.translations[locale]
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
487 except KeyError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
488 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
489 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
490 translations.merge(support.Translations(f, "sat"))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
491 except EnvironmentError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
492 log.error(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
493 _("Can't find template translation at {path}").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
494 path=po_path))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
495 except UnknownLocaleError as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
496 log.error(_("{site}Invalid locale name: {msg}").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
497 site=site_prefix, msg=e))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
498 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
499 log.info(_("{site}loaded {lang} templates translations").format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
500 site = site_prefix,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
501 lang=lang_dir))
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
502
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
503 default_locale = Locale.parse(self._locale_str)
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
504 if default_locale not in self.translations:
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
505 # default locale disable gettext,
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
506 # 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
507 self.translations[default_locale] = None
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
508
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
509 self.env.install_null_translations(True)
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
510 # 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
511 # through the "locales" variable
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
512 self.locales = tuple(sorted(list(self.translations.keys()),
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
513 key=lambda l: l.language_name.lower()))
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
514
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
515
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
516 def setLocale(self, locale_str):
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
517 """set current locale
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
518
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
519 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
520 """
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
521 if locale_str == self._locale_str:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
522 return
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
523 if locale_str == "en":
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
524 # we default to GB English when it's not specified
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
525 # 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
526 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
527 try:
2dae79990122 template: print warning message and use DEFAULT_LOCALE on bad locale
Goffi <goffi@goffi.org>
parents: 2266
diff changeset
528 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
529 except ValueError as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
530 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
531 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
532 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
533
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
534 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
535 if locale_str != C.DEFAULT_LOCALE:
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
536 try:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
537 translations = self.translations[locale]
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
538 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
539 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
540 locale_str = C.DEFAULT_LOCALE
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
541 locale = Locale.parse(self._locale_str)
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
542 else:
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
543 self.env.install_gettext_translations(translations, True)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
544 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
545
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
546 if locale_str == C.DEFAULT_LOCALE:
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
547 self.env.install_null_translations(True)
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
548
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
549 self._locale = locale
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
550 self._locale_str = locale_str
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
551
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
552 def getThemeAndRoot(self, template):
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
553 """retrieve theme and root dir of a given tempalte
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
554
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
555 @param template(unicode): template to parse
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
556 @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
557 @raise NotFound: requested site has not been found
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
558 """
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
559 # FIXME: check use in jp, and include site
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
560 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
561 if site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
562 # absolute template
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
563 return "", os.path.dirname(template)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
564 try:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
565 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
566 except KeyError:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
567 raise exceptions.NotFound
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
568 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
569
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
570 def getThemesData(self, 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
571 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
572 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
573 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
574 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
575
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
576 def getStaticPath(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
577 self,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
578 template_data: TemplateData,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
579 filename: str,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
580 default_fallback: bool=True
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
581 ) -> Optional[TemplateData]:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
582 """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
583
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
584 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
585 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
586 <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
587 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
588 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
589 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
590 @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
591 @param filename: name of the file to retrieve
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
592 @param default_fallback: if True, default theme will be checked if the file is
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
593 not found in current theme, then default site with default theme will be used.
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
594 @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
595 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
596 None if not found.
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
597 """
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
598 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
599 # we have an absolue path
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
600 if (not template_data.theme is None
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
601 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
602 raise exceptions.InternalError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
603 "invalid template data, was expecting absolute URL")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
604 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
605 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
606 if os.path.exists(file_path):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
607 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
608 else:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
609 return None
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
610
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
611 sites_and_themes = TemplateLoader.getSitesAndThemes(template_data.site,
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
612 template_data.theme,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
613 default_fallback)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
614 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
615 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
616 relative_path = os.path.join(C.TEMPLATE_STATIC_DIR, filename)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
617 absolute_path = os.path.join(site_root_dir, C.TEMPLATE_TPL_DIR,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
618 theme, relative_path)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
619 if os.path.exists(absolute_path):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
620 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
621
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
622 return None
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
623
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
624 def _appendCSSPaths(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
625 self,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
626 template_data: TemplateData,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
627 css_files: list,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
628 css_files_noscript: list,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
629 name_root: str,
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
630 default_fallback: bool
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
631
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
632 ) -> None:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
633 """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
634
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
635 @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
636 @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
637 with "_noscript" suffix
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
638 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
639 name = name_root + ".css"
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
640 css_path = self.getStaticPath(template_data, name, default_fallback)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
641 if css_path is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
642 css_files.append(self.getFrontURL(css_path))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
643 noscript_name = name_root + "_noscript.css"
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
644 noscript_path = self.getStaticPath(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
645 template_data, noscript_name, default_fallback)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
646 if noscript_path is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
647 css_files_noscript.append(self.getFrontURL(noscript_path))
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
648
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
649 def getCSSFiles(self, template_data):
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
650 """Retrieve CSS files to use according template_data
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
651
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
652 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
653 if it exists.
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
654 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
655 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
656 exist.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
657 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
658 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
659 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
660 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
661 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
662 - 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
663 else default/static/styles.css
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
664 - 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
665 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
666 - 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
667 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
668 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
669 in noscript list (for instance (some_theme/static/styles_noscript.css)).
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
670 The behaviour may be changed with theme settings: if "css_default_fallback" is
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
671 False, only CSS from the theme is returned if it exists, default CSS is never
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
672 used.
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
673 @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
674 @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
675 - 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
676 - 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
677 """
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
678 # TODO: some caching would be nice
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
679 css_files = []
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
680 css_files_noscript = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
681 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
682 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
683 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
684 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
685 # absolute path
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
686 default_fallback = True
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
687 else:
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
688 default_fallback = (
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
689 self.sites_themes[site][template_data.theme]['settings']
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
690 ).get('css_default_fallback', True)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
691
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
692 css_path = self.getStaticPath(template_data, 'fonts.css', default_fallback)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
693 if css_path is not None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
694 css_files.append(self.getFrontURL(css_path))
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
695
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
696 for name_root in ('styles', 'styles_extra', 'highlight'):
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
697 self._appendCSSPaths(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
698 template_data, css_files, css_files_noscript, name_root, default_fallback)
2683
38af118a7d74 template: better css files order
Goffi <goffi@goffi.org>
parents: 2680
diff changeset
699
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
700 for idx in range(len(path_elems)):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
701 name_root = "_".join(path_elems[:idx+1])
3268
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
702 self._appendCSSPaths(
85c9cfcd4f5e tools (common/template): theme settings with possibility to disable default fallback for CSS:
Goffi <goffi@goffi.org>
parents: 3267
diff changeset
703 template_data, css_files, css_files_noscript, name_root, default_fallback)
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
704
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
705 return css_files, css_files_noscript
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
706
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
707 ## custom filters ##
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
708
2675
39d187f3698d template: import contextfilter as module attribute
Goffi <goffi@goffi.org>
parents: 2671
diff changeset
709 @contextfilter
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
710 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
711 """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
712
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
713 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
714 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
715 template_data = ctx['template_data']
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
716 if template_data.site is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
717 assert template_data.theme is None
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
718 assert template_data.path.startswith("/")
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
719 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
720
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
721 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
722 return os.path.join(site_root_dir, C.TEMPLATE_TPL_DIR, template_data.theme,
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
723 relative_url)
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
724
2675
39d187f3698d template: import contextfilter as module attribute
Goffi <goffi@goffi.org>
parents: 2671
diff changeset
725 @contextfilter
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
726 def _next_gidx(self, ctx, value):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
727 """Use next current global index as suffix"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
728 next_ = ctx["gidx"].next(value)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
729 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
730
2675
39d187f3698d template: import contextfilter as module attribute
Goffi <goffi@goffi.org>
parents: 2671
diff changeset
731 @contextfilter
2245
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
732 def _cur_gidx(self, ctx, value):
e09048cb7595 core (tools/common/template): helping methods/filters for templates:
Goffi <goffi@goffi.org>
parents: 2169
diff changeset
733 """Use current current global index as suffix"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
734 current = ctx["gidx"].current(value)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
735 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
736
3311
29f8122f00f3 tools (common/template): use `to_json` instead of `json` + added missing args to `date_fmt`
Goffi <goffi@goffi.org>
parents: 3306
diff changeset
737 def _date_fmt(self, timestamp, fmt="short", date_only=False, auto_limit=7,
29f8122f00f3 tools (common/template): use `to_json` instead of `json` + added missing args to `date_fmt`
Goffi <goffi@goffi.org>
parents: 3306
diff changeset
738 auto_old_fmt="short", auto_new_fmt="relative"):
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
739 if is_undefined(fmt):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
740 fmt = "short"
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
741 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
742 return date_utils.date_fmt(
2907
8ca12f30f61f template (filters): set locale when using "date_fmt"
Goffi <goffi@goffi.org>
parents: 2906
diff changeset
743 timestamp, fmt, date_only, auto_limit, auto_old_fmt,
8ca12f30f61f template (filters): set locale when using "date_fmt"
Goffi <goffi@goffi.org>
parents: 2906
diff changeset
744 locale_str = self._locale_str
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
745 )
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
746 except Exception as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
747 log.warning(_("Can't parse date: {msg}").format(msg=e))
2453
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
748 return timestamp
84e84a46b014 template (filters): don't crash on invalid date in date_fmt
Goffi <goffi@goffi.org>
parents: 2452
diff changeset
749
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
750 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
751 """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
752
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
753 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
754 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
755 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
756
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
757 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
758 """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
759
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
760 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
761 @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
762 @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
763 @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
764 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
765 """
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
766 classes = []
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
767 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
768 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
769 try:
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
770 for value in xmlui_item.widgets[name].values:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
771 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
772 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
773 log.debug(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
774 _('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
775 )
2384
d14c1a3e3244 template: new "xmlui_class" filter compute class names from name/values of requested fields.
Goffi <goffi@goffi.org>
parents: 2323
diff changeset
776 continue
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
777 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
778
2675
39d187f3698d template: import contextfilter as module attribute
Goffi <goffi@goffi.org>
parents: 2671
diff changeset
779 @contextfilter
2422
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
780 def _item_filter(self, ctx, item, filters):
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
781 """return item's value, filtered if suitable
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
782
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
783 @param item(object): item to filter
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
784 value must have name and value attributes,
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
785 mostly used for XMLUI items
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
786 @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
787 if filter is None, return the value unchanged
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
788 if filter is a callable, apply it
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
789 if filter is a dict, it can have following keys:
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
790 - 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
791 - 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
792 dict if needed)
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
793 - template: template to format where {value} is the filtered value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
794 """
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
795 value = item.value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
796 filter_ = filters.get(item.name, None)
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
797 if filter_ is None:
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
798 return value
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
799 elif isinstance(filter_, dict):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
800 filters_args = filter_.get("filters_args")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
801 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
802 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
803 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
804 try:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
805 eval_context_filter = filter_func.evalcontextfilter
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
806 except AttributeError:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
807 eval_context_filter = False
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
808
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
809 if eval_context_filter:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
810 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
811 else:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
812 value = filter_func(value, **kwargs)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
813 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
814 if template:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
815 # 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
816 # 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
817 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
818 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
819 if is_safe:
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
820 value = safe(value)
5425cf18929b template: fixed the use of eval_context_filter in item_filter
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
821 return value
2402
f905dfe69fcc template: new item_value filter
Goffi <goffi@goffi.org>
parents: 2401
diff changeset
822
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
823 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
824 """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
825
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
826 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
827 @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
828 @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
829 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
830 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
831 @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
832 """
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
833 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
834 return value
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
835 #  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
836 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
837
2425
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
838 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
839 """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
840
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
841 @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
842 @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
843 None to return source_dict unmodified
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
844 @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
845 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
846 @return (dict): resulting dictionary
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
847 """
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
848 if extra_dict is None:
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
849 return source_dict
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
850 if key is not None:
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
851 extra_dict = extra_dict.get(key, {})
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
852 ret = source_dict.copy()
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
853 ret.update(extra_dict)
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
854 return ret
d294527bd46f template: added dict_ext filter to extend a dictionary
Goffi <goffi@goffi.org>
parents: 2422
diff changeset
855
2454
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
856 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
857 """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
858
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
859 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
860 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
861 @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
862 @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
863 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
864 @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
865 @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
866 """
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
867 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
868 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
869 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
870 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
871 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
872 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
873 else:
06ff33052354 core, template (filters): added pygments as a dependency + new highlight filter to use it.
Goffi <goffi@goffi.org>
parents: 2453
diff changeset
874 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
875 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
876 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
877
2403
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
878 ## custom tests ##
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
879
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
880 def _in_the_past(self, timestamp):
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
881 """check if a date is in the past
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
882
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
883 @param timestamp(unicode, int): unix time
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
884 @return (bool): True if date is in the past
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
885 """
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
886 return time.time() > int(timestamp)
dec31114c402 template: improved date formatter:
Goffi <goffi@goffi.org>
parents: 2402
diff changeset
887
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
888 ## template methods ##
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
889
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
890 def _icon_defs(self, *names):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
891 """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
892
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
893 Their name is used as id
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
894 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
895 svg_elt = etree.Element(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
896 "svg",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
897 nsmap={None: "http://www.w3.org/2000/svg"},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
898 width="0",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
899 height="0",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
900 style="display: block",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
901 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
902 defs_elt = etree.SubElement(svg_elt, "defs")
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
903 for name in names:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
904 path = os.path.join(self.icons_path, name + ".svg")
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
905 icon_svg_elt = etree.parse(path).getroot()
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
906 # we use icon name as id, so we can retrieve them easily
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
907 icon_svg_elt.set("id", name)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
908 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
909 raise exceptions.DataError("invalid SVG element")
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
910 defs_elt.append(icon_svg_elt)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
911 return safe(etree.tostring(svg_elt, encoding="unicode"))
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
912
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
913 def _icon_use(self, name, cls=""):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
914 return safe('<svg class="svg-icon{cls}" xmlns="http://www.w3.org/2000/svg" '
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
915 'viewBox="0 0 100 100">\n'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
916 ' <use href="#{name}"/>'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
917 '</svg>\n'.format(name=name, cls=(" " + cls) if cls else ""))
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
918
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
919 def _icon_from_client(self, client):
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
920 """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
921 if client is None:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
922 return 'desktop'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
923 elif 'pc' in client:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
924 return 'desktop'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
925 elif 'phone' in client:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
926 return 'mobile'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
927 elif 'web' in client:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
928 return 'globe'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
929 elif 'console' in client:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
930 return 'terminal'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
931 else:
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
932 return 'desktop'
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
933
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
934 def render(self, template, site=None, theme=None, locale=C.DEFAULT_LOCALE,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
935 media_path="", css_files=None, css_inline=False, **kwargs):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
936 """Render a template
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
937
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
938 @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
939 @param site(unicode): site name
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
940 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
941 @param theme(unicode): template theme
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
942 @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
943 template root. Must end with a u'/'
3267
2eeca6fd08f7 tools (common/template): typos
Goffi <goffi@goffi.org>
parents: 3266
diff changeset
944 @param css_files(list[unicode],None): CSS files to use
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
945 CSS files must be in static dir of the template
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
946 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
947 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
948 used.
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
949 @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
950 @param **kwargs: variable to transmit to the template
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
951 """
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
952 if not template:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
953 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
954 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
955 # 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
956 if site is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
957 site = ''
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
958 if theme is None:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
959 theme = C.TEMPLATE_THEME_DEFAULT
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
960 if template[0] == "(":
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
961 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
962 "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
963 "at the same time"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
964 )
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
965
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
966 template_data = TemplateData(site, theme, template)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
967 template = "({site}/{theme}){template}".format(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
968 site=site, theme=theme, template=template)
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
969 else:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
970 template_data = self.env.loader.parse_template(template)
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
971
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
972 # 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
973 # 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
974 # 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
975 # 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
976 # _template_data)
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
977 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
978
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
979 template_source = self.env.get_template(template)
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
980
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
981 if css_files is None:
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
982 css_files, css_files_noscript = self.getCSSFiles(template_data)
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
983
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
984 kwargs["icon_defs"] = self._icon_defs
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
985 kwargs["icon"] = self._icon_use
3274
430204a3cc10 tools (common/template): new `icon_from_client` method:
Goffi <goffi@goffi.org>
parents: 3268
diff changeset
986 kwargs["icon_from_client"] = self._icon_from_client
2515
00480cf83fa1 template: added icon handling:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
987
2159
5734b0994cf0 core (tools/common): template renderer first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
988 if css_inline:
2169
f472179305a1 tools(templates): workflow improvments:
Goffi <goffi@goffi.org>
parents: 2159
diff changeset
989 css_contents = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
990 for files, suffix in ((css_files, ""),
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
991 (css_files_noscript, "_noscript")):
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
992 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
993 for css_file in files:
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
994 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
995 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
996 css_contents.append(f.read())
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
997 if css_contents:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2952
diff changeset
998 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
999
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1000 scripts_handler = ScriptsHandler(self, template_data)
2249
e572482f6cbd core (tools/common/template): i18n support
Goffi <goffi@goffi.org>
parents: 2245
diff changeset
1001 self.setLocale(locale)
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1002
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1003 # 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
1004 # 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
1005 rendered = template_source.render(
2671
0fa217fafabf tools (common/template), jp: refactoring to handle multiple sites:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1006 template_data=template_data,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1007 media_path=media_path,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1008 css_files=css_files,
2680
ae5340b57ff8 template: fixed by variable used in css_files_noscript
Goffi <goffi@goffi.org>
parents: 2676
diff changeset
1009 css_files_noscript=css_files_noscript,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1010 locale=self._locale,
2903
68a7543ebbb3 template: added "locales" variables to templates:
Goffi <goffi@goffi.org>
parents: 2877
diff changeset
1011 locales=self.locales,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1012 gidx=Indexer(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1013 script=scripts_handler,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1014 **kwargs
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
1015 )
2676
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1016 self.env._template_data = None
da8f3ac86845 template: overriden get_template to always have full template name:
Goffi <goffi@goffi.org>
parents: 2675
diff changeset
1017 return rendered