105 lines
4.5 KiB
Python
105 lines
4.5 KiB
Python
class TextToolsMergeTextMultiSG:
|
|
"""
|
|
A ComfyUI node with dynamic text inputs controlled by enable toggles.
|
|
"""
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"text_order": (["Sequential", "Custom"],),
|
|
"custom_order": ("STRING", {"default": "1,2,3", "multiline": False}),
|
|
"separator": ("STRING", {"default": ", ", "multiline": False}),
|
|
"insert_separator": (["None", "Before", "After", "Between", "Before and After", "Before and Between", "After and Between", "Before, Between, After"], {"default": "Before, Between, After"}),
|
|
"text_1": ("STRING", {"multiline": True, "default": ""}),
|
|
"⬆️_enable_1": ("BOOLEAN", {"default": True}),
|
|
"text_2": ("STRING", {"multiline": True, "default": ""}),
|
|
"⬆️_enable_2": ("BOOLEAN", {"default": True}),
|
|
},
|
|
"optional": {
|
|
"text_3": ("STRING", {"multiline": True, "default": ""}),
|
|
"⬆️_enable_3": ("BOOLEAN", {"default": True}),
|
|
"text_4": ("STRING", {"multiline": True, "default": ""}),
|
|
"⬆️_enable_4": ("BOOLEAN", {"default": True}),
|
|
"text_5": ("STRING", {"multiline": True, "default": ""}),
|
|
"⬆️_enable_5": ("BOOLEAN", {"default": True}),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
RETURN_NAMES = ("merged_text",)
|
|
FUNCTION = "merge_texts"
|
|
CATEGORY = "text"
|
|
|
|
def merge_texts(self, text_order, separator, insert_separator, text_1="", text_2="", text_3="", text_4="", text_5="",
|
|
**kwargs):
|
|
"""
|
|
Merges multiple text inputs based on order and custom separator position.
|
|
"""
|
|
# Extract enable values from kwargs
|
|
enable_1 = kwargs.get("⬆️_enable_1", True)
|
|
enable_2 = kwargs.get("⬆️_enable_2", True)
|
|
enable_3 = kwargs.get("⬆️_enable_3", True)
|
|
enable_4 = kwargs.get("⬆️_enable_4", True)
|
|
enable_5 = kwargs.get("⬆️_enable_5", True)
|
|
|
|
custom_order = kwargs.get("custom_order", "1,2,3")
|
|
|
|
# Collect all texts and their enable states
|
|
all_texts = [text_1, text_2, text_3, text_4, text_5]
|
|
all_enables = [enable_1, enable_2, enable_3, enable_4, enable_5]
|
|
|
|
# Get only active texts based on enable state
|
|
texts = []
|
|
for i in range(10):
|
|
if all_enables[i] and all_texts[i]:
|
|
texts.append((i, all_texts[i]))
|
|
|
|
# Determine the order
|
|
if text_order == "Sequential":
|
|
ordered_texts = [text for idx, text in texts]
|
|
else: # Custom order
|
|
try:
|
|
order_indices = [int(x.strip()) - 1 for x in custom_order.split(",")]
|
|
ordered_texts = []
|
|
for idx in order_indices:
|
|
for text_idx, text in texts:
|
|
if text_idx == idx:
|
|
ordered_texts.append(text)
|
|
break
|
|
except:
|
|
ordered_texts = [text for idx, text in texts]
|
|
|
|
# Apply separator positioning
|
|
if not ordered_texts:
|
|
merged = ""
|
|
elif insert_separator == "None":
|
|
merged = "".join(ordered_texts)
|
|
elif insert_separator == "Before":
|
|
merged = separator + "".join(ordered_texts)
|
|
elif insert_separator == "After":
|
|
merged = "".join(ordered_texts) + separator
|
|
elif insert_separator == "Between":
|
|
merged = separator.join(ordered_texts)
|
|
elif insert_separator == "Before and After":
|
|
merged = separator + "".join(ordered_texts) + separator
|
|
elif insert_separator == "Before and Between":
|
|
merged = separator + separator.join(ordered_texts)
|
|
elif insert_separator == "After and Between":
|
|
merged = separator.join(ordered_texts) + separator
|
|
elif insert_separator == "Before, Between, After":
|
|
merged = separator + separator.join(ordered_texts) + separator
|
|
else:
|
|
merged = "".join(ordered_texts)
|
|
|
|
return (merged,)
|
|
|
|
# Node registration
|
|
NODE_CLASS_MAPPINGS = {
|
|
"Text Tools Merge Text Multi-SG": TextToolsMergeTextMultiSG
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"Text Tools Merge Text Multi-SG": "Text Tools Merge Text Multi-SG"
|
|
}
|