Files

92 lines
2.7 KiB
Python

DELIMITER_ESCAPES = (
("\\r\\n", "\r\n"),
("\\n", "\n"),
("\\r", "\r"),
("\\t", "\t"),
)
def _decode_delimiter(delimiter):
value = str(delimiter or "")
for source, target in DELIMITER_ESCAPES:
value = value.replace(source, target)
return value
class TextSplitByDelimiter:
MAX_OUTPUTS = 20
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text": ("STRING", {
"multiline": True,
"default": "",
"tooltip": "Input text to split."
}),
"delimiter": ("STRING", {
"default": ",",
"tooltip": "Delimiter used to split the input text. Supports \\n, \\r\\n, \\r, and \\t escapes."
}),
"output_count": ("INT", {
"default": 4,
"min": 1,
"max": cls.MAX_OUTPUTS,
"step": 1,
"tooltip": "How many leading parts to expose before the remainder bucket."
}),
"strip_parts": ("BOOLEAN", {
"default": True,
"tooltip": "Trim whitespace around each split part."
}),
"skip_empty": ("BOOLEAN", {
"default": True,
"tooltip": "Drop empty parts after splitting."
}),
}
}
RETURN_TYPES = ("STRING",) * MAX_OUTPUTS + ("STRING", "INT")
RETURN_NAMES = tuple(f"part_{i}" for i in range(1, MAX_OUTPUTS + 1)) + ("remainder", "count")
FUNCTION = "split_text"
CATEGORY = "EnviralDesign/text"
def split_text(self, text, delimiter, output_count, strip_parts, skip_empty):
delimiter = _decode_delimiter(delimiter)
if delimiter == "":
parts = [text]
join_delimiter = ""
else:
parts = text.split(delimiter)
join_delimiter = delimiter
if strip_parts:
parts = [part.strip() for part in parts]
if skip_empty:
parts = [part for part in parts if part != ""]
count = len(parts)
output_count = max(1, min(int(output_count), self.MAX_OUTPUTS))
visible_parts = list(parts[:output_count])
remainder_parts = parts[output_count:]
while len(visible_parts) < self.MAX_OUTPUTS:
visible_parts.append("")
remainder = join_delimiter.join(remainder_parts) if remainder_parts else ""
return (*visible_parts, remainder, count)
NODE_CLASS_MAPPINGS = {
"EnviralTextSplitByDelimiter": TextSplitByDelimiter,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"EnviralTextSplitByDelimiter": "Text Split (Delimiter)",
}