mercurial/templater.py
changeset 8475 caaf1e779b37
parent 8474 bccc90b56d02
child 8476 d5dda64f5552
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