""" dashTest.py ← 向下相容 shim -------------------------------- 原始 3443 行已拆分至以下六個模組(均放在同一 layout/ 資料夾下): dt_gemini.py Gemini AI 用戶端 + 批改回饋 dt_math.py 數學運算 + eq_answer dt_render_utils.py 渲染工具(顏色、數學、run 渲染,無 callback) dt_render_blocks.py Block 渲染元件 dt_quiz.py Quiz 題型渲染 dt_callbacks.py 所有 Dash @callback 此 shim 重新匯出所有公開 API,確保現有程式碼不需要修改: from layout.dashTest import render_doc ← 仍可用 from layout.dashTest import install_callbacks_once ← 仍可用 """ # ── Gemini / AI ────────────────────────────────────────────────────────── from .dt_gemini import ( # noqa: F401 _gem_call, _gem_json, _first_json, _s, _get_api_key, _norm_model, _ai_log_fail, _repair_json_newlines, _loads_json_robust, _ai_generate_similar_quizzes_as_md, _parse_ai_md_to_quiz_nodes, _parse_options_md, _ai_feedback_fill_gemini, _ai_feedback_choice_gemini, _ai_feedback_multi_gemini, _prompt_md_to_runs, DEFAULT_NORMALIZE, _gem_client, _API_KEY, ) # ── 數學 ────────────────────────────────────────────────────────────────── from .dt_math import ( # noqa: F401 eq_answer, extract_param_function, extract_k_as_function, _normalize_text, _std_text, _apply_text_ops, _to_sympy, _symbolic_equal, _as_number, _numeric_close, _preprocess_math, _protect_funcs_and_consts, _unprotect, _insert_implicit_mul, x, y, z, k, m, n, c, g, XY, PARAMS, KNOWN_FUNCS, KNOWN_CONST, ) # ── 渲染工具 ────────────────────────────────────────────────────────────── from .dt_render_utils import ( # noqa: F401 HAS_PRISM, DashLatex, DEFAULT_TOL, _norm_hex, _hex_to_hsl, _hsl_to_hex, _to_dark_color, _themed_color_style, _as_css_color, _ensure_theme_colors, _parse_img_hints, _apply_img_size_style, _split_text_links_images, render_url, render_picture, render_inline_media, _strip_math_delims, _render_inline_math, render_math_inline, render_math_block, render_option_label, render_inline_runs, render_runs, _as_bool, _is_true, _runs_to_text_for_prompt, ) # ── Block 渲染 ──────────────────────────────────────────────────────────── from .dt_render_blocks import ( # noqa: F401 render_doc, render_doc_section, build_content_and_toc, render_section_nav, render_paragraph, render_list, render_hr, render_comment, render_heading, render_heading_segment, _plain_text_for_heading, render_card, _merge_card_palette, _CARD_KIND_PALETTE, render_solution, _storage_type, render_flow, _make_flow_step_box, render_geogebra, maybe_render_paragraph_with_geogebra, render_code, render_pycall, _ggb_id_from_url, _px_or_raw, _attrs_to_dict, _load_func_from_path, ) # ── Quiz 渲染 ───────────────────────────────────────────────────────────── from .dt_quiz import ( # noqa: F401 render_quiz, render_quiz_order, _quiz_missing_answer_notice, _feedback_child, ) # ── Callbacks(import 即掛載)──────────────────────────────────────────── from . import dt_callbacks # noqa: F401 from .dt_callbacks import install_callbacks_once # noqa: F401