File size: 1,727 Bytes
eb9ca51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import { app } from "../../scripts/app.js";

// Allows for simple dynamic prompt replacement
// Inputs in the format {a|b} will have a random value of a or b chosen when the prompt is queued.

/*
 * Strips C-style line and block comments from a string
 */
function stripComments(str) {
	return str.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g,'');
}

app.registerExtension({
	name: "Comfy.DynamicPrompts",
	nodeCreated(node) {
		if (node.widgets) {
			// Locate dynamic prompt text widgets
			// Include any widgets with dynamicPrompts set to true, and customtext
			const widgets = node.widgets.filter(
				(n) => (n.type === "customtext" && n.dynamicPrompts !== false) || n.dynamicPrompts
			);
			for (const widget of widgets) {
				// Override the serialization of the value to resolve dynamic prompts for all widgets supporting it in this node
				widget.serializeValue = (workflowNode, widgetIndex) => {
					let prompt = stripComments(widget.value);
					while (prompt.replace("\\{", "").includes("{") && prompt.replace("\\}", "").includes("}")) {
						const startIndex = prompt.replace("\\{", "00").indexOf("{");
						const endIndex = prompt.replace("\\}", "00").indexOf("}");

						const optionsString = prompt.substring(startIndex + 1, endIndex);
						const options = optionsString.split("|");

						const randomIndex = Math.floor(Math.random() * options.length);
						const randomOption = options[randomIndex];

						prompt = prompt.substring(0, startIndex) + randomOption + prompt.substring(endIndex + 1);
					}

					// Overwrite the value in the serialized workflow pnginfo
					if (workflowNode?.widgets_values)
						workflowNode.widgets_values[widgetIndex] = prompt;

					return prompt;
				};
			}
		}
	},
});