aboutsummaryrefslogtreecommitdiff
path: root/src/utils/parse.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/parse.py')
-rw-r--r--src/utils/parse.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/utils/parse.py b/src/utils/parse.py
index ce2ee793..c0740785 100644
--- a/src/utils/parse.py
+++ b/src/utils/parse.py
@@ -120,3 +120,38 @@ def timed_args(args, min_args):
return time, args[1:]
return None, args
+def format_tokens(s: str, names: typing.List[str], sigil: str="$"
+ ) -> typing.List[typing.Tuple[int, str]]:
+ names = names.copy()
+ names.sort()
+ names.reverse()
+
+ i = 0
+ max = len(s)-1
+ sigil_found = False
+ tokens: typing.List[typing.Tuple[int, str]] = []
+
+ while i < max:
+ if s[i] == sigil:
+ i += 1
+ if not s[i] == sigil:
+ for name in names:
+ if len(name) <= (len(s)-i) and s[i:i+len(name)] == name:
+ tokens.append((i-1, "%s%s" % (sigil, name)))
+ i += len(name)
+ break
+ else:
+ tokens.append((i, "$"))
+ i += 1
+ return tokens
+
+def format_token_replace(s: str, vars: typing.Dict[str, str],
+ sigil: str="$") -> str:
+ vars = vars.copy()
+ vars.update({"": ""})
+ tokens = format_tokens(s, list(vars.keys()), sigil)
+ tokens.sort(key=lambda x: x[0])
+ tokens.reverse()
+ for i, token in tokens:
+ s = s[:i] + vars[token.replace(sigil, "", 1)] + s[i+len(token):]
+ return s