""" UI 事件处理器 - 处理用户交互和输入验证 """ import random import re import gradio as gr from algorithm import build_payload MAX_DEMO_LEN = 20 def parse_bits(text: str, name: str) -> list[int]: """ 解析二进制字符串输入 允许 0/1,可以包含逗号和空格 """ cleaned = re.sub(r"[,\s]+", "", (text or "").strip()) if not cleaned: raise gr.Error(f"{name} cannot be empty") if re.search(r"[^01]", cleaned): raise gr.Error(f"{name} must contain only 0/1 (spaces or commas allowed)") return [int(c) for c in cleaned] def on_demo( q_text: str, k_text: str, v_text: str, line_numbers: dict ) -> tuple[str, str]: """ 处理演示按钮点击事件 验证输入并生成步骤数据 """ q = parse_bits(q_text, "q") k = parse_bits(k_text, "k") v = parse_bits(v_text, "v") if not (len(q) == len(k) == len(v)): raise gr.Error("q, k, v must have the same length") if len(q) > MAX_DEMO_LEN: raise gr.Error(f"For smooth playback, length should be <= {MAX_DEMO_LEN}") return build_payload(q, k, v, line_numbers) def on_random(length: int) -> tuple[str, str, str]: """ 生成随机的 q, k, v 序列 用于演示目的 """ length = max(1, int(length)) q = [random.randint(0, 1) for _ in range(length)] k = [random.randint(0, 1) for _ in range(length)] v = [random.randint(0, 1) for _ in range(length)] return ( "".join(str(x) for x in q), "".join(str(x) for x in k), "".join(str(x) for x in v), )