# HG changeset patch # User Yuya Nishihara # Date 2018-01-07 02:21:25 # Node ID c6ce479f7a28644487c430d9629c720ff9079fc3 # Parent 18bdfad8506e45a2181ef80ed614f040a6a03cb8 templater: add function to help substituting patterns in template string This will be used to rewrite a filename pattern to a template string. diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -172,6 +172,26 @@ def _parsetemplate(tmpl, start, stop, qu raise error.ProgrammingError('unexpected type: %s' % typ) raise error.ProgrammingError('unterminated scanning of template') +def scantemplate(tmpl): + """Scan (type, start, end) positions of outermost elements in template + + >>> list(scantemplate(b'foo{bar}"baz')) + [('string', 0, 3), ('template', 3, 8), ('string', 8, 12)] + >>> list(scantemplate(b'outer{"inner"}outer')) + [('string', 0, 5), ('template', 5, 14), ('string', 14, 19)] + >>> list(scantemplate(b'foo\\{escaped}')) + [('string', 0, 5), ('string', 5, 13)] + """ + last = None + for typ, val, pos in _scantemplate(tmpl, 0, len(tmpl)): + if last: + yield last + (pos,) + if typ == 'end': + return + else: + last = (typ, pos) + raise error.ProgrammingError('unterminated scanning of template') + def _scantemplate(tmpl, start, stop, quote=''): """Parse template string into chunks of strings and template expressions""" sepchars = '{' + quote