mercurial/templater.py
changeset 1900 f2815605186e
parent 1899 888d298ddb91
child 1901 c64bef3d7043
equal deleted inserted replaced
1899:888d298ddb91 1900:f2815605186e
       
     1 import re
     1 from demandload import demandload
     2 from demandload import demandload
     2 demandload(globals(), "cgi os re time urllib util")
     3 demandload(globals(), "cgi os time urllib util")
     3 
     4 
     4 class templater(object):
     5 class templater(object):
     5     def __init__(self, mapfile, filters={}, defaults={}):
     6     def __init__(self, mapfile, filters={}, defaults={}):
     6         self.cache = {}
     7         self.cache = {}
     7         self.map = {}
     8         self.map = {}
    30             tmpl = self.cache[t]
    31             tmpl = self.cache[t]
    31         except KeyError:
    32         except KeyError:
    32             tmpl = self.cache[t] = file(self.map[t]).read()
    33             tmpl = self.cache[t] = file(self.map[t]).read()
    33         return self.template(tmpl, self.filters, **m)
    34         return self.template(tmpl, self.filters, **m)
    34 
    35 
       
    36     template_re = re.compile(r"#([a-zA-Z_][a-zA-Z0-9_]*)"
       
    37                              r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)"
       
    38                              r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#")
       
    39 
    35     def template(self, tmpl, filters={}, **map):
    40     def template(self, tmpl, filters={}, **map):
       
    41         lm = map.copy()
    36         while tmpl:
    42         while tmpl:
    37             m = re.search(r"#([a-zA-Z_][a-zA-Z0-9_]*)"
    43             m = self.template_re.search(tmpl)
    38                           r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)"
       
    39                           r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#", tmpl)
       
    40             if m:
    44             if m:
    41                 yield tmpl[:m.start(0)]
    45                 start = m.start(0)
       
    46                 if start:
       
    47                     yield tmpl[:start]
    42                 v = map.get(m.group(1), "")
    48                 v = map.get(m.group(1), "")
    43                 v = callable(v) and v(**map) or v
    49                 v = callable(v) and v(**map) or v
    44 
    50 
    45                 format = m.group(2)
    51                 format = m.group(2)
    46                 fl = m.group(4)
    52                 fl = m.group(4)
    47 
    53 
    48                 if format:
    54                 if format:
    49                     q = v.__iter__
    55                     q = v.__iter__
    50                     for i in q():
    56                     for i in q():
    51                         lm = map.copy()
       
    52                         lm.update(i)
    57                         lm.update(i)
    53                         yield self(format[1:], **lm)
    58                         yield self(format[1:], **lm)
    54 
    59 
    55                     v = ""
    60                     v = ""
    56 
    61 
    60 
    65 
    61                 yield v
    66                 yield v
    62                 tmpl = tmpl[m.end(0):]
    67                 tmpl = tmpl[m.end(0):]
    63             else:
    68             else:
    64                 yield tmpl
    69                 yield tmpl
    65                 return
    70                 break
       
    71 
       
    72 agescales = [("second", 1),
       
    73              ("minute", 60),
       
    74              ("hour", 3600),
       
    75              ("day", 3600 * 24),
       
    76              ("week", 3600 * 24 * 7),
       
    77              ("month", 3600 * 24 * 30),
       
    78              ("year", 3600 * 24 * 365)]
       
    79 
       
    80 agescales.reverse()
    66 
    81 
    67 def age(x):
    82 def age(x):
    68     def plural(t, c):
    83     def plural(t, c):
    69         if c == 1:
    84         if c == 1:
    70             return t
    85             return t
    74 
    89 
    75     now = time.time()
    90     now = time.time()
    76     then = x[0]
    91     then = x[0]
    77     delta = max(1, int(now - then))
    92     delta = max(1, int(now - then))
    78 
    93 
    79     scales = [["second", 1],
    94     for t, s in agescales:
    80               ["minute", 60],
       
    81               ["hour", 3600],
       
    82               ["day", 3600 * 24],
       
    83               ["week", 3600 * 24 * 7],
       
    84               ["month", 3600 * 24 * 30],
       
    85               ["year", 3600 * 24 * 365]]
       
    86 
       
    87     scales.reverse()
       
    88 
       
    89     for t, s in scales:
       
    90         n = delta / s
    95         n = delta / s
    91         if n >= 2 or s == 1:
    96         if n >= 2 or s == 1:
    92             return fmt(t, n)
    97             return fmt(t, n)
    93 
    98 
    94 def nl2br(text):
    99 def nl2br(text):