39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
"""Variable substitution for $VAR/${VAR} and {{var}} templates."""
|
|
|
|
import os
|
|
import re
|
|
from pathlib import Path
|
|
from typing import Dict
|
|
|
|
|
|
def substitute(text: str, variables: Dict[str, str]) -> str:
|
|
"""Replace $VAR and ${VAR} with values from variables dict or env."""
|
|
if not isinstance(text, str):
|
|
return text
|
|
|
|
pattern = re.compile(r"\$(\w+)|\$\{([^}]+)\}")
|
|
|
|
def _replace(match: re.Match[str]) -> str:
|
|
key = match.group(1) or match.group(2) or ""
|
|
if key in variables:
|
|
return str(variables[key])
|
|
if key == "HOME":
|
|
return str(Path.home())
|
|
if key in os.environ:
|
|
return os.environ[key]
|
|
return match.group(0)
|
|
|
|
return pattern.sub(_replace, text)
|
|
|
|
|
|
def substitute_template(text: str, context: Dict[str, str]) -> str:
|
|
"""Replace {{key}} placeholders with values from context dict."""
|
|
if not isinstance(text, str):
|
|
return text
|
|
|
|
def _replace(match: re.Match[str]) -> str:
|
|
key = match.group(1).strip()
|
|
return context.get(key, match.group(0))
|
|
|
|
return re.sub(r"\{\{(\w+)\}\}", _replace, text)
|