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