専用ノード方式へ変更: 既存ノードに影響させず専用ノードのみでタグ編集

当初の全テキスト欄への自動適用をやめ、新規ノード PromptTagEditor(Prompt Tag Editor 🏷️)
の text 欄にのみチップUIを適用する方式へ変更。CLIP Text Encode / Note など既存ノードには
一切影響しない。

- __init__.py: PromptTagEditorNode(text STRING入力→STRING出力, category utils/prompt)を追加
- input_watcher.js: 対象を node type 'PromptTagEditor' に限定
- README: 専用ノードの使い方に更新

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
4thCafe
2026-07-17 02:34:32 +09:00
co-authored by Claude Fable 5
parent 3db4c76c90
commit c2b879c7fe
3 changed files with 51 additions and 10 deletions
+12 -6
View File
@@ -1,20 +1,26 @@
# ComfyUI-PromptTagEditor
既存ノードのプロンプト入力欄(multiline STRING)を、**タグ(チップ)単位で編集**できるように強化する ComfyUI フロントエンド拡張です。SD-WebUI の `sd-webui-prompt-all-in-one` のタグ編集体験を、**追加ノードを増やさずに** ComfyUI 上で再現します。
プロンプトを**タグ(チップ)単位で編集**できる ComfyUI 専用ノード **`Prompt Tag Editor 🏷️`** を追加します。SD-WebUI の `sd-webui-prompt-all-in-one` のタグ編集体験を ComfyUI 上で再現します。
チップUIは**このノードの text 欄にのみ**表示され、`CLIP Text Encode` や `Note` など**既存のノードには一切影響しません**。
## 使い方
1. ノード追加メニュー `utils/prompt` → **`Prompt Tag Editor 🏷️`** を配置。
2. text 欄にプロンプトを入力すると、その下の「Tags」エリアにタグがチップ表示されます。
3. `text`(STRING)出力を、`CLIP Text Encode` の text 入力(右クリック → Convert text to input)や、任意のテキスト入力へ接続します。
## 特徴
- **タグ編集エリアを分離表示**: 既存の `<textarea>`(生プロンプト)はそのまま残し、その下にチップ(タグ)エリアを追加します。両者は双方向に同期します。
- **タグ編集エリアを分離表示**: 上=生プロンプトの `<textarea>`、下=チップ(タグ)エリア。双方向に同期します。
- **タグ単位の操作**:
- 各タグをダブルクリックで**個別編集**
- `+` / `−` で**重み調整**(`(word:1.2)` 構文、0.05刻み、1.0付近で括弧自動除去)
- **ドラッグ&ドロップで並べ替え**
- `×` で**削除**
- **既存ワークフローと非破壊**: 値はネイティブのテキストウィジェットが保持するため、ワークフロー保存・実行時プロンプトに確実に反映されます。LoRA `<lora:...>`・`BREAK`・エスケープ・括弧内カンマも壊しません。
- **非破壊**: 値はネイティブのテキストウィジェットが保持するため、ワークフロー保存・実行時プロンプトに確実に反映されます。LoRA `<lora:...>`・`BREAK`・エスケープ・括弧内カンマも壊しません。
## 対象ノード
`CLIP Text Encode` 系をはじめ、**multiline STRING 入力欄(`customtext`)を持つ全ノード**に自動適用されます。設定 → `Prompt Tag Editor: タグ編集エリアを表示` でON/OFFできます。
設定 → `Prompt Tag Editor: タグ編集エリアを表示` でチップエリアのON/OFFができます。
## インストール
+34 -4
View File
@@ -1,11 +1,41 @@
"""ComfyUI-PromptTagEditor / 4thCafe
既存ノードの multiline STRING 入力欄を、フロントエンド拡張でタグ(チップ)単位編集できるように強化する。
Pythonノードは追加しない(WEB_DIRECTORY の JS 拡張のみ)。
タグ(チップ)単位でプロンプトを編集できる専用ノードを提供する。
チップUIはこの拡張が追加する `PromptTagEditor` ノードの text 欄にのみ適用され、
既存の他ノード(CLIP Text Encode / Note など)には一切影響しない。
"""
NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}
class PromptTagEditorNode:
"""タグ編集用の汎用プロンプトノード。text をそのまま STRING で出力する。
フロントエンド拡張(js/)が、このノードの text ウィジェット直下に
タグ(チップ)編集エリアを表示する。
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text": ("STRING", {"multiline": True, "default": ""}),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
FUNCTION = "run"
CATEGORY = "utils/prompt"
def run(self, text):
return (text,)
NODE_CLASS_MAPPINGS = {
"PromptTagEditor": PromptTagEditorNode,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"PromptTagEditor": "Prompt Tag Editor 🏷️",
}
WEB_DIRECTORY = "./js"
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
+5
View File
@@ -4,6 +4,9 @@
import { TagEditor } from "./tag_editor.js";
// このノード型のtextウィジェットにのみチップUIを適用(既存ノードには一切触れない)
const TARGET_NODE_TYPE = "PromptTagEditor";
export class Watcher {
constructor(app, getEnabled) {
this.app = app;
@@ -27,6 +30,8 @@ export class Watcher {
attachToNode(node) {
if (!this.getEnabled()) return;
if (!node || !node.widgets) return;
// 専用ノードのみを対象(既存ノードは対象外)
if ((node.comfyClass || node.type) !== TARGET_NODE_TYPE) return;
for (const w of node.widgets) {
if (w.type !== "customtext") continue; // multiline STRING のみ
if (w.__pteAttached) continue;