# HG changeset patch # User Thomas De Schampheleire # Date 1556567204 -7200 # Node ID 4babc6e047d08b949c0ae50a105edcfa87bb4eef # Parent 7aff9a999536632b9e112d69a0e3b22d2c82e36e templates/files: narrow down scope of webhelpers.html.literal In the 'Show Authors' functionality on a file of a repository, the following construct: h.literal(ungettext('..A..') % (..B..)) can be simplified. Here, literal was used to cater for explicit HTML tags in the (..B..) part only. There is no need to apply literal on the '..A..' part. A better structure of this code is: h.HTML(ungettext('..A..')) % h.literal(..B..) Note that we still need to wrap the '..A..' part in webhelpers.html.HTML to make sure the '%' operator will preserve the 'literal' property. See also the documentation: (the text below for 'literal' also applies to 'HTML') https://docs.pylonsproject.org/projects/webhelpers/en/latest/modules/html/builder.html " When literal is used in a mixed expression containing both literals and ordinary strings, it tries hard to escape the strings and return a literal. However, this depends on which value has “control” of the expression. literal seems to be able to take control with all combinations of the + operator, but with % and join it must be on the left side of the expression. So these all work: "A" + literal("B") literal(", ").join(["A", literal("B")]) literal("%s %s") % (16, literal("kg")) But these return an ordinary string which is prone to double-escaping later: "\n".join([literal('Foo!'), literal('Bar!')]) "%s %s" % (literal("16"), literal("<em>kg</em>")) " diff -r 7aff9a999536 -r 4babc6e047d0 kallithea/templates/files/files_history_box.html --- a/kallithea/templates/files/files_history_box.html Mon Apr 29 21:33:45 2019 +0200 +++ b/kallithea/templates/files/files_history_box.html Mon Apr 29 21:46:44 2019 +0200 @@ -1,5 +1,5 @@
- ${h.literal(ungettext(u'%s author',u'%s authors',len(c.authors)) % ('%s' % len(c.authors))) } + ${h.HTML(ungettext(u'%s author',u'%s authors',len(c.authors))) % h.literal('%s' % len(c.authors)) } %for email, user in c.authors: ${h.gravatar_div(email, size=20)}