Files
2026-04-20 00:38:47 -04:00

53 lines
1.8 KiB
Python

"""
ComfyUI-PromptSegmentSelector
Split a single multiline prompt into up to 12 numbered STRING outputs using a
user-defined delimiter. Designed for driving per-segment prompts in
multi-shot or multi-segment video workflows (e.g. WAN 2.2 FLF SVI chains)
without having to maintain 12 separate text nodes.
"""
class PromptSegmentSelector:
MAX_SEGMENTS = 12
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text": ("STRING", {"multiline": True}),
"delimiter": ("STRING", {"default": "---"}),
}
}
RETURN_TYPES = ("STRING",) * MAX_SEGMENTS
RETURN_NAMES = tuple(f"segment_{i}" for i in range(1, MAX_SEGMENTS + 1))
FUNCTION = "split_segments"
CATEGORY = "text/utility"
def split_segments(self, text, delimiter):
# Split on delimiter and strip per-segment whitespace. Preserve empty
# middle segments so downstream indices stay aligned when a slot is
# intentionally left blank; only trim trailing empties.
segments = [s.strip() for s in text.split(delimiter)]
while segments and segments[-1] == "":
segments.pop()
if len(segments) > self.MAX_SEGMENTS:
print(
f"[PromptSegmentSelector] Warning: received {len(segments)} "
f"segments, truncating to {self.MAX_SEGMENTS}. Extra segments "
f"dropped."
)
segments = segments[: self.MAX_SEGMENTS]
# Pad to MAX_SEGMENTS with empty strings.
segments.extend([""] * (self.MAX_SEGMENTS - len(segments)))
return tuple(segments)
NODE_CLASS_MAPPINGS = {"PromptSegmentSelector": PromptSegmentSelector}
NODE_DISPLAY_NAME_MAPPINGS = {"PromptSegmentSelector": "Prompt Segment Selector"}
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]