#!/usr/bin/env python3 """ build.py — CSS-Framework Minifier Erzeugt dist/main.min.css, dist/framework.min.js und dist/index.html Verwendung: python3 build.py """ import re import pathlib DIST = pathlib.Path("dist") CSS_ORDER = ["tokens.css", "base.css", "components.css", "utilities.css"] JS_SOURCE = pathlib.Path("framework.js") HTML_SOURCE = pathlib.Path("index.html") CSS_LINKS = "\n".join( f' ' for f in CSS_ORDER ) def minify_css(src: str) -> str: src = re.sub(r"/\*.*?\*/", "", src, flags=re.DOTALL) # Kommentare entfernen src = re.sub(r"\s+", " ", src) # Whitespace normalisieren src = re.sub(r"\s*([{};:,>~])\s*", r"\1", src) # Leerzeichen um Sonderzeichen (+/- bleiben wegen calc()) src = re.sub(r";\}", "}", src) # Letztes Semikolon in Block return src.strip() def minify_js(src: str) -> str: src = re.sub(r"//.*?$", "", src, flags=re.MULTILINE) # Zeilenkommentare src = re.sub(r"/\*.*?\*/", "", src, flags=re.DOTALL) # Blockkommentare src = re.sub(r"\n\s*\n", "\n", src) # Leerzeilen src = re.sub(r"[ \t]+", " ", src) # Horizontalen Whitespace src = re.sub(r" ?([\[\]{}();,=+\-*/<>!&|?:]) ?", r"\1", src) # um Operatoren return src.strip() def build(): DIST.mkdir(exist_ok=True) # CSS: alle vier Layer bündeln und minifizieren → main.min.css css_total = 0 combined = [] for filename in CSS_ORDER: src = pathlib.Path(filename).read_text(encoding="utf-8") css_total += len(src.encode()) combined.append(src) main_min = minify_css("\n".join(combined)) (DIST / "main.min.css").write_text(main_min, encoding="utf-8") print(f" main.min.css: {css_total / 1024:.1f} KB → {len(main_min.encode()) / 1024:.1f} KB") # JS: minifizieren → framework.min.js js_src = JS_SOURCE.read_text(encoding="utf-8") js_min = minify_js(js_src) (DIST / "framework.min.js").write_text(js_min, encoding="utf-8") print(f" framework.min.js: {len(js_src.encode()) / 1024:.1f} KB → {len(js_min.encode()) / 1024:.1f} KB") # theme.js minifizieren, Demo-Dateien unverändert kopieren (DIST / "theme.min.js").write_text(minify_js(pathlib.Path("theme.js").read_text(encoding="utf-8")), encoding="utf-8") for name in ("demo.css", "demo.js"): (DIST / name).write_text(pathlib.Path(name).read_text(encoding="utf-8"), encoding="utf-8") print(" theme.min.js, demo.css, demo.js") # HTML: vier CSS-Links → main.min.css, framework.js → framework.min.js html = HTML_SOURCE.read_text(encoding="utf-8") html = html.replace(CSS_LINKS, ' ') html = html.replace('src="framework.js"', 'src="framework.min.js"') html = html.replace('src="theme.js"', 'src="theme.min.js"') (DIST / "index.html").write_text(html, encoding="utf-8") print(f" index.html → dist/index.html (minifizierte Pfade)") print(f"\nFertig — Ausgabe in {DIST}/") if __name__ == "__main__": print("CSS-Framework Build\n") build()