升级0.6.20

This commit is contained in:
AI_Architect
2026-06-21 13:19:35 +08:00
parent 6bb9ad35c2
commit cedf73fa11
6 changed files with 126 additions and 3 deletions
+4 -1
View File
@@ -72,6 +72,7 @@ try:
XB_ROCmSamplerCustom, XB_ROCmSamplerCustomAdvanced,
XB_ROCmVAEDecode, XB_ROCmVAEEncode,
XB_ROCmVAEDecodeTemporal, XB_ROCmMemCleaner)
from .nodes_string_merge import XB_StringMerge
NODE_CLASS_MAPPINGS = {
"XB_VRAM_Calculator": XB_VRAM_Calculator,
@@ -139,7 +140,8 @@ try:
"XB_AudioSlicer": XB_AudioSlicer,
"XB_AudioSlicerV1": XB_AudioSlicerV1,
"XB_AudioSlicerV2": XB_AudioSlicerV2,
"XB_AudioSlicerV3": XB_AudioSlicerV3
"XB_AudioSlicerV3": XB_AudioSlicerV3,
"XB_StringMerge": XB_StringMerge
}
NODE_DISPLAY_NAME_MAPPINGS = {
@@ -196,6 +198,7 @@ try:
"XB_WanInfiniteTalkToVideo": "XB-BOX - 🎵 语音转视频分块",
"XB_WanInfiniteTalkToVideo_Single": "XB-BOX - 🎵 语音转视频分块(单人)",
"XB_WanInfiniteTalkToVideo_Dual": "XB-BOX - 🎵 语音转视频分块(双人)",
"XB_StringMerge": "XB-BOX - 📝 字符串合并",
}
print_success("\n" + "="*50)
+43
View File
@@ -0,0 +1,43 @@
import { app } from "../../scripts/app.js";
// ─── 动态输入槽管理(源自 ComfyUI-KJNodes) ───
// 添加 "Update inputs" 按钮,根据 inputcount 重建 string_1..string_N 插槽
function setupDynamicInputs(node, { type, prefix, countWidget = "inputcount", slotOptions } = {}) {
const rebuild = () => {
if (!node.inputs) node.inputs = [];
const countW = node.widgets?.find(w => w.name === countWidget);
if (!countW) return;
const target = countW.value;
const current = node.inputs.filter(i => i.name?.startsWith(prefix)).length;
if (target === current) return;
if (target < current) {
for (let i = 0; i < current - target; i++) node.removeInput(node.inputs.length - 1);
} else {
for (let i = current + 1; i <= target; i++) node.addInput(`${prefix}${i}`, type, slotOptions);
}
};
node.addWidget("button", "Update inputs", null, rebuild);
const countW = node.widgets?.find(w => w.name === countWidget);
if (countW) {
const origCb = countW.callback;
countW.callback = function (value, canvas) {
const r = origCb ? origCb.apply(this, arguments) : undefined;
if (!canvas) rebuild(); // bare = API reload; skip interactive scrub
return r;
};
}
return rebuild;
}
app.registerExtension({
name: "XB_ToolBox.StringMerge",
async beforeRegisterNodeDef(nodeType, nodeData) {
if (nodeData.name !== "XB_StringMerge") return;
const origOnNodeCreated = nodeType.prototype.onNodeCreated || function () { };
nodeType.prototype.onNodeCreated = function () {
origOnNodeCreated.apply(this, arguments);
setupDynamicInputs(this, { type: "STRING", prefix: "string_", slotOptions: { shape: 7 } });
};
},
});
+4 -1
View File
@@ -12,7 +12,10 @@
"Batch_Process": "批量处理",
"ROCm": "ROCm加速",
"Wan": "Wan视频",
"Audio": "音频工具"
"Audio": "音频工具",
"Display": "显示标签",
"Segment": "图像分割",
"Text": "文本工具"
},
"Mode A (128x128x32)": "模式A (128x128x32)",
"Mode B (128x64x96)": "模式 B (128x64x96)",
+13
View File
@@ -1152,5 +1152,18 @@
"outputs": {
"0": { "name": "图像" }
}
},
"XB_StringMerge": {
"display_name": "XB-BOX - 📝 字符串合并",
"inputs": {
"inputcount": { "name": "输入数量" },
"string_1": { "name": "字符串_1" },
"delimiter": { "name": "分隔符" },
"return_list": { "name": "输出为列表" },
"newline_per_segment": { "name": "每段换行" }
},
"outputs": {
"0": { "name": "字符串" }
}
}
}
+61
View File
@@ -0,0 +1,61 @@
"""
XB-BOX 字符串合并节点
====================
基于 ComfyUI-KJNodes 的 JoinStringMulti 节点进行重构,
增加「每段换行」选项。
"""
# ============================================================
# XB_StringMerge — 字符串合并(多重)
# ============================================================
class XB_StringMerge:
"""合并多个输入字符串为单个字符串,支持自定义分隔符和每段换行"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"inputcount": ("INT", {"default": 2, "min": 2, "max": 1000, "step": 1}),
"string_1": ("STRING", {"default": "", "forceInput": True}),
"delimiter": ("STRING", {"default": " ", "multiline": False}),
"return_list": ("BOOLEAN", {"default": False}),
"newline_per_segment": ("BOOLEAN", {"default": False, "tooltip": "每段换行:打开后,每段输入字符串将换行排列"}),
},
"optional": {
"string_2": ("STRING", {"default": "", "forceInput": True}),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("string",)
FUNCTION = "combine"
CATEGORY = "XB_ToolBox/Text"
DESCRIPTION = (
"合并多个字符串输入。\n"
"可以设置输入数量,点击「Update inputs」来增加更多插槽。\n"
"分隔符:指定连接字符串的分隔符。\n"
"输出为列表:开启后返回字符串列表而非合并后的单一字符串。\n"
"每段换行:开启后忽略分隔符,每段字符串用换行符连接。"
)
def combine(self, inputcount, delimiter, return_list, newline_per_segment, **kwargs):
string = kwargs.get("string_1", "")
strings = [string] # Initialize a list with the first string
# 如果开启了每段换行,使用换行符作为实际分隔符
actual_delimiter = "\n" if newline_per_segment else delimiter
for c in range(1, inputcount):
new_string = kwargs.get(f"string_{c + 1}", "")
if not new_string:
continue
if return_list:
strings.append(new_string) # Add new string to the list
else:
string = string + actual_delimiter + new_string
if return_list:
return (strings,) # Return the list of strings
else:
return (string,) # Return the combined string
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "XB_ToolBox"
description = "XB-BOX: ComfyUI custom node toolbox - Wan video generation, ROCm acceleration, pipeline tools, and more"
version = "0.6.18"
version = "0.6.20"
license = { file = "LICENSE" }
[project.urls]