commit d8f2fa75a10d038e50631374df87d28755635902 Author: YULE-WINDOWS\zlcbl Date: Wed Jan 21 00:47:33 2026 +0900 Initial commit: ComfyUI-PromptComment Add custom nodes for commenting out portions of prompts: - PromptComment: Single marker comment stripping - PromptCommentMultiMarker: Multi-marker support (#, //, --) Co-Authored-By: Claude Opus 4.5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2dd68ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Claude temp files +tmpclaude-* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b77bf2a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a07944c --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# ComfyUI-PromptComment + +ComfyUI のプロンプトでコメントアウト機能を提供するカスタムノードです。 + +[English](README_EN.md) + +## 機能 + +プロンプト内で `#` や `//` などの記号を使ってコメントを記述できます。 +コメント部分は自動的に除去され、クリーンなプロンプトが出力されます。 + +## インストール + +### 手動インストール + +```bash +cd ComfyUI/custom_nodes +git clone https://github.com/YOUR_USERNAME/ComfyUI-PromptComment.git +``` + +### ComfyUI Manager + +ComfyUI Manager から "PromptComment" で検索してインストールできます。 + +## ノード + +### Prompt Comment (Strip) + +シンプルなコメント除去ノード。1種類のコメントマーカーを指定できます。 + +**入力:** +| パラメータ | 説明 | +|-----------|------| +| text | 入力プロンプト(複数行対応) | +| comment_style | コメント記法: `#`, `//`, `--`, `Custom` | +| custom_marker | comment_style が Custom の時に使用する文字列 | +| remove_empty_lines | 空行を削除するか | +| trim_whitespace | 各行の前後の空白を削除するか | + +**出力:** +- `text`: コメントが除去されたプロンプト + +### Prompt Comment (Multi-Marker) + +複数のコメントマーカーを同時に認識するノード。 + +**入力:** +| パラメータ | 説明 | +|-----------|------| +| text | 入力プロンプト(複数行対応) | +| use_hash | `#` をコメントとして認識 | +| use_double_slash | `//` をコメントとして認識 | +| use_double_dash | `--` をコメントとして認識 | +| remove_empty_lines | 空行を削除するか | +| trim_whitespace | 各行の前後の空白を削除するか | + +## 使用例 + +### 入力プロンプト: +``` +masterpiece, best quality, # 品質タグ +1girl, solo, # キャラクター +blue hair, red eyes, # 外見 +# sitting, standing, # ← この行は全体がコメント +smile +``` + +### 出力 (remove_empty_lines=True): +``` +masterpiece, best quality, +1girl, solo, +blue hair, red eyes, +smile +``` + +## ワークフロー例 + +``` +[String Literal] → [Prompt Comment] → [CLIP Text Encode] + (プロンプト) (コメント除去) (エンコード) +``` + +## ライセンス + +MIT License diff --git a/README_EN.md b/README_EN.md new file mode 100644 index 0000000..2fc509c --- /dev/null +++ b/README_EN.md @@ -0,0 +1,85 @@ +# ComfyUI-PromptComment + +Custom nodes that provide comment functionality for ComfyUI prompts. + +[日本語](README.md) + +## Features + +Write comments in your prompts using markers like `#` or `//`. +Comments are automatically removed, outputting a clean prompt. + +## Installation + +### Manual Installation + +```bash +cd ComfyUI/custom_nodes +git clone https://github.com/YOUR_USERNAME/ComfyUI-PromptComment.git +``` + +### ComfyUI Manager + +Search for "PromptComment" in ComfyUI Manager to install. + +## Nodes + +### Prompt Comment (Strip) + +Simple comment removal node. Specify one type of comment marker. + +**Inputs:** +| Parameter | Description | +|-----------|-------------| +| text | Input prompt (multiline supported) | +| comment_style | Comment syntax: `#`, `//`, `--`, `Custom` | +| custom_marker | String to use when comment_style is Custom | +| remove_empty_lines | Remove empty lines | +| trim_whitespace | Trim whitespace from each line | + +**Output:** +- `text`: Prompt with comments removed + +### Prompt Comment (Multi-Marker) + +Node that recognizes multiple comment markers simultaneously. + +**Inputs:** +| Parameter | Description | +|-----------|-------------| +| text | Input prompt (multiline supported) | +| use_hash | Recognize `#` as comment | +| use_double_slash | Recognize `//` as comment | +| use_double_dash | Recognize `--` as comment | +| remove_empty_lines | Remove empty lines | +| trim_whitespace | Trim whitespace from each line | + +## Usage Example + +### Input Prompt: +``` +masterpiece, best quality, # quality tags +1girl, solo, # character +blue hair, red eyes, # appearance +# sitting, standing, # ← entire line is a comment +smile +``` + +### Output (remove_empty_lines=True): +``` +masterpiece, best quality, +1girl, solo, +blue hair, red eyes, +smile +``` + +## Workflow Example + +``` +[String Literal] → [Prompt Comment] → [CLIP Text Encode] + (prompt) (strip comments) (encode) +``` + +## License + +MIT License diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..f0caaee --- /dev/null +++ b/__init__.py @@ -0,0 +1,3 @@ +from .prompt_comment import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] diff --git a/prompt_comment.py b/prompt_comment.py new file mode 100644 index 0000000..ae43905 --- /dev/null +++ b/prompt_comment.py @@ -0,0 +1,179 @@ +# prompt_comment.py +# +# ComfyUI のプロンプトでコメントアウト機能を提供するノード +# 指定した記号以降のテキストを削除し、クリーンなプロンプトを出力します +# +# 対応コメント記法: +# - # (Python/Shell style) +# - // (C/JavaScript style) +# - -- (SQL style) +# - Custom (任意の文字列) + +import re + + +class PromptComment: + """ + プロンプト内のコメントを除去するノード。 + 各行で指定したコメント記号以降のテキストを削除します。 + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": True, "default": ""}), + "comment_style": (["#", "//", "--", "Custom"],), + "custom_marker": ("STRING", {"default": "#"}), + "remove_empty_lines": ("BOOLEAN", {"default": True}), + "trim_whitespace": ("BOOLEAN", {"default": True}), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "strip_comments" + CATEGORY = "text/utils" + + def strip_comments( + self, + text, + comment_style, + custom_marker, + remove_empty_lines, + trim_whitespace, + ): + # コメントマーカーを決定 + if comment_style == "Custom": + marker = custom_marker + else: + marker = comment_style + + if not marker: + # マーカーが空の場合は何もしない + return (text,) + + # 各行を処理 + lines = text.split("\n") + processed_lines = [] + + for line in lines: + # コメントマーカーの位置を検索 + # 文字列リテラル内のマーカーは無視しない(シンプルな実装) + marker_pos = line.find(marker) + + if marker_pos != -1: + # コメントマーカー以前のテキストのみ保持 + line = line[:marker_pos] + + if trim_whitespace: + line = line.strip() + + # 空行の処理 + if remove_empty_lines: + if line: # 空でない行のみ追加 + processed_lines.append(line) + else: + processed_lines.append(line) + + # 行を結合 + result = "\n".join(processed_lines) + + # 最終的なトリム + if trim_whitespace: + result = result.strip() + + return (result,) + + +class PromptCommentMultiMarker: + """ + 複数のコメントマーカーに対応したプロンプトコメント除去ノード。 + #, //, -- を同時に認識します。 + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ("STRING", {"multiline": True, "default": ""}), + "use_hash": ("BOOLEAN", {"default": True}), # # + "use_double_slash": ("BOOLEAN", {"default": False}), # // + "use_double_dash": ("BOOLEAN", {"default": False}), # -- + "remove_empty_lines": ("BOOLEAN", {"default": True}), + "trim_whitespace": ("BOOLEAN", {"default": True}), + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "strip_comments" + CATEGORY = "text/utils" + + def strip_comments( + self, + text, + use_hash, + use_double_slash, + use_double_dash, + remove_empty_lines, + trim_whitespace, + ): + # 有効なマーカーのリストを構築 + markers = [] + if use_hash: + markers.append("#") + if use_double_slash: + markers.append("//") + if use_double_dash: + markers.append("--") + + if not markers: + # マーカーが指定されていない場合は何もしない + return (text,) + + # 各行を処理 + lines = text.split("\n") + processed_lines = [] + + for line in lines: + # 最も早い位置にあるコメントマーカーを検索 + earliest_pos = len(line) + for marker in markers: + pos = line.find(marker) + if pos != -1 and pos < earliest_pos: + earliest_pos = pos + + if earliest_pos < len(line): + # コメントマーカー以前のテキストのみ保持 + line = line[:earliest_pos] + + if trim_whitespace: + line = line.strip() + + # 空行の処理 + if remove_empty_lines: + if line: # 空でない行のみ追加 + processed_lines.append(line) + else: + processed_lines.append(line) + + # 行を結合 + result = "\n".join(processed_lines) + + # 最終的なトリム + if trim_whitespace: + result = result.strip() + + return (result,) + + +NODE_CLASS_MAPPINGS = { + "PromptComment": PromptComment, + "PromptCommentMultiMarker": PromptCommentMultiMarker, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "PromptComment": "Prompt Comment (Strip)", + "PromptCommentMultiMarker": "Prompt Comment (Multi-Marker)", +}