Files
fmartinellidev-ComfyUI-Prom…/node_prompt_variable_extractor.py

73 lines
2.5 KiB
Python

# node_prompt_extractor.py
#Developed in 2025 by Luis Fernando Martinelli (http://www.fernandomartinelli.dev.br) from Brazil to FP8 AI Studio.
#Developed in JavaScript and converted to Python by Qwen Chat.
import re
class PromptVariableExtractor:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"field_name": ("STRING", {
"multiline": False,
"default": "",
"placeholder": "ex: seed, expression, pose"
}),
"variables": ("STRING", {
"multiline": True,
"default": ""
}),
"char_to_space": ("STRING", {
"multiline": False,
"default": "",
"placeholder": "ex: _ ou -"
}),
"lowercase": ("BOOLEAN", {"default": False})
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("value",)
FUNCTION = "extract"
CATEGORY = "prompt/util_pack"
DISPLAY_NAME = "Prompt Variable Extractor"
NODE_ID = "PromptVariableExtractor"
def extract(
self,
field_name: str,
variables: str,
char_to_space: str,
lowercase: bool
) -> tuple[str]:
"""
Extrai valor de key='value', com pós-processamento:
- remove aspas simples
- substitui espaços por char_to_space (se fornecido)
- converte para lowercase (se solicitado)
Replica exatamente matchVariableValue() do JS.
"""
if not field_name.strip() or not variables.strip():
return ("",)
# Regex idêntica ao JS: (field = 'value'), case-insensitive
pattern = rf"({re.escape(field_name)}\s*=\s*'((?:[^'\\]|\\.)*?)')"
match = re.search(pattern, variables, re.IGNORECASE)
if not match:
return ("",)
# Grupo 2 = valor interno (com escapes, sem aspas externas)
raw_value = match.group(2)
# Remove todas as aspas simples (como no JS: .replace(/'/g, ""))
value = raw_value.replace("'", "")
# Aplica char_to_space: substitui \s (espaço, tab, quebra) pelo caractere
if char_to_space:
value = re.sub(r"\s+", char_to_space, value)
# Converte para lowercase, se solicitado
if lowercase:
value = value.lower()
return (value,)