Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from typing import List
2from logging import getLogger
3import string
4import re
6from .iface import Filter
9log = getLogger(__name__)
12class TemplateFilter(Filter):
13 pattern = string.Template.pattern
15 def render(self, s: str, vals: dict) -> str:
16 return string.Template(s).substitute(**vals)
18 def var_names(self, s: str) -> List[str]:
19 res = set()
20 for i in self.pattern.finditer(s):
21 v = i.group('braced')
22 log.debug("found %s", v)
23 if v is not None:
24 res.add(v)
25 log.debug("vars: %s", res)
26 return res
29class FormatFilter(TemplateFilter):
30 pattern = re.compile(
31 '(\\{\\{)*\\{(?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\}(\\}\\})*')
33 def render(self, s: str, vals: dict) -> str:
34 return s.format(**vals)
37class PercentFilter(TemplateFilter):
38 pattern = re.compile(
39 '(\\%\\%)*\\%\\((?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\)')
41 def render(self, s: str, vals: dict) -> str:
42 return s % vals
45class FstringFilter(FormatFilter):
46 def render(self, s: str, vals: dict) -> str:
47 return eval("f" + repr(s), vals, {})