This commit is contained in:
SoulliesOfficial
2026-06-09 11:21:59 -04:00
parent 7c60c40d6b
commit 021e76efe7
493 changed files with 50500 additions and 2211 deletions

View File

@@ -0,0 +1,67 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Yarn.Unity
{
/// <summary>
/// Yarn 台词 Metadata 标签解析工具。
/// 支持 "key:value" 格式的标签(如 #mood:Happy以及纯标签如 #narrator
/// 可同时解析一句话上的多个不同类型标签。
/// </summary>
public static class YarnTagParser
{
// 匹配 "key:value" 格式key 只允许字母/数字/下划线value 匹配到行尾或空格
private static readonly Regex KeyValuePattern = new Regex(@"^(?<key>[A-Za-z0-9_]+):(?<value>.+)$", RegexOptions.Compiled);
/// <summary>
/// 解析 Yarn line.Metadata 数组,返回所有 "key:value" 标签的字典,
/// 以及所有纯标签(无冒号)的列表。
/// </summary>
/// <param name="metadata">来自 line.Metadata 的字符串数组</param>
/// <param name="keyValueTags">输出:键值对标签,如 mood→Happy、sfx→Explosion</param>
/// <param name="plainTags">输出:纯标签,如 narrator、important</param>
public static void Parse(string[] metadata, out Dictionary<string, string> keyValueTags, out HashSet<string> plainTags)
{
keyValueTags = new Dictionary<string, string>(System.StringComparer.OrdinalIgnoreCase);
plainTags = new HashSet<string>(System.StringComparer.OrdinalIgnoreCase);
if (metadata == null) return;
foreach (var tag in metadata)
{
if (string.IsNullOrWhiteSpace(tag)) continue;
var match = KeyValuePattern.Match(tag.Trim());
if (match.Success)
{
string key = match.Groups["key"].Value;
string value = match.Groups["value"].Value.Trim();
// 同一句话可能有多个同 key 的标签(极少见),后者覆盖前者
keyValueTags[key] = value;
}
else
{
plainTags.Add(tag.Trim());
}
}
}
/// <summary>
/// 快捷方法:获取指定 key 的 value找不到则返回 defaultValue。
/// </summary>
public static string GetValue(string[] metadata, string key, string defaultValue = null)
{
Parse(metadata, out var kvTags, out _);
return kvTags.GetValueOrDefault(key, defaultValue);
}
/// <summary>
/// 快捷方法:检查是否存在某个纯标签(大小写不敏感)。
/// </summary>
public static bool HasPlainTag(string[] metadata, string tag)
{
Parse(metadata, out _, out var plain);
return plain.Contains(tag);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 7618f0095ebe6fa4682bb08f74cd7c47