##// END OF EJS Templates
templater: add parsing and expansion rules to process "templatealias" section...
Yuya Nishihara -
r28912:867d6ba2 default
parent child Browse files
Show More
@@ -3671,8 +3671,12 b' def debugtemplate(ui, repo, tmpl, **opts'
3671 3671 raise error.Abort(_('malformed keyword definition: %s') % d)
3672 3672
3673 3673 if ui.verbose:
3674 aliases = ui.configitems('templatealias')
3674 3675 tree = templater.parse(tmpl)
3675 3676 ui.note(templater.prettyformat(tree), '\n')
3677 newtree = templater.expandaliases(tree, aliases)
3678 if newtree != tree:
3679 ui.note("* expanded:\n", templater.prettyformat(newtree), '\n')
3676 3680
3677 3681 mapfile = None
3678 3682 if revs is None:
@@ -872,6 +872,25 b' exprmethods = {'
872 872 methods = exprmethods.copy()
873 873 methods["integer"] = exprmethods["symbol"] # '{1}' as variable
874 874
875 class _aliasrules(parser.basealiasrules):
876 """Parsing and expansion rule set of template aliases"""
877 _section = _('template alias')
878 _parse = staticmethod(_parseexpr)
879
880 @staticmethod
881 def _trygetfunc(tree):
882 """Return (name, args) if tree is func(...) or ...|filter; otherwise
883 None"""
884 if tree[0] == 'func' and tree[1][0] == 'symbol':
885 return tree[1][1], getlist(tree[2])
886 if tree[0] == '|' and tree[2][0] == 'symbol':
887 return tree[2][1], [tree[1]]
888
889 def expandaliases(tree, aliases):
890 """Return new tree of aliases are expanded"""
891 aliasmap = _aliasrules.buildmap(aliases)
892 return _aliasrules.expand(aliasmap, tree)
893
875 894 # template engine
876 895
877 896 stringify = templatefilters.stringify
@@ -3654,6 +3654,100 b' json filter should escape HTML tags so t'
3654 3654 $ hg log -T "{'<foo@example.org>'|json}\n" -R a -l1
3655 3655 "\u003cfoo@example.org\u003e"
3656 3656
3657 Templater supports aliases of symbol and func() styles:
3658
3659 $ hg clone -q a aliases
3660 $ cd aliases
3661 $ cat <<EOF >> .hg/hgrc
3662 > [templatealias]
3663 > r = rev
3664 > rn = "{r}:{node|short}"
3665 > status(c, files) = files % "{c} {file}\n"
3666 > utcdate(d) = localdate(d, "UTC")
3667 > EOF
3668
3669 $ hg debugtemplate -vr0 '{rn} {utcdate(date)|isodate}\n'
3670 (template
3671 ('symbol', 'rn')
3672 ('string', ' ')
3673 (|
3674 (func
3675 ('symbol', 'utcdate')
3676 ('symbol', 'date'))
3677 ('symbol', 'isodate'))
3678 ('string', '\n'))
3679 * expanded:
3680 (template
3681 (template
3682 ('symbol', 'rev')
3683 ('string', ':')
3684 (|
3685 ('symbol', 'node')
3686 ('symbol', 'short')))
3687 ('string', ' ')
3688 (|
3689 (func
3690 ('symbol', 'localdate')
3691 (list
3692 ('symbol', 'date')
3693 ('string', 'UTC')))
3694 ('symbol', 'isodate'))
3695 ('string', '\n'))
3696 hg: parse error: unknown function 'utcdate'
3697 [255]
3698
3699 $ hg debugtemplate -vr0 '{status("A", file_adds)}'
3700 (template
3701 (func
3702 ('symbol', 'status')
3703 (list
3704 ('string', 'A')
3705 ('symbol', 'file_adds'))))
3706 * expanded:
3707 (template
3708 (%
3709 ('symbol', 'file_adds')
3710 (template
3711 ('string', 'A')
3712 ('string', ' ')
3713 ('symbol', 'file')
3714 ('string', '\n'))))
3715 hg: parse error: unknown function 'status'
3716 [255]
3717
3718 A unary function alias can be called as a filter:
3719
3720 $ hg debugtemplate -vr0 '{date|utcdate|isodate}\n'
3721 (template
3722 (|
3723 (|
3724 ('symbol', 'date')
3725 ('symbol', 'utcdate'))
3726 ('symbol', 'isodate'))
3727 ('string', '\n'))
3728 * expanded:
3729 (template
3730 (|
3731 (func
3732 ('symbol', 'localdate')
3733 (list
3734 ('symbol', 'date')
3735 ('string', 'UTC')))
3736 ('symbol', 'isodate'))
3737 ('string', '\n'))
3738 hg: parse error: unknown function 'utcdate'
3739 [255]
3740
3741 Unparsable alias:
3742
3743 $ hg debugtemplate --config templatealias.bad='x(' -v '{bad}'
3744 (template
3745 ('symbol', 'bad'))
3746 abort: failed to parse the definition of template alias "bad": at 2: not a prefix: end
3747 [255]
3748
3749 $ cd ..
3750
3657 3751 Set up repository for non-ascii encoding tests:
3658 3752
3659 3753 $ hg init nonascii
General Comments 0
You need to be logged in to leave comments. Login now