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: |