# HG changeset patch # User Goffi # Date 1686252506 -7200 # Node ID e7ee611fc860637517cafc1c49fe5d057778c813 # Parent 4325a0f13b0f105e522a5dc41eef2ec518cfbefc tools (common/template): allow use of extra attributes in `icon` function diff -r 4325a0f13b0f -r e7ee611fc860 libervia/backend/tools/common/template.py --- a/libervia/backend/tools/common/template.py Thu Jun 08 21:27:12 2023 +0200 +++ b/libervia/backend/tools/common/template.py Thu Jun 08 21:28:26 2023 +0200 @@ -18,27 +18,37 @@ """Template generation""" -import os.path -import time -import re -import json +from collections import namedtuple from datetime import datetime +import html +import json +import os.path from pathlib import Path -from collections import namedtuple -from typing import Optional, List, Tuple, Union +import re +import time +from typing import List, Optional, Tuple, Union from xml.sax.saxutils import quoteattr + from babel import support from babel import Locale from babel.core import UnknownLocaleError +from jinja2 import is_undefined +from jinja2 import utils +from jinja2 import TemplateNotFound +from jinja2 import pass_context +from jinja2.loaders import split_template_path +from lxml import etree +from markupsafe import Markup as safe import pygments from pygments import lexers from pygments import formatters + +from libervia.backend.core import exceptions from libervia.backend.core.constants import Const as C from libervia.backend.core.i18n import _ -from libervia.backend.core import exceptions +from libervia.backend.core.log import getLogger from libervia.backend.tools import config from libervia.backend.tools.common import date_utils -from libervia.backend.core.log import getLogger log = getLogger(__name__) @@ -60,13 +70,7 @@ "pip install jinja2" ) -from lxml import etree -from markupsafe import Markup as safe -from jinja2 import is_undefined -from jinja2 import utils -from jinja2 import TemplateNotFound -from jinja2 import pass_context -from jinja2.loaders import split_template_path + HTML_EXT = ("html", "xhtml") RE_ATTR_ESCAPE = re.compile(r"[^a-z_-]") @@ -955,18 +959,19 @@ defs_elt.append(icon_svg_elt) return safe(etree.tostring(svg_elt, encoding="unicode")) - def _icon_use(self, name, cls="", id=""): - if id: - id = id.replace('"', '_') - return safe('\n' - ' ' - '\n'.format( - name=name, - cls=(" " + cls) if cls else "", - id=f' id="{id}"' if id else "" - ) - ) + def _icon_use(self, name: str, cls: str = "", **kwargs: str) -> safe: + """Insert a icon previously defined with [_icon_defs]""" + extra_attrs = " ".join(f'{k}="{html.escape(str(v))}"' for k, v in kwargs.items()) + return safe( + '\n' + ' ' + '\n'.format( + name=name, + cls=(" " + cls) if cls else "", + extra_attrs=" " + extra_attrs if extra_attrs else "" + ) + ) def _icon_from_client(self, client): """Get icon name to represent a disco client"""