diff --git a/.github/.spellcheck.yml b/.github/.spellcheck.yml new file mode 100644 index 00000000..e64eb508 --- /dev/null +++ b/.github/.spellcheck.yml @@ -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 + diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt new file mode 100644 index 00000000..21ebb76e --- /dev/null +++ b/.github/.wordlist.txt @@ -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 + diff --git a/.github/extract_workflow_text.py b/.github/extract_workflow_text.py new file mode 100644 index 00000000..08f96610 --- /dev/null +++ b/.github/extract_workflow_text.py @@ -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) + diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 00000000..8abe0823 --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -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/spellcheck-github-actions@0.53.0 + with: + config_path: .github/.spellcheck.yml +