"""Interface de la carte à tuiles XYZ (image lidar-maps). Le HTML, le CSS et le JS vivent dans `web/` (vrais fichiers, relus à l'import) ; `write_map_assets()` les bâche dans l'image au build. La page est une coquille minimale : tout l'état vient de `/api/map/meta`, les couches sont des `L.tileLayer` standard — le navigateur gère LOD, cache et animation. """ import hashlib from pathlib import Path ASSETS_DIRNAME = "mapserve_assets" WEB_DIR = Path(__file__).resolve().parent / "web" def _read_web(name): """Fichier de l'interface (HTML/CSS/JS), lu une fois à l'import.""" return (WEB_DIR / name).read_text(encoding="utf-8") _MAP_HTML = _read_web("map.html") _MAP_CSS = _read_web("map.css") _MAP_JS = _read_web("map.js") def ui_version(): """Hash court du CSS+JS : sert d'URL de version pour les assets.""" return hashlib.sha1((_MAP_CSS + _MAP_JS).encode("utf-8")).hexdigest()[:10] def write_map_assets(assets_dir): """Écrit app.css / app.js (+ Leaflet vendorisé) dans `assets_dir`.""" import shutil assets_dir = Path(assets_dir) assets_dir.mkdir(parents=True, exist_ok=True) (assets_dir / "app.css").write_text(_MAP_CSS, encoding="utf-8") (assets_dir / "app.js").write_text( _MAP_JS.replace("__UI_VERSION__", ui_version()), encoding="utf-8") src_vendor = Path(__file__).parent / "assets" / "vendor" dst_vendor = assets_dir / "vendor" if src_vendor.is_dir(): shutil.rmtree(dst_vendor, ignore_errors=True) shutil.copytree(src_vendor, dst_vendor) return assets_dir def render_html(): """Coquille HTML (données chargées par /api/map/meta).""" return _MAP_HTML.replace("__ASSETS_V__", ui_version())