import re def _control_value(el, control): """Lit la valeur actuelle d'un réglage à partir de l'élément stocké (content / attributs / style), avec repli sur sa valeur par défaut.""" ctype = control["type"] style = el.get("style") or {} if ctype == "preset": for key, _label, props in control["options"]: if all((style.get(k) or "") == (v or "") for k, v in props.items()): return key return control.get("default") if ctype == "toggle_token": _kind, name = control["target"].split(":", 1) current = style.get(name, "") or "" return control["token"] in current.split() if ctype == "scale": transform = style.get("transform", "") or "" m = re.search(r"scale\(([\d.]+)\)", transform) return float(m.group(1)) if m else control.get("default", 1) if ctype == "size": _kind, name = control["target"].split(":", 1) raw = style.get(name) m = re.match(r"^([\d.]+)(px|%)$", str(raw or "")) if m: return {"value": float(m.group(1)), "unit": m.group(2)} return {"value": control.get("default", 0), "unit": "%"} target = control["target"] if target == "content": return el.get("content") or control.get("default", "") kind, name = target.split(":", 1) store = el.get("attributes") if kind == "attr" else style store = store or {} if ctype == "checkbox": if name not in store: return bool(control.get("default", False)) return store[name] not in (None, "", control.get("false_value")) if ctype == "slider": raw = store.get(name) if raw is None: return control.get("default", 0) try: return float(str(raw).replace(control.get("unit", ""), "").strip() or 0) except ValueError: return control.get("default", 0) return store.get(name, control.get("default", ""))