|
@ -0,0 +1,38 @@ |
|
|
|
|
|
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) |