53 lines
1.8 KiB
Python
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"]
|