|
|
|
|
|
|
|
|
|
|
|
import os |
|
import csv |
|
import io |
|
from ..categories import icons |
|
|
|
class AnyType(str): |
|
"""A special type that can be connected to any other types. Credit to pythongosssss""" |
|
|
|
def __ne__(self, __value: object) -> bool: |
|
return False |
|
|
|
any_type = AnyType("*") |
|
|
|
|
|
|
|
|
|
class CR_SplitString: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
|
|
return {"required": { |
|
"text": ("STRING", {"multiline": False, "default": "text"}), |
|
}, |
|
"optional": { |
|
"delimiter": ("STRING", {"multiline": False, "default": ","}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = (any_type, any_type, any_type, any_type, "STRING", ) |
|
RETURN_NAMES = ("string_1", "string_2", "string_3", "string_4", "show_help", ) |
|
FUNCTION = "split" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def split(self, text, delimiter=""): |
|
|
|
|
|
parts = text.split(delimiter) |
|
strings = [part.strip() for part in parts[:4]] |
|
string_1, string_2, string_3, string_4 = strings + [""] * (4 - len(strings)) |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-split-string" |
|
|
|
return (string_1, string_2, string_3, string_4, show_help, ) |
|
|
|
|
|
class CR_Text: |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"text": ("STRING", {"default": '', "multiline": True}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("text", "show_help", ) |
|
FUNCTION = "text_multiline" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def text_multiline(self, text): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-text" |
|
|
|
return (text, show_help,) |
|
|
|
|
|
class CR_MultilineText: |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"text": ("STRING", {"default": '', "multiline": True}), |
|
"convert_from_csv": ("BOOLEAN", {"default": False}), |
|
"csv_quote_char": ("STRING", {"default": "'", "choices": ["'", '"']}), |
|
"remove_chars": ("BOOLEAN", {"default": False}), |
|
"chars_to_remove": ("STRING", {"multiline": False, "default": ""}), |
|
"split_string": ("BOOLEAN", {"default": False}), |
|
} |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("multiline_text", "show_help", ) |
|
FUNCTION = "text_multiline" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def text_multiline(self, text, chars_to_remove, split_string=False, remove_chars=False, convert_from_csv=False, csv_quote_char="'"): |
|
|
|
new_text = [] |
|
|
|
|
|
text = text.rstrip(',') |
|
|
|
if convert_from_csv: |
|
|
|
csv_reader = csv.reader(io.StringIO(text), quotechar=csv_quote_char) |
|
for row in csv_reader: |
|
new_text.extend(row) |
|
if split_string: |
|
if text.startswith("'") and text.endswith("'"): |
|
text = text[1:-1] |
|
values = [value.strip() for value in text.split("', '")] |
|
new_text.extend(values) |
|
elif text.startswith('"') and text.endswith('"'): |
|
text = text[1:-1] |
|
values = [value.strip() for value in text.split('", "')] |
|
new_text.extend(values) |
|
elif ',' in text and text.count("'") % 2 == 0: |
|
|
|
text = text.replace("'", '') |
|
values = [value.strip() for value in text.split(",")] |
|
new_text.extend(values) |
|
elif ',' in text and text.count('"') % 2 == 0: |
|
|
|
text = text.replace('"', '') |
|
values = [value.strip() for value in text.split(",")] |
|
new_text.extend(values) |
|
if convert_from_csv == False and split_string == False: |
|
|
|
for line in io.StringIO(text): |
|
if not line.strip().startswith('#'): |
|
if not line.strip().startswith("\n"): |
|
line = line.replace("\n", '') |
|
if remove_chars: |
|
|
|
line = line.replace(chars_to_remove, '') |
|
new_text.append(line) |
|
|
|
new_text = "\n".join(new_text) |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Other-Nodes#cr-multiline-text" |
|
|
|
return (new_text, show_help,) |
|
|
|
|
|
class CR_SaveTextToFile: |
|
|
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required": { |
|
"multiline_text": ("STRING", {"multiline": True, "default": ""}), |
|
"output_file_path": ("STRING", {"multiline": False, "default": ""}), |
|
"file_name": ("STRING", {"multiline": False, "default": ""}), |
|
"file_extension": (["txt", "csv"],), |
|
} |
|
} |
|
|
|
RETURN_TYPES = ("STRING", ) |
|
RETURN_NAMES = ("show_help", ) |
|
OUTPUT_NODE= True |
|
FUNCTION = 'save_list' |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def save_list(self, multiline_text, output_file_path, file_name, file_extension): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-save-text-to-file" |
|
|
|
filepath = output_file_path + "\\" + file_name + "." + file_extension |
|
|
|
index = 1 |
|
|
|
if(output_file_path == "" or file_name == ""): |
|
print(f"[Warning] CR Save Text List. No file details found. No file output.") |
|
return () |
|
|
|
while os.path.exists(filepath): |
|
if os.path.exists(filepath): |
|
filepath = output_file_path + "\\" + file_name + "_" + str(index) + "." + file_extension |
|
index = index + 1 |
|
else: |
|
break |
|
|
|
print(f"[Info] CR Save Text List: Saving to {filepath}") |
|
|
|
if file_extension == "csv": |
|
text_list = [] |
|
for i in multiline_text.split("\n"): |
|
text_list.append(i.strip()) |
|
|
|
with open(filepath, "w", newline="") as csv_file: |
|
csv_writer = csv.writer(csv_file) |
|
|
|
for line in text_list: |
|
csv_writer.writerow([line]) |
|
else: |
|
with open(filepath, "w", newline="") as text_file: |
|
for line in multiline_text: |
|
text_file.write(line) |
|
|
|
return (show_help, ) |
|
|
|
|
|
class CR_TextConcatenate: |
|
|
|
@ classmethod |
|
def INPUT_TYPES(cls): |
|
return {"required": { |
|
}, |
|
"optional": { |
|
"text1": ("STRING", {"multiline": False, "default": "", "forceInput": True}), |
|
"text2": ("STRING", {"multiline": False, "default": "", "forceInput": True}), |
|
"separator": ("STRING", {"multiline": False, "default": ""}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("STRING", "show_help", ) |
|
FUNCTION = "concat_text" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def concat_text(self, text1="", text2="", separator=""): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-save-text-to-file" |
|
|
|
return (text1 + separator + text2, ) |
|
|
|
|
|
class CR_TextReplace: |
|
|
|
@ classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"text": ("STRING", {"multiline": True, "default": "", "forceInput": True}), |
|
}, |
|
"optional": { |
|
"find1": ("STRING", {"multiline": False, "default": ""}), |
|
"replace1": ("STRING", {"multiline": False, "default": ""}), |
|
"find2": ("STRING", {"multiline": False, "default": ""}), |
|
"replace2": ("STRING", {"multiline": False, "default": ""}), |
|
"find3": ("STRING", {"multiline": False, "default": ""}), |
|
"replace3": ("STRING", {"multiline": False, "default": ""}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("STRING", "show_help", ) |
|
FUNCTION = "replace_text" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def replace_text(self, text, find1="", replace1="", find2="", replace2="", find3="", replace3=""): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-replace" |
|
|
|
text = text.replace(find1, replace1) |
|
text = text.replace(find2, replace2) |
|
text = text.replace(find3, replace3) |
|
|
|
return (text, show_help) |
|
|
|
|
|
class CR_TextBlacklist: |
|
|
|
@ classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": { |
|
"text": ("STRING", {"multiline": True, "default": "", "forceInput": True}), |
|
"blacklist_words": ("STRING", {"multiline": True, "default": ""}), |
|
}, |
|
"optional": { |
|
"replacement_text": ("STRING", {"multiline": False, "default": ""}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("STRING", "show_help", ) |
|
FUNCTION = "replace_text" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def replace_text(self, text, blacklist_words, replacement_text=""): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-blacklist" |
|
|
|
text_out = text |
|
|
|
for line in blacklist_words.split('\n'): |
|
if line.strip(): |
|
text_out = text_out.replace(line.strip(), replacement_text) |
|
|
|
return (text_out, show_help) |
|
|
|
|
|
class CR_TextOperation: |
|
|
|
@ classmethod |
|
def INPUT_TYPES(cls): |
|
|
|
operations = ["uppercase", "lowercase", "capitalize", "invert_case", "reverse", "trim", "remove_spaces"] |
|
|
|
return { |
|
"required": { |
|
"text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), |
|
"operation": (operations,), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = (any_type, "STRING", ) |
|
RETURN_NAMES = ("STRING", "show_help", ) |
|
FUNCTION = "text_operation" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def text_operation(self, text, operation): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text_operation" |
|
|
|
if operation == "uppercase": |
|
text_out = text.upper() |
|
elif operation == "lowercase": |
|
text_out = text.lower() |
|
elif operation == "capitalize": |
|
text_out = text.capitalize() |
|
elif operation == "invert_case": |
|
text_out = text.swapcase() |
|
elif operation == "reverse": |
|
text_out = text[::-1] |
|
elif operation == "trim": |
|
text_out = text.strip() |
|
elif operation == "remove_spaces": |
|
text_out = text.replace(" ", "") |
|
else: |
|
return "CR Text Operation: Invalid operation." |
|
|
|
return (text_out, show_help, ) |
|
|
|
|
|
class CR_TextLength: |
|
|
|
@ classmethod |
|
def INPUT_TYPES(cls): |
|
|
|
return { |
|
"required": { |
|
"text": ("STRING", {"multiline": False, "default": "", "forceInput": True}), |
|
}, |
|
} |
|
|
|
RETURN_TYPES = ("INT", "STRING", ) |
|
RETURN_NAMES = ("INT", "show_help", ) |
|
FUNCTION = "len_text" |
|
CATEGORY = icons.get("Comfyroll/Utils/Text") |
|
|
|
def len_text(self, text): |
|
|
|
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/List-Nodes#cr-text-length" |
|
|
|
int_out = len(text) |
|
|
|
return (int_out, show_help, ) |
|
|
|
|
|
|
|
|
|
|
|
''' |
|
NODE_CLASS_MAPPINGS = { |
|
### Utils Text |
|
"CR Text": CR_Text, |
|
"CR Multiline Text": CR_MultilineText, |
|
"CR Split String": CR_SplitString, |
|
"CR Text Concatenate": CR_TextConcatenate, |
|
"CR Text Replace": CR_TextReplace, |
|
"CR Text Blacklist": CR_TextBlacklist, |
|
"CR Text Length": CR_TextLength, |
|
"CR Text Operation": CR_TextOperation, |
|
"CR Save Text To File": CR_SaveTextToFile, |
|
} |
|
''' |
|
|
|
|