templatefuncs: add truncate parameter to pad
Add a truncate option to pad that additionally truncates the text to the pad
width if it is wider.
Since color codes can cause a problem with this, when the text is truncated,
the color codes are also stripped. Users of the truncate option should label
the text outside the pad.
Differential Revision: https://phab.mercurial-scm.org/D5000
--- a/mercurial/templatefuncs.py Fri Oct 12 15:46:51 2018 +0000
+++ b/mercurial/templatefuncs.py Fri Oct 12 15:46:52 2018 +0000
@@ -216,8 +216,9 @@
return stringutil.mapname(cache['mailmap'], author)
-@templatefunc('pad(text, width[, fillchar=\' \'[, left=False]])',
- argspec='text width fillchar left')
+@templatefunc(
+ 'pad(text, width[, fillchar=\' \'[, left=False[, truncate=False]]])',
+ argspec='text width fillchar left truncate')
def pad(context, mapping, args):
"""Pad text with a
fill character."""
@@ -231,6 +232,7 @@
text = evalstring(context, mapping, args['text'])
+ truncate = False
left = False
fillchar = ' '
if 'fillchar' in args:
@@ -240,8 +242,12 @@
raise error.ParseError(_("pad() expects a single fill character"))
if 'left' in args:
left = evalboolean(context, mapping, args['left'])
+ if 'truncate' in args:
+ truncate = evalboolean(context, mapping, args['truncate'])
fillwidth = width - encoding.colwidth(color.stripeffects(text))
+ if fillwidth < 0 and truncate:
+ return encoding.trim(color.stripeffects(text), width, leftside=left)
if fillwidth <= 0:
return text
if left:
--- a/tests/test-template-functions.t Fri Oct 12 15:46:51 2018 +0000
+++ b/tests/test-template-functions.t Fri Oct 12 15:46:52 2018 +0000
@@ -696,6 +696,12 @@
> '{pad(label(red, "red"), 5, label(cyan, "-"))}\n'
\x1b[0;31mred\x1b[0m\x1b[0;36m-\x1b[0m\x1b[0;36m-\x1b[0m (esc)
+pad() with truncate has to strip color codes, though
+
+ $ hg debugtemplate --color=always \
+ > '{pad(label(red, "scarlet"), 5, truncate=true)}\n'
+ scarl
+
label should be no-op if color is disabled:
$ hg log --color=never -l 1 --template '{label(red, "text\n")}'
@@ -928,6 +934,15 @@
1------------------- {node|short}
0------------------- test
+ $ hg log --template '{pad(author, 5, "-", False, True)}\n'
+ test-
+ {node
+ test-
+ $ hg log --template '{pad(author, 5, "-", True, True)}\n'
+ -test
+ hort}
+ -test
+
Test template string in pad function
$ hg log -r 0 -T '{pad("\{{rev}}", 10)} {author|user}\n'