34 dateutil, |
34 dateutil, |
35 stringutil, |
35 stringutil, |
36 ) |
36 ) |
37 |
37 |
38 evalrawexp = templateutil.evalrawexp |
38 evalrawexp = templateutil.evalrawexp |
|
39 evalwrapped = templateutil.evalwrapped |
39 evalfuncarg = templateutil.evalfuncarg |
40 evalfuncarg = templateutil.evalfuncarg |
40 evalboolean = templateutil.evalboolean |
41 evalboolean = templateutil.evalboolean |
41 evaldate = templateutil.evaldate |
42 evaldate = templateutil.evaldate |
42 evalinteger = templateutil.evalinteger |
43 evalinteger = templateutil.evalinteger |
43 evalstring = templateutil.evalstring |
44 evalstring = templateutil.evalstring |
325 """Join items in a list with a delimiter.""" |
326 """Join items in a list with a delimiter.""" |
326 if not (1 <= len(args) <= 2): |
327 if not (1 <= len(args) <= 2): |
327 # i18n: "join" is a keyword |
328 # i18n: "join" is a keyword |
328 raise error.ParseError(_("join expects one or two arguments")) |
329 raise error.ParseError(_("join expects one or two arguments")) |
329 |
330 |
330 joinset = evalrawexp(context, mapping, args[0]) |
331 joinset = evalwrapped(context, mapping, args[0]) |
331 joiner = " " |
332 joiner = " " |
332 if len(args) > 1: |
333 if len(args) > 1: |
333 joiner = evalstring(context, mapping, args[1]) |
334 joiner = evalstring(context, mapping, args[1]) |
334 if isinstance(joinset, templateutil.wrapped): |
335 return joinset.join(context, mapping, joiner) |
335 return joinset.join(context, mapping, joiner) |
|
336 # TODO: rethink about join() of a byte string, which had no defined |
|
337 # behavior since a string may be either a bytes or a generator. |
|
338 # TODO: fix type error on join() of non-iterable |
|
339 joinset = templateutil.unwrapvalue(context, mapping, joinset) |
|
340 return templateutil.joinitems(pycompat.maybebytestr(joinset), joiner) |
|
341 |
336 |
342 @templatefunc('label(label, expr)') |
337 @templatefunc('label(label, expr)') |
343 def label(context, mapping, args): |
338 def label(context, mapping, args): |
344 """Apply a label to generated content. Content with |
339 """Apply a label to generated content. Content with |
345 a label applied can result in additional post-processing, such as |
340 a label applied can result in additional post-processing, such as |