diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -35,6 +35,7 @@ from . import ( hg, hook, revset, + templatekw, ui as uimod, util, ) @@ -758,6 +759,7 @@ extraloaders = [ ('cmdtable', commands, 'loadcmdtable'), ('filesetpredicate', fileset, 'loadpredicate'), ('revsetpredicate', revset, 'loadpredicate'), + ('templatekeyword', templatekw, 'loadkeyword'), ] def _dispatch(req): diff --git a/mercurial/registrar.py b/mercurial/registrar.py --- a/mercurial/registrar.py +++ b/mercurial/registrar.py @@ -161,3 +161,33 @@ class filesetpredicate(_funcregistrarbas def _extrasetup(self, name, func, callstatus=False, callexisting=False): func._callstatus = callstatus func._callexisting = callexisting + +class _templateregistrarbase(_funcregistrarbase): + """Base of decorator to register functions as template specific one + """ + _docformat = ":%s: %s" + +class templatekeyword(_templateregistrarbase): + """Decorator to register template keyword + + Usage:: + + templaetkeyword = registrar.templatekeyword() + + @templatekeyword('mykeyword') + def mykeywordfunc(repo, ctx, templ, cache, revcache, **args): + '''Explanation of this template keyword .... + ''' + pass + + The first string argument is used also in online help. + + 'templatekeyword' instance in example above can be used to + decorate multiple functions. + + Decorated functions are registered automatically at loading + extension, if an instance named as 'templatekeyword' is used for + decorating in extension. + + Otherwise, explicit 'templatekw.loadkeyword()' is needed. + """ diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py --- a/mercurial/templatekw.py +++ b/mercurial/templatekw.py @@ -574,5 +574,11 @@ keywords = { 'tags': showtags, } +def loadkeyword(ui, extname, registrarobj): + """Load template keyword from specified registrarobj + """ + for name, func in registrarobj._table.iteritems(): + keywords[name] = func + # tell hggettext to extract docstrings from these functions: i18nfunctions = keywords.values()