Mercurial > hg
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 |