--- a/mercurial/templater.py Mon Mar 10 15:00:41 2014 -0500
+++ b/mercurial/templater.py Tue Mar 11 16:19:08 2014 -0500
@@ -21,6 +21,7 @@
")": (0, None, None),
"symbol": (0, ("symbol",), None),
"string": (0, ("string",), None),
+ "rawstring": (0, ("rawstring",), None),
"end": (0, None, None),
}
@@ -50,7 +51,7 @@
continue
if d == c:
if not decode:
- yield ('string', program[s:pos].replace('\\', r'\\'), s)
+ yield ('rawstring', program[s:pos], s)
break
yield ('string', program[s:pos], s)
break
@@ -76,23 +77,22 @@
pos += 1
yield ('end', None, pos)
-def compiletemplate(tmpl, context):
+def compiletemplate(tmpl, context, strtoken="string"):
parsed = []
pos, stop = 0, len(tmpl)
p = parser.parser(tokenizer, elements)
while pos < stop:
n = tmpl.find('{', pos)
if n < 0:
- parsed.append(("string", tmpl[pos:].decode("string-escape")))
+ parsed.append((strtoken, tmpl[pos:]))
break
if n > 0 and tmpl[n - 1] == '\\':
# escaped
- parsed.append(("string",
- (tmpl[pos:n - 1] + "{").decode("string-escape")))
+ parsed.append((strtoken, (tmpl[pos:n - 1] + "{")))
pos = n + 1
continue
if n > pos:
- parsed.append(("string", tmpl[pos:n].decode("string-escape")))
+ parsed.append((strtoken, tmpl[pos:n]))
pd = [tmpl, n + 1, stop]
parseres, pos = p.parse(pd)
@@ -127,13 +127,16 @@
return context._filters[f]
def gettemplate(exp, context):
- if exp[0] == 'string':
- return compiletemplate(exp[1], context)
+ if exp[0] == 'string' or exp[0] == 'rawstring':
+ return compiletemplate(exp[1], context, strtoken=exp[0])
if exp[0] == 'symbol':
return context._load(exp[1])
raise error.ParseError(_("expected template specifier"))
def runstring(context, mapping, data):
+ return data.decode("string-escape")
+
+def runrawstring(context, mapping, data):
return data
def runsymbol(context, mapping, key):
@@ -234,12 +237,8 @@
except ValueError:
raise error.ParseError(_("fill expects an integer width"))
try:
- initindent = stringify(args[2][0](context, mapping, args[2][1]))
- initindent = stringify(runtemplate(context, mapping,
- compiletemplate(initindent, context)))
- hangindent = stringify(args[3][0](context, mapping, args[3][1]))
- hangindent = stringify(runtemplate(context, mapping,
- compiletemplate(hangindent, context)))
+ initindent = stringify(_evalifliteral(args[2], context, mapping))
+ hangindent = stringify(_evalifliteral(args[3], context, mapping))
except IndexError:
pass
@@ -285,8 +284,9 @@
def _evalifliteral(arg, context, mapping):
t = stringify(arg[0](context, mapping, arg[1]))
- if arg[0] == runstring:
- yield runtemplate(context, mapping, compiletemplate(t, context))
+ if arg[0] == runstring or arg[0] == runrawstring:
+ yield runtemplate(context, mapping,
+ compiletemplate(t, context, strtoken='rawstring'))
else:
yield t
@@ -338,7 +338,7 @@
joiner = " "
if len(args) > 1:
- joiner = args[1][0](context, mapping, args[1][1])
+ joiner = stringify(args[1][0](context, mapping, args[1][1]))
first = True
for x in joinset:
@@ -447,9 +447,9 @@
if not (1 <= len(args) <= 2):
raise error.ParseError(_("strip expects one or two arguments"))
- text = args[0][0](context, mapping, args[0][1])
+ text = stringify(args[0][0](context, mapping, args[0][1]))
if len(args) == 2:
- chars = args[1][0](context, mapping, args[1][1])
+ chars = stringify(args[1][0](context, mapping, args[1][1]))
return text.strip(chars)
return text.strip()
@@ -460,13 +460,12 @@
pat = stringify(args[0][0](context, mapping, args[0][1]))
rpl = stringify(args[1][0](context, mapping, args[1][1]))
- src = stringify(args[2][0](context, mapping, args[2][1]))
- src = stringify(runtemplate(context, mapping,
- compiletemplate(src, context)))
+ src = stringify(_evalifliteral(args[2], context, mapping))
yield re.sub(pat, rpl, src)
methods = {
"string": lambda e, c: (runstring, e[1]),
+ "rawstring": lambda e, c: (runrawstring, e[1]),
"symbol": lambda e, c: (runsymbol, e[1]),
"group": lambda e, c: compileexp(e[1], c),
# ".": buildmember,