comparison mercurial/templater.py @ 20066:64b4f0cd7336 stable

templater: fix escaping in nested string literals (issue4102) Before the templater got extended for nested expressions, it made sense to decode string escapes across the whole string. Now we do it on a piece by piece basis.
author Matt Mackall <mpm@selenic.com>
date Mon, 18 Nov 2013 14:02:26 -0500
parents 0361163efbaf
children 3d8bfe2ecf6d
comparison
equal deleted inserted replaced
20064:99c4b8f79324 20066:64b4f0cd7336
50 continue 50 continue
51 if d == c: 51 if d == c:
52 if not decode: 52 if not decode:
53 yield ('string', program[s:pos].replace('\\', r'\\'), s) 53 yield ('string', program[s:pos].replace('\\', r'\\'), s)
54 break 54 break
55 yield ('string', program[s:pos].decode('string-escape'), s) 55 yield ('string', program[s:pos], s)
56 break 56 break
57 pos += 1 57 pos += 1
58 else: 58 else:
59 raise error.ParseError(_("unterminated string"), s) 59 raise error.ParseError(_("unterminated string"), s)
60 elif c.isalnum() or c in '_': 60 elif c.isalnum() or c in '_':
78 78
79 def compiletemplate(tmpl, context): 79 def compiletemplate(tmpl, context):
80 parsed = [] 80 parsed = []
81 pos, stop = 0, len(tmpl) 81 pos, stop = 0, len(tmpl)
82 p = parser.parser(tokenizer, elements) 82 p = parser.parser(tokenizer, elements)
83
84 while pos < stop: 83 while pos < stop:
85 n = tmpl.find('{', pos) 84 n = tmpl.find('{', pos)
86 if n < 0: 85 if n < 0:
87 parsed.append(("string", tmpl[pos:])) 86 parsed.append(("string", tmpl[pos:].decode("string-escape")))
88 break 87 break
89 if n > 0 and tmpl[n - 1] == '\\': 88 if n > 0 and tmpl[n - 1] == '\\':
90 # escaped 89 # escaped
91 parsed.append(("string", tmpl[pos:n - 1] + "{")) 90 parsed.append(("string",
91 (tmpl[pos:n - 1] + "{").decode("string-escape")))
92 pos = n + 1 92 pos = n + 1
93 continue 93 continue
94 if n > pos: 94 if n > pos:
95 parsed.append(("string", tmpl[pos:n])) 95 parsed.append(("string", tmpl[pos:n].decode("string-escape")))
96 96
97 pd = [tmpl, n + 1, stop] 97 pd = [tmpl, n + 1, stop]
98 parseres, pos = p.parse(pd) 98 parseres, pos = p.parse(pd)
99 parsed.append(parseres) 99 parsed.append(parseres)
100 100