Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .github/.spellcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
matrix:
- name: Markdown
sources:
- 'README.md'
- 'docs/**/*.md'
- 'scripts/README*.md'
aspell:
lang: en
dictionary:
wordlists:
- .github/.wordlist.txt
encoding: utf-8
pipeline:
- pyspelling.filters.markdown:
markdown_extensions:
- pymdownx.superfences:
- pyspelling.filters.html:
comments: false
ignores:
- code
- pre

- name: Index JSON Files
sources:
- 'templates/index.json'
aspell:
lang: en
dictionary:
wordlists:
- .github/.wordlist.txt
encoding: utf-8
pipeline:
- pyspelling.filters.context:
context_visible_first: true
delimiters:
# Extract only "title" field values
- open: '"title":\s*"'
close: '"'
# Extract only "description" field values
- open: '"description":\s*"'
close: '"'

- name: Workflow JSON Files
sources:
- 'templates/*.json'
- '!templates/index*.json'
aspell:
lang: en
dictionary:
wordlists:
- .github/.wordlist.txt
encoding: utf-8
pipeline:
- pyspelling.filters.context:
context_visible_first: true
delimiters:
# Only extract content inside widgets_values arrays for MarkdownNote/Note nodes
# This matches: "type": "MarkdownNote" (or Note), followed by "widgets_values": ["content here"]
- open: '(?s)"type":\s*"(?:MarkdownNote|Note)"(?:[^{]|{(?:[^{}]|{[^{}]*})*})*?"widgets_values":\s*\[\s*"'
close: '"\s*(?:,|\])'
- pyspelling.filters.markdown:
markdown_extensions:
- pymdownx.superfences:
- pyspelling.filters.html:
comments: false
ignores:
- code
- pre

210 changes: 210 additions & 0 deletions .github/.wordlist.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# Custom dictionary for ComfyUI workflow templates
ComfyUI
ComfyUI's
Comfy
comfyui
comfyanonymous
webp
WEBP
png
jpeg
jpg
MP4
mp4
mp3
workflow
workflows
VAE
vae
UNETLoader
CLIPLoader
VAELoader
SaveWEBM
hugginface
huggingface
embeddings
UNET
safetensors
repackaged
fp8
bf16
xxl
thumbnails
Wan
ltxv
cnr
diffusion
PyPi
pyproject
toml
PySpelling
Zod
e4m3fn
t2v
s2v
i2v
t2i
i2i
modelFile
Github
Pinia
composables
Vitest
Playwright
eslint
prettier
EzGif
ezgif
gif
markdown
Markdownlint
nodejs
npm
pnpm
repo
utils
changelog
encoders
diffusers
configs
metadata
SHA256
bytedance
seedream4
flf2v
bfl
kontext
vercel
Qwen
qwen
subgraphed
moduleName
mediaType
mediaSubtype
tutorialUrl
thumbnailVariant
hoverDissolve
hoverZoom
compareSlider
isEssential
LoRA
lora
inpaint
inpainting
upscaling
upscale
ControlNet
controlnet
SDXL
sdxl
Flux
flux
Hunyuan3D
hunyuan
ACE
upscaler
detailer
img2img
latents
IPAdapter
AnimateDiff
AnimateLCM
LCM
LTX
LTXV
CogVideo
CogVideoX
GGUF
gguf
fp16
SD1
SD3
SD3.5
Latte
Mochi
Mamba
SORA
StyleGan
StyleGAN
VideoLLM
controlnets
DepthMap
depthmap
Canny
OpenPose
ComfyOrg
Comfy-Org
Safetensor
PyTorch
pytorch
cuda
CUDA
VRAM
vram
GPU
cpu
checkpoints
OSS
API
api
JSON
json
UI
mediafiles
videogen
imagegen
audiogen
quantized
quantization
MarkdownNote
civitai
majicmixRealistic
japaneseStyleRealistic
openpose
mse
ema
pruned
stabilityai
fp
v11p
v7
v20
sd15
vae-ft-mse
safetensor
workflows
href
url
github
README
readme
workaround
KeepIntermediate
LANs
LoadImage
MetadataImage
SaveVideo
ViduImageToVideoNode
bgcolor
config
df
ds
eb
frontendVersion
latentpreview
latentpreviewrate
nTo
pos
ue
unconnectable
ver
vidu
viduq
ImageToVideo
VideoNode
metadata
frontend
backend
latent
unconnected

55 changes: 55 additions & 0 deletions .github/extract_workflow_text.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env python3
"""
Custom filter for PySpelling to extract text content from workflow JSON files.
Only extracts widgets_values from MarkdownNote and Note type nodes.
"""
import json
import sys

def extract_text_from_workflow(content):
"""Extract text from widgets_values in MarkdownNote and Note nodes."""
try:
data = json.loads(content)

# Handle different JSON structures
nodes = []
if isinstance(data, dict):
# Check if it's a workflow with nodes
if 'nodes' in data:
nodes = data['nodes']
elif 'workflow' in data and 'nodes' in data['workflow']:
nodes = data['workflow']['nodes']
elif isinstance(data, list):
nodes = data

extracted_text = []

for node in nodes:
if not isinstance(node, dict):
continue

node_type = node.get('type', '')

# Only process MarkdownNote and Note nodes
if node_type in ['MarkdownNote', 'Note']:
widgets_values = node.get('widgets_values', [])

# Extract text from widgets_values
for value in widgets_values:
if isinstance(value, str) and value.strip():
extracted_text.append(value)

return '\n\n---SPELLCHECK_SEPARATOR---\n\n'.join(extracted_text) if extracted_text else ''

except json.JSONDecodeError:
return ''
except Exception as e:
# Silent error - return empty string
return ''


if __name__ == '__main__':
content = sys.stdin.read()
result = extract_text_from_workflow(content)
sys.stdout.write(result)

30 changes: 30 additions & 0 deletions .github/workflows/spellcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Spellcheck

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
paths:
- '**/*.md'
- '**/*.json'
- 'docs/**'
- 'templates/**'
- '.github/.spellcheck.yml'
- '.github/.wordlist.txt'
- '.github/workflows/spellcheck.yml'

jobs:
spellcheck:
name: Spellcheck
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Run spellcheck
uses: rojopolis/[email protected]
with:
config_path: .github/.spellcheck.yml

Loading