comparison mercurial/templateutil.py @ 37325:41a5d815d2c1

templater: factor out generator of join()-ed items Prepares for defining join() behavior per wrapped types and getting rid of the public joinfmt attribute.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 17 Mar 2018 21:42:27 +0900
parents c2f74b8f6b7f
children 9cd88dd3bf64
comparison
equal deleted inserted replaced
37324:c2f74b8f6b7f 37325:41a5d815d2c1
73 - "{get(extras, key)}" 73 - "{get(extras, key)}"
74 - "{files|json}" 74 - "{files|json}"
75 """ 75 """
76 76
77 def __init__(self, gen, values, makemap, joinfmt, keytype=None): 77 def __init__(self, gen, values, makemap, joinfmt, keytype=None):
78 if gen is not None: 78 self._gen = gen # generator or function returning generator
79 self._gen = gen # generator or function returning generator
80 self._values = values 79 self._values = values
81 self._makemap = makemap 80 self._makemap = makemap
82 self.joinfmt = joinfmt 81 self.joinfmt = joinfmt
83 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved 82 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved
84 83
85 def _gen(self):
86 """Default generator to stringify this as {join(self, ' ')}"""
87 for i, x in enumerate(self._values):
88 if i > 0:
89 yield ' '
90 yield self.joinfmt(x)
91 def itermaps(self, context): 84 def itermaps(self, context):
92 makemap = self._makemap 85 makemap = self._makemap
93 for x in self._values: 86 for x in self._values:
94 yield makemap(x) 87 yield makemap(x)
95 88
96 def show(self, context, mapping): 89 def show(self, context, mapping):
97 # TODO: switch gen to (context, mapping) API? 90 # TODO: switch gen to (context, mapping) API?
98 gen = self._gen 91 gen = self._gen
92 if gen is None:
93 return joinitems((self.joinfmt(x) for x in self._values), ' ')
99 if callable(gen): 94 if callable(gen):
100 return gen() 95 return gen()
101 return gen 96 return gen
102 97
103 def tovalue(self, context, mapping): 98 def tovalue(self, context, mapping):
554 def getdictitem(dictarg, key): 549 def getdictitem(dictarg, key):
555 val = dictarg.get(key) 550 val = dictarg.get(key)
556 if val is None: 551 if val is None:
557 return 552 return
558 return wraphybridvalue(dictarg, key, val) 553 return wraphybridvalue(dictarg, key, val)
554
555 def joinitems(itemiter, sep):
556 """Join items with the separator; Returns generator of bytes"""
557 first = True
558 for x in itemiter:
559 if first:
560 first = False
561 else:
562 yield sep
563 yield x