[PATCH 3 of 6] templater: add function to help substituting patterns in template string

Yuya Nishihara yuya at tcha.org
Thu Feb 15 08:18:41 EST 2018


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1515291685 -32400
#      Sun Jan 07 11:21:25 2018 +0900
# Node ID 5a8caa27847f9b8f040589ed182522904f8a9574
# Parent  edc874f03cf670040c4a3cfc257fec1a171e0da6
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


More information about the Mercurial-devel mailing list