def replace(template, ctx):
|
|
"""Replace placeholders with their values and return the result.
|
|
|
|
Example:
|
|
|
|
>>> replace("$NAME is down", {"$NAME": "foo"})
|
|
foo is down
|
|
|
|
This function explicitly ignores "variable variables".
|
|
In this example, placeholder's value itself contains a placeholder:
|
|
|
|
>>> replace("Hello $FOO", {"$FOO": "$BAR", "$BAR": "World"})
|
|
Wrong: Hello World
|
|
Correct: Hello $BAR
|
|
|
|
>>> replace("Hello $$FOO", {"$FOO": "BAR", "$BAR": "World"})
|
|
Wrong: Hello World
|
|
Correct: Hello $BAR
|
|
|
|
In other words, this function only replaces placeholders that appear
|
|
in the original template. It ignores any placeholders that "emerge"
|
|
during string substitutions. This is done mainly to avoid unexpected
|
|
behavior when check names or tags contain dollar signs.
|
|
|
|
"""
|
|
|
|
parts = template.split("$")
|
|
|
|
result = [parts.pop(0)]
|
|
for part in parts:
|
|
part = "$" + part
|
|
for placeholder, value in ctx.items():
|
|
if part.startswith(placeholder):
|
|
part = part.replace(placeholder, value, 1)
|
|
break
|
|
result.append(part)
|
|
|
|
return "".join(result)
|