Hide keyboard shortcuts

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 

5 

6from .iface import Filter 

7 

8 

9log = getLogger(__name__) 

10 

11 

12class TemplateFilter(Filter): 

13 pattern = string.Template.pattern 

14 

15 def render(self, s: str, vals: dict) -> str: 

16 return string.Template(s).substitute(**vals) 

17 

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 

27 

28 

29class FormatFilter(TemplateFilter): 

30 pattern = re.compile( 

31 '(\\{\\{)*\\{(?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\}(\\}\\})*') 

32 

33 def render(self, s: str, vals: dict) -> str: 

34 return s.format(**vals) 

35 

36 

37class PercentFilter(TemplateFilter): 

38 pattern = re.compile( 

39 '(\\%\\%)*\\%\\((?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\)') 

40 

41 def render(self, s: str, vals: dict) -> str: 

42 return s % vals 

43 

44 

45class FstringFilter(FormatFilter): 

46 def render(self, s: str, vals: dict) -> str: 

47 return eval("f" + repr(s), vals, {})