diff --git a/Five_Random_Lines.py b/Five_Random_Lines.py new file mode 100644 index 0000000..2d9e50e --- /dev/null +++ b/Five_Random_Lines.py @@ -0,0 +1,114 @@ +import random +import re + +class FiveRandomLinesNode: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "global_prompt": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter static global prompt (positive --- negative)"}), + "text_1": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter lines (positive --- negative), one per line"}), + "text_2": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter lines (positive --- negative), one per line"}), + "text_3": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter lines (positive --- negative), one per line"}), + "text_4": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter lines (positive --- negative), one per line"}), + "text_5": ("STRING", {"multiline": True, "default": "", "placeholder": "Enter lines (positive --- negative), one per line"}), + "prepend_mode": ("BOOLEAN", {"default": False, "label_on": "Prepend Global", "label_off": "Append Global"}), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("double_prompt",) + FUNCTION = "combine_random_lines" + CATEGORY = "hexxacubic" + + def _parse_double_prompt(self, text): + """Parse a text into positive and negative prompts using '---' as separator.""" + if not text.strip(): + return "", "" + # Split by '---' whether inline or on a new line + parts = re.split(r'\s*---\s*', text.strip(), maxsplit=1) + positive = parts[0].strip() if parts else "" + negative = parts[1].strip() if len(parts) > 1 else "" + return positive, negative + + def _combine_prompts(self, base_prompt, addition): + """Combine two prompts, ensuring proper comma separation.""" + base_prompt = base_prompt.strip() + addition = addition.strip() + if not base_prompt: + return addition + if not addition: + return base_prompt + # Add comma if needed + if not base_prompt.endswith(',') and not base_prompt.endswith('.'): + return f"{base_prompt}, {addition}" + return f"{base_prompt} {addition}" + + def combine_random_lines(self, global_prompt, text_1, text_2, text_3, text_4, text_5, prepend_mode, seed): + texts = [text_1, text_2, text_3, text_4, text_5] + positive_lines = [] + negative_lines = [] + + # Parse global prompt (static, no random selection) + # Note: Seed is assigned to global but not used since it's static + random.seed(seed) # Set seed for global, though unused + global_positive, global_negative = self._parse_double_prompt(global_prompt) + + # Process random text fields with incremental seeds + for i, text in enumerate(texts): + lines = [line.strip() for line in text.strip().split('\n') if line.strip()] + if lines: + # Set incremental seed for this text field + random.seed(seed + (i + 1)) + # Randomly select a line (controlled by seed) + selected_line = random.choice(lines) + # Parse the selected line for positive and negative parts + positive, negative = self._parse_double_prompt(selected_line) + if positive: + positive_lines.append(positive) + if negative: + negative_lines.append(negative) + + # Reset random seed to avoid affecting other nodes + random.seed() + + # Combine prompts based on prepend_mode + combined_positive = "" + combined_negative = "" + + if prepend_mode: + # Global prompt first + if global_positive: + positive_lines.insert(0, global_positive) + if global_negative: + negative_lines.insert(0, global_negative) + else: + # Global prompt last + if global_positive: + positive_lines.append(global_positive) + if global_negative: + negative_lines.append(global_negative) + + # Combine all positive and negative prompts + for pos in positive_lines: + combined_positive = self._combine_prompts(combined_positive, pos) + for neg in negative_lines: + combined_negative = self._combine_prompts(combined_negative, neg) + + # Format output in double-prompt style + if combined_positive and combined_negative: + return (f"{combined_positive}\n---\n{combined_negative}",) + elif combined_positive: + return (combined_positive,) + elif combined_negative: + return (f"\n---\n{combined_negative}",) + return ("",) + +NODE_CLASS_MAPPINGS = { + "FiveRandomLines": FiveRandomLinesNode +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "FiveRandomLines": "Five Random Lines with Global Prompt" +}