[PATCH 2 of 2] template: add pad function for padding output

Augie Fackler raf at durin42.com
Fri Jan 17 08:20:01 CST 2014


On Fri, Jan 17, 2014 at 02:41:36PM +0100, Mads Kiilerich wrote:
> 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.

+1 on util.parsebool for consistency

>
> But I think I would suggest having a separate 'rpad' "filter" instead.
>
> /Mads
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list