641 if not sym: |
641 if not sym: |
642 return _("incompatible use of template filter '%s'") % fn |
642 return _("incompatible use of template filter '%s'") % fn |
643 return (_("template filter '%s' is not compatible with keyword '%s'") |
643 return (_("template filter '%s' is not compatible with keyword '%s'") |
644 % (fn, sym)) |
644 % (fn, sym)) |
645 |
645 |
646 def _checkeditermaps(darg, d): |
|
647 try: |
|
648 for v in d: |
|
649 if not isinstance(v, dict): |
|
650 raise TypeError |
|
651 yield v |
|
652 except TypeError: |
|
653 sym = findsymbolicname(darg) |
|
654 if sym: |
|
655 raise error.ParseError(_("keyword '%s' is not iterable of mappings") |
|
656 % sym) |
|
657 else: |
|
658 raise error.ParseError(_("%r is not iterable of mappings") % d) |
|
659 |
|
660 def _iteroverlaymaps(context, origmapping, newmappings): |
646 def _iteroverlaymaps(context, origmapping, newmappings): |
661 """Generate combined mappings from the original mapping and an iterable |
647 """Generate combined mappings from the original mapping and an iterable |
662 of partial mappings to override the original""" |
648 of partial mappings to override the original""" |
663 for i, nm in enumerate(newmappings): |
649 for i, nm in enumerate(newmappings): |
664 lm = context.overlaymap(origmapping, nm) |
650 lm = context.overlaymap(origmapping, nm) |
665 lm['index'] = i |
651 lm['index'] = i |
666 yield lm |
652 yield lm |
667 |
653 |
668 def _applymap(context, mapping, diter, targ): |
654 def _applymap(context, mapping, d, targ): |
669 for lm in _iteroverlaymaps(context, mapping, diter): |
655 for lm in _iteroverlaymaps(context, mapping, d.itermaps(context)): |
670 yield evalrawexp(context, lm, targ) |
656 yield evalrawexp(context, lm, targ) |
671 |
657 |
672 def runmap(context, mapping, data): |
658 def runmap(context, mapping, data): |
673 darg, targ = data |
659 darg, targ = data |
674 d = evalrawexp(context, mapping, darg) |
660 d = evalwrapped(context, mapping, darg) |
675 # TODO: a generator should be rejected because it is a thunk of lazy |
661 return mappedgenerator(_applymap, args=(mapping, d, targ)) |
676 # string, but we can't because hgweb abuses generator as a keyword |
|
677 # that returns a list of dicts. |
|
678 # TODO: drop _checkeditermaps() and pass 'd' to mappedgenerator so it |
|
679 # can be restarted. |
|
680 if isinstance(d, wrapped): |
|
681 diter = d.itermaps(context) |
|
682 else: |
|
683 diter = _checkeditermaps(darg, d) |
|
684 return mappedgenerator(_applymap, args=(mapping, diter, targ)) |
|
685 |
662 |
686 def runmember(context, mapping, data): |
663 def runmember(context, mapping, data): |
687 darg, memb = data |
664 darg, memb = data |
688 d = evalrawexp(context, mapping, darg) |
665 d = evalrawexp(context, mapping, darg) |
689 if util.safehasattr(d, 'tomap'): |
666 if util.safehasattr(d, 'tomap'): |