[PATCH 2 of 2] template: add pad function for padding output
Mads Kiilerich
mads at kiilerich.com
Fri Jan 17 07:41:36 CST 2014
On 01/17/2014 09:45 AM, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1389946608 28800
> # Fri Jan 17 00:16:48 2014 -0800
> # Node ID 77cf62dd2af0b5631a2864744e720e61ad4cde6a
> # Parent b18359a70b640d2aeb3f4afd1c8e47d775402b8e
> template: add pad function for padding output
>
> Adds a pad template function with the following signature:
>
> pad(text, width, right=False, fillchar=' ')
Nice. I have been missing some printf-ish functionality too.
I kind of expected the 'fill' function to do this (or something very
similar) ... especially for short strings. Having a separate "fill or
overflow" function might make sense. Next on the feature creep list
would be a fill that strips instead of overflowing. ;-)
I thought it was possible to have filters with parameters. That would
have seemed like a more obvious way of doing it to me. But apparently
not. I wonder if it would be feasible to fix that ... but I assume that
when/if that is fixed then it will be possible to use this as a filter.
> This uses the standard python ljust and rjust functions to produce a string
> that is at least a certain width. This is especially useful with the
> introduction of a '{shortestnode}' keyword, since the output can be variable
> length.
True, but I know how to get hashes with a fixed width. It is much harder
with usernames and branch names and commit messages ;-)
> diff --git a/mercurial/templater.py b/mercurial/templater.py
> --- a/mercurial/templater.py
> +++ b/mercurial/templater.py
> @@ -245,6 +245,31 @@
>
> return templatefilters.fill(text, width, initindent, hangindent)
>
> +def pad(context, mapping, args):
> + """usage: pad(text, width, right=False, fillchar=' ')
> + """
> + if not (2 <= len(args) <= 4):
> + raise error.ParseError(_("pad() expects two to four arguments"))
> +
> + width = int(stringify(args[1][0](context, mapping, args[1][1])))
> +
> + text = stringify(args[0][0](context, mapping, args[0][1]))
> + if args[0][0] == runstring:
> + text = stringify(runtemplate(context, mapping,
> + compiletemplate(text, context)))
> +
> + right = False
> + fillchar = ' '
> + if len(args) > 2:
> + right = stringify(args[2][0](context, mapping, args[2][1])) == "True"
Expecting a literal "True" would surprise me as a user. Most other
boolean inputs use util.parsebool.
But I think I would suggest having a separate 'rpad' "filter" instead.
/Mads
More information about the Mercurial-devel
mailing list