# HG changeset patch # User Mark Thomas # Date 2018-10-12 15:46:52 # Node ID 9458dbfa7f339094c76fe7489132fc77e96beffe # Parent 2c5316796f4506fa6fbd5d1f7c32899aa58bf2cb 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 diff --git a/mercurial/templatefuncs.py b/mercurial/templatefuncs.py --- a/mercurial/templatefuncs.py +++ b/mercurial/templatefuncs.py @@ -216,8 +216,9 @@ def mailmap(context, mapping, args): 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 @@ def pad(context, mapping, args): text = evalstring(context, mapping, args['text']) + truncate = False left = False fillchar = ' ' if 'fillchar' in args: @@ -240,8 +242,12 @@ def pad(context, mapping, args): 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: diff --git a/tests/test-template-functions.t b/tests/test-template-functions.t --- a/tests/test-template-functions.t +++ b/tests/test-template-functions.t @@ -696,6 +696,12 @@ pad() should interact well with color co > '{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 @@ Test pad function 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'