"""JS 字面量 → Python 对象。 米哈游活动页把骨架数据与场景树以 **JS 对象字面量** 内联在 bundle 里,不是合法 JSON: {skeleton:{hash:"KR8Ibf8DXTI",spine:"4.2.43",x:-110.93},bones:[{name:"root"}],scaleX:.6487} 键不带引号、小数可以省略前导 0、布尔写作 ``!0`` / ``!1``、末尾可以有逗号。 这里只做**词法层**的规范化(把字面量改写成 JSON 文本),再交给 ``json.loads``—— 不 ``eval``、不执行页面代码。 唯一被容忍的"语义"是未知裸标识符(例如 ``undefined``):默认替换为 ``null`` 并计数, ``strict=True`` 时抛错。骨架数据里出现别的裸标识符说明提取边界错了,值得知道。 """ from __future__ import annotations import json import re from typing import Any __all__ = ["loads", "match_literal", "first_object_value", "unescape", "JsLitError"] # 按优先级排列的词法单元。字符串/数字/``!0`` 必须排在 ``other`` 之前。 _TOKEN = re.compile( r""" (?P\s+) | (?P"(?:[^"\\]|\\.)*") | (?P'(?:[^'\\]|\\.)*') | (?P