It should be split in 2 patches (one to reorder logically the filter table, the
other to stringify the formatting filters).
diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
--- a/mercurial/templatefilters.py
+++ b/mercurial/templatefilters.py
@@ -152,33 +152,48 @@
else:
raise TypeError('cannot encode type %s' % obj.__class__.__name__)
+def stringifyfn(fn):
+ '''expand a string before it is passed to a filter.'''
+ return lambda x: fn(templater.stringify(x))
+
filters = {
- "addbreaks": nl2br,
- "basename": os.path.basename,
+ # dates
"age": age,
"date": lambda x: util.datestr(x),
- "domain": domain,
- "email": util.email,
- "escape": lambda x: cgi.escape(x, True),
- "fill68": lambda x: fill(x, width=68),
- "fill76": lambda x: fill(x, width=76),
- "firstline": firstline,
- "tabindent": lambda x: indent(x, '\t'),
"hgdate": lambda x: "%d %d" % x,
"isodate": lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2'),
"isodatesec": lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2'),
- "obfuscate": obfuscate,
- "permissions": permissions,
- "person": person,
"rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2"),
"rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2"),
- "short": lambda x: x[:12],
"shortdate": util.shortdate,
+
+ # string formatting
+ "addbreaks": stringifyfn(nl2br),
+ "escape": stringifyfn(lambda x: cgi.escape(x, True)),
+ "fill68": stringifyfn(lambda x: fill(x, width=68)),
+ "fill76": stringifyfn(lambda x: fill(x, width=76)),
+ "firstline": stringifyfn(firstline),
"stringify": templater.stringify,
- "strip": lambda x: x.strip(),
- "urlescape": lambda x: urllib.quote(x),
- "user": lambda x: util.shortuser(x),
- "stringescape": lambda x: x.encode('string_escape'),
- "xmlescape": xmlescape,
+ "strip": stringifyfn(lambda x: x.strip()),
+ "tabindent": stringifyfn(lambda x: indent(x, '\t')),
+
+ # escaping / obfuscating
+ "obfuscate": stringifyfn(obfuscate),
+ "urlescape": stringifyfn(lambda x: urllib.quote(x)),
+ "stringescape": stringifyfn(lambda x: x.encode('string_escape')),
+ "xmlescape": stringifyfn(xmlescape),
+
+ # cset extraction
+ "domain": stringifyfn(domain),
+ "email": stringifyfn(util.email),
+ "permissions": permissions,
+ "person": stringifyfn(person),
+ "short": stringifyfn(lambda x: x[:12]),
+ "user": stringifyfn(lambda x: util.shortuser(x)),
+
+ # filenames
+ "basename": stringifyfn(os.path.basename),
+
+ # serialization
"json": json,
} |