Gallery front
This commit is contained in:
74
src/py/builder/css_generator.py
Normal file
74
src/py/builder/css_generator.py
Normal file
@ -0,0 +1,74 @@
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from shutil import copyfile
|
||||
|
||||
def generate_css_variables(colors_dict, output_path):
|
||||
"""Generate css variables for theme colors"""
|
||||
css_lines = [":root {"]
|
||||
for key, value in colors_dict.items():
|
||||
css_lines.append(f" --color-{key.replace('_', '-')}: {value};")
|
||||
css_lines.append("}")
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
f.write("\n".join(css_lines))
|
||||
logging.info(f"[✓] CSS variables written to {output_path}")
|
||||
|
||||
def generate_fonts_css(fonts_dir, output_path, fonts_cfg=None):
|
||||
"""Generate css variables fonts"""
|
||||
font_files = list(fonts_dir.glob("*"))
|
||||
font_faces = {}
|
||||
preload_links = []
|
||||
format_map = {".woff2": "woff2", ".woff": "woff", ".ttf": "truetype", ".otf": "opentype"}
|
||||
|
||||
for font_file in font_files:
|
||||
name = font_file.stem
|
||||
ext = font_file.suffix.lower()
|
||||
if ext not in format_map:
|
||||
continue
|
||||
font_faces.setdefault(name, []).append((font_file.name, format_map[ext]))
|
||||
dest_font_path = output_path.parent.parent / "fonts" / font_file.name
|
||||
dest_font_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
copyfile(font_file, dest_font_path)
|
||||
preload_links.append(
|
||||
f'<link rel="preload" href="fonts/{font_file.name}" as="font" type="font/{format_map[ext]}" crossorigin>'
|
||||
)
|
||||
|
||||
css_lines = []
|
||||
for font_name, sources in font_faces.items():
|
||||
css_lines.append(f"@font-face {{")
|
||||
css_lines.append(f" font-family: '{font_name}';")
|
||||
srcs = [f"url('../fonts/{file}') format('{fmt}')" for file, fmt in sorted(sources)]
|
||||
css_lines.append(f" src: {', '.join(srcs)};")
|
||||
css_lines.append(" font-weight: normal;")
|
||||
css_lines.append(" font-style: normal;")
|
||||
css_lines.append("}")
|
||||
|
||||
if fonts_cfg:
|
||||
css_lines.append(":root {")
|
||||
if "primary" in fonts_cfg:
|
||||
p = fonts_cfg["primary"]
|
||||
css_lines.append(f" --font-primary: '{p['name']}', {p['fallback']};")
|
||||
if "secondary" in fonts_cfg:
|
||||
s = fonts_cfg["secondary"]
|
||||
css_lines.append(f" --font-secondary: '{s['name']}', {s['fallback']};")
|
||||
css_lines.append("}")
|
||||
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
output_path.write_text("\n\n".join(css_lines), encoding="utf-8")
|
||||
logging.info(f"[✓] Generated fonts CSS: {output_path}")
|
||||
return preload_links
|
||||
|
||||
def generate_google_fonts_link(fonts):
|
||||
"""Generate src link for Google fonts"""
|
||||
if not fonts:
|
||||
return ""
|
||||
families = []
|
||||
for font in fonts:
|
||||
family = font["family"].replace(" ", "+")
|
||||
weights = font.get("weights", [])
|
||||
if weights:
|
||||
families.append(f"{family}:wght@{';'.join(weights)}")
|
||||
else:
|
||||
families.append(family)
|
||||
href = "https://fonts.googleapis.com/css2?" + "&".join(f"family={f}" for f in families) + "&display=swap"
|
||||
return f'<link href="{href}" rel="stylesheet">'
|
Reference in New Issue
Block a user