同步
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7618f0095ebe6fa4682bb08f74cd7c47
|
||||
Reference in New Issue
Block a user