For key/value-based plugins, add an `enable` field to make it easier for child presets to disable their functionality
52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
import json
|
|
import re
|
|
from typing import Any
|
|
from typing import Dict
|
|
|
|
|
|
class ScriptUtils:
|
|
@classmethod
|
|
def add_sanitized_variables(cls, variables: Dict[str, str]) -> Dict[str, str]:
|
|
"""
|
|
Helper to add sanitized variables to a Script
|
|
"""
|
|
sanitized_variables = {
|
|
f"{name}_sanitized": f"{{%sanitize({name})}}" for name in variables.keys()
|
|
}
|
|
return dict(variables, **sanitized_variables)
|
|
|
|
@classmethod
|
|
def to_script(cls, value: Any) -> str:
|
|
"""
|
|
Converts a python value to a script value
|
|
"""
|
|
if value is None:
|
|
out = ""
|
|
elif isinstance(value, str):
|
|
out = value
|
|
elif isinstance(value, int):
|
|
out = f"{{%int({value})}}"
|
|
elif isinstance(value, float):
|
|
out = f"{{%float({value})}}"
|
|
elif isinstance(value, bool):
|
|
out = f"{{%bool({value})}}"
|
|
else:
|
|
dumped_json = json.dumps(value, ensure_ascii=False, sort_keys=True)
|
|
# Remove triple-single-quotes from JSON to avoid parsing issues
|
|
dumped_json = re.sub("'{3,}", "'", dumped_json)
|
|
|
|
out = f"{{%from_json('''{dumped_json}''')}}"
|
|
|
|
return out
|
|
|
|
@classmethod
|
|
def bool_formatter_output(cls, output: str) -> bool:
|
|
"""
|
|
Translate formatter output to a boolean
|
|
"""
|
|
if not output or output.lower() == "false":
|
|
return False
|
|
try:
|
|
return bool(json.loads(output))
|
|
except Exception: # pylint: disable=broad-except
|
|
return True
|