[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