#!/usr/bin/env python3 """ Build script for kashilo.com Minifies JS and CSS files into dist/ directory. Usage: python3 build.py Requirements: pip3 install rjsmin rcssmin """ import os import shutil import sys try: import rjsmin import rcssmin except ImportError: print("Missing dependencies. Install with:") print(" pip3 install rjsmin rcssmin") sys.exit(1) SRC_DIR = os.path.dirname(os.path.abspath(__file__)) DIST_DIR = os.path.join(SRC_DIR, 'dist') EXCLUDE_DIRS = {'.git', 'dist', 'node_modules', 'docs', 'tests', '.vscode', '.idea', '__pycache__'} EXCLUDE_FILES = {'AGENTS.md', 'deploy.sh', 'build.py', 'README.md', '.gitignore'} def should_exclude(path): parts = os.path.relpath(path, SRC_DIR).split(os.sep) return any(p in EXCLUDE_DIRS for p in parts) or os.path.basename(path) in EXCLUDE_FILES def build(): if os.path.exists(DIST_DIR): shutil.rmtree(DIST_DIR) js_saved = 0 css_saved = 0 files_copied = 0 for root, dirs, files in os.walk(SRC_DIR): dirs[:] = [d for d in dirs if d not in EXCLUDE_DIRS] for filename in files: src_path = os.path.join(root, filename) if should_exclude(src_path): continue rel_path = os.path.relpath(src_path, SRC_DIR) dest_path = os.path.join(DIST_DIR, rel_path) os.makedirs(os.path.dirname(dest_path), exist_ok=True) if filename.endswith('.js') and not filename.endswith('.min.js'): with open(src_path, 'r', encoding='utf-8') as f: original = f.read() minified = rjsmin.jsmin(original) with open(dest_path, 'w', encoding='utf-8') as f: f.write(minified) saved = len(original.encode('utf-8')) - len(minified.encode('utf-8')) js_saved += saved files_copied += 1 elif filename.endswith('.css') and not filename.endswith('.min.css'): with open(src_path, 'r', encoding='utf-8') as f: original = f.read() minified = rcssmin.cssmin(original) with open(dest_path, 'w', encoding='utf-8') as f: f.write(minified) saved = len(original.encode('utf-8')) - len(minified.encode('utf-8')) css_saved += saved files_copied += 1 else: shutil.copy2(src_path, dest_path) files_copied += 1 print(f"Build complete: {files_copied} files -> dist/") print(f" JS savings: {js_saved / 1024:.1f} KiB") print(f" CSS savings: {css_saved / 1024:.1f} KiB") print(f" Total saved: {(js_saved + css_saved) / 1024:.1f} KiB") if __name__ == '__main__': build()