79 lines
3.1 KiB
Python
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()
|