1
0
mirror of https://github.com/home-assistant/core.git synced 2026-02-22 02:47:14 +00:00
Files
core/homeassistant/helpers/template/extensions/string.py

59 lines
1.9 KiB
Python

"""Jinja2 extension for string processing functions."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from urllib.parse import urlencode as urllib_urlencode
from homeassistant.util import slugify as slugify_util
from .base import BaseTemplateExtension, TemplateFunction
if TYPE_CHECKING:
from homeassistant.helpers.template import TemplateEnvironment
class StringExtension(BaseTemplateExtension):
"""Jinja2 extension for string processing functions."""
def __init__(self, environment: TemplateEnvironment) -> None:
"""Initialize the string extension."""
super().__init__(
environment,
functions=[
TemplateFunction(
"ordinal",
self.ordinal,
as_filter=True,
),
TemplateFunction(
"slugify",
self.slugify,
as_global=True,
as_filter=True,
),
TemplateFunction(
"urlencode",
self.urlencode,
as_global=True,
),
],
)
def ordinal(self, value: Any) -> str:
"""Perform ordinal conversion."""
suffixes = ["th", "st", "nd", "rd"] + ["th"] * 6 # codespell:ignore nd
return str(value) + (
suffixes[(int(str(value)[-1])) % 10]
if int(str(value)[-2:]) % 100 not in range(11, 14)
else "th"
)
def slugify(self, value: Any, separator: str = "_") -> str:
"""Convert a string into a slug, such as what is used for entity ids."""
return slugify_util(str(value), separator=separator)
def urlencode(self, value: Any) -> bytes:
"""Urlencode dictionary and return as UTF-8 string."""
return urllib_urlencode(value).encode("utf-8")