| |
| |
| |
| |
|
|
| 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, |
| } |
| ''' |
|
|
|
|