comparison mercurial/templater.py @ 8475:caaf1e779b37

templater: replace regex complexity by simple str containment checks
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Sun, 17 May 2009 16:06:48 +0200
parents bccc90b56d02
children d5dda64f5552
comparison
equal deleted inserted replaced
8474:bccc90b56d02 8475:caaf1e779b37
40 {key%format}. 40 {key%format}.
41 41
42 filter uses function to transform value. syntax is 42 filter uses function to transform value. syntax is
43 {key|filter1|filter2|...}.''' 43 {key|filter1|filter2|...}.'''
44 44
45 template_re = re.compile(r"(?:(?:#(?=[\w\|%]+#))|(?:{(?=[\w\|%]+})))" 45 template_re = re.compile(r'{([\w\|%]+)}|#([\w\|%]+)#')
46 r"(\w+)(?:(?:%(\w+))|((?:\|\w+)*))[#}]")
47 46
48 def __init__(self, loader, filters={}, defaults={}): 47 def __init__(self, loader, filters={}, defaults={}):
49 self.loader = loader 48 self.loader = loader
50 self.filters = filters 49 self.filters = filters
51 self.defaults = defaults 50 self.defaults = defaults
68 elif hasattr(item, '__iter__'): 67 elif hasattr(item, '__iter__'):
69 iters.insert(0, iter(item)) 68 iters.insert(0, iter(item))
70 else: 69 else:
71 yield str(item) 70 yield str(item)
72 71
73 def _format(self, key, format, get, map): 72 def _format(self, expr, get, map):
73 key, format = expr.split('%')
74 v = get(key) 74 v = get(key)
75 if not hasattr(v, '__iter__'): 75 if not hasattr(v, '__iter__'):
76 raise SyntaxError(_("Error expanding '%s%%%s'") % (key, format)) 76 raise SyntaxError(_("Error expanding '%s%%%s'") % (key, format))
77 lm = map.copy() 77 lm = map.copy()
78 for i in v: 78 for i in v:
79 lm.update(i) 79 lm.update(i)
80 yield self.process(format, lm) 80 yield self.process(format, lm)
81 81
82 def _filter(self, key, filters, get, map): 82 def _filter(self, expr, get, map):
83 v = get(key) 83 parts = expr.split('|')
84 for f in filters.split('|')[1:]: 84 v = get(parts[0])
85 for f in parts[1:]:
85 v = self.filters[f](v) 86 v = self.filters[f](v)
86 return v 87 return v
87 88
88 def _process(self, tmpl, map): 89 def _process(self, tmpl, map):
89 '''Render a template. Returns a generator.''' 90 '''Render a template. Returns a generator.'''
101 if not m: 102 if not m:
102 yield tmpl 103 yield tmpl
103 break 104 break
104 105
105 start, end = m.span(0) 106 start, end = m.span(0)
106 key, fmt, fl = m.groups() 107 variants = m.groups()
108 expr = variants[0] or variants[1]
107 109
108 if start: 110 if start:
109 yield tmpl[:start] 111 yield tmpl[:start]
110 tmpl = tmpl[end:] 112 tmpl = tmpl[end:]
111 113
112 if fmt: 114 if '%' in expr:
113 yield self._format(key, fmt, get, map) 115 yield self._format(expr, get, map)
114 elif fl: 116 elif '|' in expr:
115 yield self._filter(key, fl, get, map) 117 yield self._filter(expr, get, map)
116 else: 118 else:
117 yield get(key) 119 yield get(expr)
118 120
119 engines = {'default': engine} 121 engines = {'default': engine}
120 122
121 class templater(object): 123 class templater(object):
122 124