bifroest/app/static/css-framework/build.py
2026-10-27 08:34:17 +01:00

79 lines
3.1 KiB
Python

#!/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' <link rel="stylesheet" href="{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, ' <link rel="stylesheet" href="main.min.css">')
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()