From 91bf8a8142f4bc2d65a5102e4cc718efdd2ccfba Mon Sep 17 00:00:00 2001 From: gottafix <118938265+gottafix@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:46:07 +1000 Subject: [PATCH] Add files via upload --- NaderNodes.py | 247 ++++++++++++++++++ __init__.py | 3 + __pycache__/NaderNodes.cpython-311.pyc | Bin 0 -> 10319 bytes .../TagDuplicateRemover.cpython-311.pyc | Bin 0 -> 1339 bytes __pycache__/__init__.cpython-311.pyc | Bin 0 -> 282 bytes 5 files changed, 250 insertions(+) create mode 100644 NaderNodes.py create mode 100644 __init__.py create mode 100644 __pycache__/NaderNodes.cpython-311.pyc create mode 100644 __pycache__/TagDuplicateRemover.cpython-311.pyc create mode 100644 __pycache__/__init__.cpython-311.pyc diff --git a/NaderNodes.py b/NaderNodes.py new file mode 100644 index 0000000..7481389 --- /dev/null +++ b/NaderNodes.py @@ -0,0 +1,247 @@ +import re + +class TagDuplicateRemover: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "tag_field": ("STRING", {"forceInput": True}), + "tag_delimiter": ("STRING", {"default":", "}) + } + } + + RETURN_TYPES = ("STRING",) + + FUNCTION = "removeDuplicates" + + CATEGORY = "Naders Nodes" + + def removeDuplicates(self, tag_field, tag_delimiter): + tag_list = tag_field.split(tag_delimiter) + duplicates_removed_tags = tag_delimiter.join(dict.fromkeys(tag_list)) + return ( + duplicates_removed_tags, + ) + +class CombineAlternatingTags: + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "tag_field1": ("STRING", {"forceInput": True}), + "tag_field2": ("STRING", {"forceInput": True}), + "tag_delimiter": ("STRING", {"default":", "}) + }, + "optional": { + "tag_field3_opt": ("STRING", {"default": '', "multiline": False}), + "tag_field4_opt": ("STRING", {"default": '', "multiline": False}), + "tag_field5_opt": ("STRING", {"default": '', "multiline": False}) + } + } + + RETURN_TYPES = ("STRING",) + + FUNCTION = "tagCombine" + + CATEGORY = "Naders Nodes" + + def tagCombine(self, tag_field1, tag_field2, tag_field3_opt, tag_field4_opt, tag_field5_opt, tag_delimiter): + tags = [tag_field.split(tag_delimiter) if tag_field else [] for tag_field in [tag_field1, tag_field2, tag_field3_opt, tag_field4_opt, tag_field5_opt]] + lengths = [len(tag) for tag in tags] + total_len = sum(lengths) + + if total_len != 0: + ratios = [l / total_len for l in lengths] + else: + ratios = [0, 0, 0, 0, 0] + + combined_tags = [] + indices = [0, 0, 0, 0, 0] + + # Calculate the number of rounds based on the smallest non-zero ratio + rounds = int(1 / min(r for r in ratios if r > 0)) + + for _ in range(rounds): + for field in range(5): + # Calculate the number of tags to take from this field in this round + take = int(round(ratios[field] * rounds)) + for _ in range(take): + if indices[field] < lengths[field]: + combined_tags.append(tags[field][indices[field]]) + indices[field] += 1 + + # If there are still tags remaining after the round-robin allocation, append them to the end + for field in range(5): + while indices[field] < lengths[field]: + combined_tags.append(tags[field][indices[field]]) + indices[field] += 1 + + return (tag_delimiter.join(combined_tags),) + + + +class SplitSentences: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "sentence": ("STRING", {"forceInput": True}), + "length": ("INT", {"default": 1, "min": 1}) + } + } + + RETURN_TYPES = ("STRING", "STRING") + + FUNCTION = "splitSentences" + + CATEGORY = "Naders Nodes" + + def splitSentences(self, sentence, length): + # Split the sentence into a list of sentences + sentences = re.split(r'(?<=[.!?])\s+', sentence) + + # If the number of sentences is less than 'length', try to return one sentence + if len(sentences) < length: + if len(sentences) >= 1: + return (sentences[0], ' '.join(sentences[1:])) + else: + return (sentence, "") + + # Otherwise, return only the first 'length' sentences and the remaining sentences + split_sentences1 = ' '.join(sentences[:length]) + split_sentences2 = ' '.join(sentences[length:]) + + return (split_sentences1, split_sentences2) + +class SplitTags: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "tag_field": ("STRING", {"forceInput": True}), + "tag_amount_to_split": ("INT", {"default": 1, "min": 1}), + "tag_delimiter": ("STRING", {"default": ", "}) + } + } + + RETURN_TYPES = ("STRING", "STRING") + + FUNCTION = "splitTags" + + CATEGORY = "Naders Nodes" + + def splitTags(self, tag_field, tag_amount_to_split, tag_delimiter): + # Split the tag_field into a list of tags + tags = tag_field.split(tag_delimiter) + + # If the number of tags is less than 'tag_amount', return the original tag_field and an empty string + if len(tags) < tag_amount_to_split: + return (tag_field, "") + + # Otherwise, return only the first 'tag_amount' tags and the removed tags + split_tags1 = tag_delimiter.join(tags[:tag_amount_to_split]) + split_tags2 = tag_delimiter.join(tags[tag_amount_to_split:]) + + return (split_tags1, split_tags2) + + +class LoadTextList: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "input_file_path": ("STRING", {"multiline": False, "default": ""}), + "file_name_integer": ("INT", {"default": 0}), + "file_extension": (["txt", "csv"],), + "format_string": ("STRING", {"default": "{:04d}"}) + } + } + + RETURN_TYPES = ("STRING","STRING") + RETURN_NAMES = ("STRING","FILENAME_STRING") + OUTPUT_NODE = True + OUTPUT_IS_LIST = (True, False) + FUNCTION = "loadList" + CATEGORY = "Naders Nodes" + + def loadList(self, input_file_path, file_name_integer, file_extension, format_string): + # Convert the file_name from an integer to a string + file_name_integer = format_string.format(file_name_integer) + + filepath = input_file_path + "\\" + file_name_integer + "." + file_extension + print(f"Load Values: Loading {filepath}") + + list = [] + + if file_extension == "csv": + with open(filepath, "r") as csv_file: + for row in csv_file: + list.append(row) + + elif file_extension == "txt": + with open(filepath, "r") as txt_file: + for row in txt_file: + list.append(row) + else: + pass + + # Append the file extension to the filename + filename_with_extension = file_name_integer + "." + file_extension + + return(list, filename_with_extension) + +class TokenCounter: + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "input_string": ("STRING", {"forceInput": True}), + } + } + + RETURN_TYPES = ("INT",) + RETURN_NAMES = ("Token_COUNT_INT",) + OUTPUT_NODE = True + OUTPUT_IS_LIST = (False,) + FUNCTION = "countTokens" + CATEGORY = "Naders Nodes" + + def countTokens(self, input_string): + # Split the string into tokens + tokens = input_string.split() + + # Count the number of tokens + token_count = len(tokens) + + return token_count, + + + +NODE_CLASS_MAPPINGS = { + "Tag Duplicate Remover": TagDuplicateRemover, + "Tag Alternating Combiner": CombineAlternatingTags, + "Split Sentences": SplitSentences, + "Split Tags": SplitTags, + "Load Text List": LoadTextList, + "Token Counter": TokenCounter +} + + +NODE_DISPLAY_NAME_MAPPINGS = { + "Tag Duplicate Remover": "Tag Duplicates Remover", + "Tag Alternating Combiner": "Tag Alternating Combiner", + "Shorten Sentences": "Shorten Sentences", + "Split Tags": "Split Tags", + "Load Text List": "Load Text List", + "Token Counter": "TokenCounter" +} + +# Test the class +#tag_remover = TagDuplicateRemover() +#print(tag_remover.removeDuplicates("background, tree, pond, apple, tree, bird")) \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..1a94961 --- /dev/null +++ b/__init__.py @@ -0,0 +1,3 @@ +from .NaderNodes import * + +__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/__pycache__/NaderNodes.cpython-311.pyc b/__pycache__/NaderNodes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebc6d27d79b87cf6b7bbf162b247b7752e21753c GIT binary patch literal 10319 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 literal 0 HcmV?d00001 diff --git a/__pycache__/TagDuplicateRemover.cpython-311.pyc b/__pycache__/TagDuplicateRemover.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7797a5bdae23264806b72c400421bd60544de46 GIT binary patch literal 1339 zcmZuw&1)M+6rb4-c_mAVf|8h~X|0NUSYSd3A%~LI2uXHTthJEjgB8QFXhzN^yIN;< zRbu0S4nFi$XfDdp^pLbQr9Jk~kiiEtCqw^%4elwYyjf-C#P-|W_vXF#o0<2uZ&RrR z0{ZpJR(DZG=s%%Eq)Ny~Jtb?PCAXWGv4Rmr1*bqV$ArXbB7Vb(GwlEwM)49gz^S;F>;c?&GFuE4C z36C{fjjF!H6J3{eXtlT5_gjCU0_NEB#2vZ!KbF5;H?8%O>vXqPs}tGjd%o)!J(o~# zT{j73i!O6af6;mYh6_TzySc@ut9pI4Wwh4nmFD*BMW9arA|>w@umK8UC^d7G`SSIX z-*5cmkLDhYzWOeZr7zNftYi`aQsRjd07Bes3IxxvuuPMxc|3DA#7@*4v2RkrUqBh6 z9lR&3=Lm)XYO+76{Y#19y@~cI+>gcxjC&%HbF?FUe%9yOOL<4$z#F1-lD;j?=L!l} zJ(vNXD^Fdk#}#6Ae6Dqw>pY`d9=H{c+Fcfdi?}BGYg?YrXGkwW)1ijJ6Ncfqq;HFL(lDO) zP5Yx~x?`K3=TQHNOIQ*%@?@jZT5ag#N#fe#s$ObUS763V#a3l$rLh*K#NvPrZyKj5 z8o>k;J@ab729xJl%>maMF^B^LOi;#WF(6|)LkdF*V-7A#yLMXtuoXTPA8WZm*nTh=YjOZ zfVI2j7v(0FxMfxV1>)l~^D;}~#tVa4TF;vb(@#-@p!nMVvrI0AjvPcmMzZ literal 0 HcmV?d00001