diff -r 18bdfad8506e -r c6ce479f7a28 mercurial/templater.py --- a/mercurial/templater.py Sun Jan 07 11:04:53 2018 +0900 +++ b/mercurial/templater.py Sun Jan 07 11:21:25 2018 +0900 @@ -172,6 +172,26 @@ 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