85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
# node_hidden_prompt.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
|
|
from typing import Tuple
|
|
|
|
class PromptHiddenProcessor:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"prompt": ("STRING", {
|
|
"multiline": True,
|
|
"default": "A portrait of [[smile;neutral;laugh]], soft lighting, studio background"
|
|
}),
|
|
"input_index_split": ("INT", {
|
|
"default": 0,
|
|
"min": 0,
|
|
"max": 99,
|
|
"step": 1
|
|
}),
|
|
"delimiter_pair": (["[[ ]]", "## ##"], {
|
|
"default": "[[ ]]"
|
|
})
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING", "STRING")
|
|
RETURN_NAMES = ("input_prompt", "clean_prompt")
|
|
FUNCTION = "process"
|
|
CATEGORY = "prompt/util_pack"
|
|
DISPLAY_NAME = "Prompt Hidden Processor"
|
|
NODE_ID = "PromptHiddenProcessor"
|
|
|
|
def process(
|
|
self,
|
|
prompt: str,
|
|
input_index_split: int,
|
|
delimiter_pair: str
|
|
) -> Tuple[str, str]:
|
|
"""
|
|
Processa prompt com trechos ocultos:
|
|
- [[option1;option2;option3]] → substitui por optionN (N = input_index_split)
|
|
- clean_prompt remove todos os trechos ocultos
|
|
Suporta delimitadores: [[ ]] ou ## ##
|
|
"""
|
|
if not prompt.strip():
|
|
return ("", "")
|
|
|
|
# Define delimitadores com base na escolha
|
|
if delimiter_pair == "[[ ]]":
|
|
start_delim, end_delim = r"\[\[", r"\]\]"
|
|
pattern = r"\[\[([^\]]*?)\]\]"
|
|
else: # "## ##"
|
|
start_delim, end_delim = r"##", r"##"
|
|
pattern = r"##([^#]*?)##"
|
|
|
|
# Regex para encontrar todos os trechos ocultos
|
|
hidden_pattern = re.compile(pattern, re.DOTALL)
|
|
hidden_matches = hidden_pattern.findall(prompt)
|
|
|
|
# ✅ clean_prompt: remove todos os trechos ocultos
|
|
clean_prompt = hidden_pattern.sub("", prompt).strip()
|
|
|
|
# ✅ input_prompt: substitui trechos ocultos pela variação escolhida
|
|
input_prompt = prompt
|
|
for match in hidden_pattern.finditer(prompt):
|
|
full_match = match.group(0) # ex: "[[smile;neutral;laugh]]"
|
|
content = match.group(1).strip() # ex: "smile;neutral;laugh"
|
|
|
|
# Divide por ";" e limpa espaços
|
|
options = [opt.strip() for opt in content.split(";") if opt.strip()]
|
|
|
|
if not options:
|
|
replacement = ""
|
|
elif input_index_split < len(options):
|
|
replacement = options[input_index_split]
|
|
else:
|
|
# Índice fora do range → usa o último
|
|
replacement = options[-1]
|
|
|
|
# Substitui no prompt
|
|
input_prompt = input_prompt.replace(full_match, replacement, 1)
|
|
|
|
return (input_prompt.strip(), clean_prompt) |