comparison mercurial/templater.py @ 37105:638a241202a3

templater: add hook point to populate additional mapping items The 'revcache' dict will be inserted by this hook.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 15 Mar 2018 21:49:33 +0900
parents f0b6fbea00cf
children 888507ec655e
comparison
equal deleted inserted replaced
37104:656ac240f392 37105:638a241202a3
575 575
576 @abc.abstractmethod 576 @abc.abstractmethod
577 def lookup(self, context, mapping, key): 577 def lookup(self, context, mapping, key):
578 """Return a resource for the key if available; otherwise None""" 578 """Return a resource for the key if available; otherwise None"""
579 579
580 @abc.abstractmethod
581 def populatemap(self, context, origmapping, newmapping):
582 """Return a dict of additional mapping items which should be paired
583 with the given new mapping"""
584
580 class nullresourcemapper(resourcemapper): 585 class nullresourcemapper(resourcemapper):
581 def availablekeys(self, context, mapping): 586 def availablekeys(self, context, mapping):
582 return set() 587 return set()
583 588
584 def knownkeys(self): 589 def knownkeys(self):
585 return set() 590 return set()
586 591
587 def lookup(self, context, mapping, key): 592 def lookup(self, context, mapping, key):
588 return None 593 return None
594
595 def populatemap(self, context, origmapping, newmapping):
596 return {}
589 597
590 class engine(object): 598 class engine(object):
591 '''template expansion engine. 599 '''template expansion engine.
592 600
593 template expansion works like this. a map file contains key=value 601 template expansion works like this. a map file contains key=value
632 newres = self._resources.availablekeys(self, newmapping) 640 newres = self._resources.availablekeys(self, newmapping)
633 mapping = {k: v for k, v in origmapping.iteritems() 641 mapping = {k: v for k, v in origmapping.iteritems()
634 if (k in knownres # not a symbol per self.symbol() 642 if (k in knownres # not a symbol per self.symbol()
635 or newres.isdisjoint(self._defaultrequires(k)))} 643 or newres.isdisjoint(self._defaultrequires(k)))}
636 mapping.update(newmapping) 644 mapping.update(newmapping)
645 mapping.update(
646 self._resources.populatemap(self, origmapping, newmapping))
637 return mapping 647 return mapping
638 648
639 def _defaultrequires(self, key): 649 def _defaultrequires(self, key):
640 """Resource keys required by the specified default symbol function""" 650 """Resource keys required by the specified default symbol function"""
641 v = self._defaults.get(key) 651 v = self._defaults.get(key)
687 def process(self, t, mapping): 697 def process(self, t, mapping):
688 '''Perform expansion. t is name of map element to expand. 698 '''Perform expansion. t is name of map element to expand.
689 mapping contains added elements for use during expansion. Is a 699 mapping contains added elements for use during expansion. Is a
690 generator.''' 700 generator.'''
691 func, data = self._load(t) 701 func, data = self._load(t)
702 # populate additional items only if they don't exist in the given
703 # mapping. this is slightly different from overlaymap() because the
704 # initial 'revcache' may contain pre-computed items.
705 extramapping = self._resources.populatemap(self, {}, mapping)
706 if extramapping:
707 extramapping.update(mapping)
708 mapping = extramapping
692 return _flatten(func(self, mapping, data)) 709 return _flatten(func(self, mapping, data))
693 710
694 engines = {'default': engine} 711 engines = {'default': engine}
695 712
696 def stylelist(): 713 def stylelist():