Coverage for tarjinja/strfilter.py: 100%
29 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 14:24 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 14:24 +0000
1import re
2import string
3from logging import getLogger
5from .iface import Filter
7log = getLogger(__name__)
10class TemplateFilter(Filter):
11 pattern = string.Template.pattern
13 def render(self, s: str, vals: dict) -> str:
14 return string.Template(s).substitute(**vals)
16 def var_names(self, s: str) -> list[str]:
17 res = set()
18 for i in self.pattern.finditer(s):
19 v = i.group("braced")
20 log.debug("found %s", v)
21 if v is not None:
22 res.add(v)
23 log.debug("vars: %s", res)
24 return res
27class FormatFilter(TemplateFilter):
28 pattern = re.compile("(\\{\\{)*\\{(?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\}(\\}\\})*")
30 def render(self, s: str, vals: dict) -> str:
31 return s.format(**vals)
34class PercentFilter(TemplateFilter):
35 pattern = re.compile("(\\%\\%)*\\%\\((?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\)")
37 def render(self, s: str, vals: dict) -> str:
38 return s % vals
41class FstringFilter(FormatFilter):
42 def render(self, s: str, vals: dict) -> str:
43 return eval("f" + repr(s), vals, {})