From patchwork Mon Jun 23 17:55:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3,of,4] Introduce word function From: Ryan McElroy X-Patchwork-Id: 5047 Message-Id: To: mercurial-devel@selenic.com Cc: ryanmce@gmail.com Date: Mon, 23 Jun 2014 10:55:18 -0700 # HG changeset patch # User Ryan McElroy # Date 1402621343 25200 # Thu Jun 12 18:02:23 2014 -0700 # Node ID d2066ea5ea9943205a0dbef0c3e5cb36b8afd236 # Parent 6f7e63ebea83c56ba70b17fb5688a42d1a6ec40b Introduce word function This function allows returning only the nth "word" from a string. By default a string is split as by Python's split() function default, but an optional third parameter can also override what string the string is split by. diff -r 6f7e63ebea83 -r d2066ea5ea99 mercurial/templater.py --- a/mercurial/templater.py Thu Jun 12 17:53:37 2014 -0700 +++ b/mercurial/templater.py Thu Jun 12 18:02:23 2014 -0700 @@ -477,6 +477,24 @@ return '' +def word(context, mapping, args): + """return nth word from a string""" + if len(args) != 2 and len(args) != 3: + raise error.ParseError(_("word expects two or three arguments")) + + num = int(stringify(args[0][0](context, mapping, args[0][1]))) + text = stringify(args[1][0](context, mapping, args[1][1])) + if len(args) == 3: + splitter = stringify(args[2][0](context, mapping, args[2][1])) + else: + splitter = None + + tokens = text.split(splitter) + if num >= len(tokens): + return '' + else: + return tokens[num] + methods = { "string": lambda e, c: (runstring, e[1]), "rawstring": lambda e, c: (runrawstring, e[1]), @@ -504,6 +522,7 @@ "startswith": startswith, "strip": strip, "sub": sub, + "word": word, } # template engine diff -r 6f7e63ebea83 -r d2066ea5ea99 tests/test-command-template.t --- a/tests/test-command-template.t Thu Jun 12 17:53:37 2014 -0700 +++ b/tests/test-command-template.t Thu Jun 12 18:02:23 2014 -0700 @@ -1908,3 +1908,51 @@ | o line 1 line 2 + +Test word function (including index out of bounds graceful failure) + + $ hg log -Gv -R a --template "{word('1', desc)}" + @ + | + o + | + o + + o + |\ + | o head + | | + o | branch + |/ + o user, + | + o person + | + o 1 + | + o 1 + + +Test word third parameter used as splitter + + $ hg log -Gv -R a --template "{word('0', desc, 'o')}" + @ future + | + o third + | + o sec + + o merge + |\ + | o new head + | | + o | new branch + |/ + o n + | + o n + | + o + | + o line 1 + line 2