using System.Text.RegularExpressions;
namespace SLSUtilities.UI
{
///
/// 将文本中的 [Token] 标记替换为 TMP <sprite> 富文本标签,
/// 用于在 TMP_Text 中内联显示按键图标。
///
/// Token 支持两种形式:
///
/// - 直接按键名:[Q]、[LMB]、[ArrowDown] — 直接映射到 SpriteAsset 中的 sprite name
/// - Input Action 名:[Interact]、[MainWeaponPrimary] — 通过
/// 解析为当前绑定的按键 glyph token(需先调用 )
///
/// 语法示例:
///
/// - [Q]+[RMB] → Q 键 + 右键图标(+ 作为普通文本保留)
/// - Hold [E] → "Hold " 为普通文本,E 键为图标
/// - 按 [Interact] 拾取 → 自动解析为当前绑定的按键图标
///
///
///
public static class InputGlyphParser
{
/// 默认关联的 TMP SpriteAsset 名称。
public const string DefaultSpriteAsset = "InputGlyphs";
///
/// 匹配 [Token] 模式。
/// \w+ 涵盖字母、数字、下划线,足以覆盖所有 Token 名(Q, LMB, ArrowDown, F12, Interact 等)。
///
private static readonly Regex TokenPattern =
new Regex(@"\[(\w+)\]", RegexOptions.Compiled);
///
/// 将文本中的 [Token] 标记解析为 TMP sprite 富文本标签。
/// 如果 已初始化,Token 会先尝试解析为 Action 名对应的按键。
///
///
/// 原始文本,可包含 [Token] 标记。
/// 例如 "[Q]+[RMB]"、"Hold [E]"、"按 [Interact] 拾取"。
///
///
/// 要引用的 TMP SpriteAsset 名称。
/// 传入 null 或空字符串时,生成不指定 asset 的短格式标签
/// (需在 TMP Settings 中配置默认 Sprite Asset)。
///
/// 替换后的富文本字符串。输入为 null 或空时原样返回。
public static string Parse(string rawText, string spriteAssetName = DefaultSpriteAsset)
{
if (string.IsNullOrEmpty(rawText))
return rawText;
bool useResolver = InputBindingResolver.IsInitialized;
bool hasAssetName = !string.IsNullOrEmpty(spriteAssetName);
return TokenPattern.Replace(rawText, match =>
{
string token = match.Groups[1].Value;
// 通过 InputBindingResolver 解析 Action 名 → glyph token
string resolvedToken = useResolver
? InputBindingResolver.ResolveToken(token)
: token;
return hasAssetName
? $""
: $"";
});
}
///
/// 检查文本是否包含任何 [Token] 标记。
///
public static bool ContainsGlyphs(string text)
{
return !string.IsNullOrEmpty(text) && TokenPattern.IsMatch(text);
}
}
}