mercurial/templater.py
changeset 1901 c64bef3d7043
parent 1900 f2815605186e
child 1902 1cc5f25653a3
equal deleted inserted replaced
1900:f2815605186e 1901:c64bef3d7043
     1 import re
     1 import re
     2 from demandload import demandload
     2 from demandload import demandload
     3 demandload(globals(), "cgi os time urllib util")
     3 from i18n import gettext as _
       
     4 demandload(globals(), "cStringIO cgi os time urllib util")
       
     5 
       
     6 esctable = {
       
     7     '\\': '\\',
       
     8     'r': '\r',
       
     9     't': '\t',
       
    10     'n': '\n',
       
    11     'v': '\v',
       
    12     }
       
    13 
       
    14 def parsestring(s):
       
    15     fp = cStringIO.StringIO()
       
    16     escape = False
       
    17     first = s[0]
       
    18     if len(s) < 2: raise SyntaxError(_('string too short'))
       
    19     if first not in "'\"": raise SyntaxError(_('invalid quote'))
       
    20     if s[-1] != first: raise SyntaxError(_('unmatched quotes'))
       
    21     for c in s[1:-1]:
       
    22         if escape:
       
    23             fp.write(esctable.get(c, c))
       
    24             escape = False
       
    25         elif c == '\\': escape = True
       
    26         elif c == first: raise SyntaxError(_('string ends early'))
       
    27         else: fp.write(c)
       
    28     if escape: raise SyntaxError(_('unterminated escape'))
       
    29     return fp.getvalue()
     4 
    30 
     5 class templater(object):
    31 class templater(object):
     6     def __init__(self, mapfile, filters={}, defaults={}):
    32     def __init__(self, mapfile, filters={}, defaults={}):
     7         self.cache = {}
    33         self.cache = {}
     8         self.map = {}
    34         self.map = {}
     9         self.base = os.path.dirname(mapfile)
    35         self.base = os.path.dirname(mapfile)
    10         self.filters = filters
    36         self.filters = filters
    11         self.defaults = defaults
    37         self.defaults = defaults
    12 
    38 
       
    39         i = 0
    13         for l in file(mapfile):
    40         for l in file(mapfile):
    14             m = re.match(r'(\S+)\s*=\s*(".*"|\'.*\')$', l)
    41             i += 1
       
    42             m = re.match(r'(\S+)\s*=\s*(["\'].*["\'])$', l)
    15             if m:
    43             if m:
    16                 self.cache[m.group(1)] = eval(m.group(2))
    44                 try:
       
    45                     s = m.group(2)
       
    46                     self.cache[m.group(1)] = parsestring(s)
       
    47                 except SyntaxError, inst:
       
    48                     raise SyntaxError('%s:%s: %s' % (mapfile, i, inst.args[0]))
    17             else:
    49             else:
    18                 m = re.match(r'(\S+)\s*=\s*(\S+)', l)
    50                 m = re.match(r'(\S+)\s*=\s*(\S+)', l)
    19                 if m:
    51                 if m:
    20                     self.map[m.group(1)] = os.path.join(self.base, m.group(2))
    52                     self.map[m.group(1)] = os.path.join(self.base, m.group(2))
    21                 else:
    53                 else: