diff --git a/src/extensions/core/saveImageExtraOutput.ts b/src/extensions/core/saveImageExtraOutput.ts index 3ea312997f..77894303a8 100644 --- a/src/extensions/core/saveImageExtraOutput.ts +++ b/src/extensions/core/saveImageExtraOutput.ts @@ -35,7 +35,7 @@ app.registerExtension({ // @ts-expect-error fixme ts strict error widget.serializeValue = () => { // @ts-expect-error fixme ts strict error - return applyTextReplacements(app.graph.nodes, widget.value) + return applyTextReplacements(app.graph, widget.value) } return r diff --git a/src/extensions/core/widgetInputs.ts b/src/extensions/core/widgetInputs.ts index daa28ce0a2..fbc23b231b 100644 --- a/src/extensions/core/widgetInputs.ts +++ b/src/extensions/core/widgetInputs.ts @@ -46,7 +46,7 @@ export class PrimitiveNode extends LGraphNode { ] let v = this.widgets?.[0].value if (v && this.properties[replacePropertyName]) { - v = applyTextReplacements(app.graph.nodes, v as string) + v = applyTextReplacements(app.graph, v as string) } // For each output link copy our value over the original widget value diff --git a/src/scripts/utils.ts b/src/scripts/utils.ts index 9cb5a2113f..778b712d93 100644 --- a/src/scripts/utils.ts +++ b/src/scripts/utils.ts @@ -21,7 +21,7 @@ export function clone(obj: T): T { * There are external callers to this function, so we need to keep it for now */ export function applyTextReplacements(app: ComfyApp, value: string): string { - return _applyTextReplacements(app.graph.nodes, value) + return _applyTextReplacements(app.graph, value) } export async function addStylesheet( diff --git a/src/utils/searchAndReplace.ts b/src/utils/searchAndReplace.ts index 8023b4882a..395d964063 100644 --- a/src/utils/searchAndReplace.ts +++ b/src/utils/searchAndReplace.ts @@ -1,11 +1,14 @@ -import type { LGraphNode } from '@comfyorg/litegraph' +import type { LGraph, Subgraph } from '@comfyorg/litegraph' import { formatDate } from '@/utils/formatUtil' +import { collectAllNodes } from '@/utils/graphTraversalUtil' export function applyTextReplacements( - allNodes: LGraphNode[], + graph: LGraph | Subgraph, value: string ): string { + const allNodes = collectAllNodes(graph) + return value.replace(/%([^%]+)%/g, function (match, text) { const split = text.split('.') if (split.length !== 2) { diff --git a/tests-ui/tests/utils/serachAndReplace.test.ts b/tests-ui/tests/utils/serachAndReplace.test.ts index 2c61df1c72..2a85153696 100644 --- a/tests-ui/tests/utils/serachAndReplace.test.ts +++ b/tests-ui/tests/utils/serachAndReplace.test.ts @@ -1,3 +1,4 @@ +import { LGraph } from '@comfyorg/litegraph' import type { LGraphNode } from '@comfyorg/litegraph' import { describe, expect, it } from 'vitest' @@ -21,7 +22,11 @@ describe('applyTextReplacements', () => { } as LGraphNode ] - const result = applyTextReplacements(mockNodes, '%TestNode.testWidget%') + const mockGraph = new LGraph() + for (const node of mockNodes) { + mockGraph.add(node) + } + const result = applyTextReplacements(mockGraph, '%TestNode.testWidget%') // The expected result should have all invalid characters replaced with underscores expect(result).toBe('file_name_with_invalid_chars_____control_chars__') @@ -51,7 +56,11 @@ describe('applyTextReplacements', () => { } as LGraphNode ] - const result = applyTextReplacements(mockNodes, '%TestNode.testWidget%') + const mockGraph = new LGraph() + for (const node of mockNodes) { + mockGraph.add(node) + } + const result = applyTextReplacements(mockGraph, '%TestNode.testWidget%') expect(result).toBe(expected) } }) @@ -66,7 +75,11 @@ describe('applyTextReplacements', () => { } as LGraphNode ] - const result = applyTextReplacements(mockNodes, '%TestNode.testWidget%') + const mockGraph = new LGraph() + for (const node of mockNodes) { + mockGraph.add(node) + } + const result = applyTextReplacements(mockGraph, '%TestNode.testWidget%') expect(result).toBe(validChars) }) })