Mercurial > libervia-backend
annotate libervia/backend/tools/common/template.py @ 4100:810921c33a47
tools (common/template): add filter to get media types:
Add 2 filters to get main type and subtype of media type. Jinja2 and Nunjucks don't handle
slices in the same way (Python way for Jinja2, JS way for Nunjucks), making it difficult
to retrieve main type of a media from media type. Thoses filters work in both cases.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 22 Jun 2023 15:49:06 +0200 |
parents | e7ee611fc860 |
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 |