luban/src/Luban.Job.Common/Source/Utils/DefUtil.cs

187 lines
5.7 KiB
C#

using Bright.Collections;
using Luban.Job.Common.Defs;
using System;
using System.Collections.Generic;
using System.Net;
namespace Luban.Job.Common.Utils
{
public class DefUtil
{
private static readonly char[] s_attrSep = new char[] { '|', '#', '&' };
private static readonly char[] s_attrKeyValueSep = new char[] { '=', ':' };
public static Dictionary<string, string> ParseAttrs(string tags)
{
var am = new Dictionary<string, string>();
if (string.IsNullOrWhiteSpace(tags))
{
return am;
}
foreach (var rawPair in tags.Split(s_attrSep))
{
var pair = TrimBracePairs(rawPair);
int sepIndex = pair.IndexOfAny(s_attrKeyValueSep);
if (sepIndex >= 0)
{
#if !LUBAN_LITE
am.Add(pair[..sepIndex].Trim(), pair[(sepIndex + 1)..].Trim());
#else
am.Add(pair.Substring(0, sepIndex).Trim(), pair.Substring(sepIndex + 1).Trim());
#endif
}
else
{
am.Add(pair.Trim(), pair.Trim());
}
}
return am;
}
public static int IndexOfElementTypeSep(string s)
{
int braceDepth = 0;
for (int i = 0; i < s.Length; i++)
{
var c = s[i];
if (c == '(' || c == '[' || c == '{')
{
++braceDepth;
}
else if (c == ')' || c == ')' || c == '}')
{
--braceDepth;
}
if (braceDepth == 0 && (c == ',' || c == ';'))
{
return i;
}
}
return -1;
}
public static string TrimBracePairs(string rawType)
{
while (rawType.Length > 0 && rawType[0] == '(')
{
if (rawType[rawType.Length - 1] == ')')
{
rawType = rawType.Substring(1, rawType.Length - 2);
}
else
{
throw new Exception($"type:{rawType} brace not match");
}
}
return rawType;
}
public static (string, Dictionary<string, string>) ParseType(string s)
{
int sepIndex = s.IndexOfAny(s_attrSep);
if (sepIndex < 0)
{
return (s, new Dictionary<string, string>());
}
else
{
int braceDepth = 0;
for (int i = 0; i < s.Length; i++)
{
var c = s[i];
if (c == '(' || c == '[' || c == '{')
{
++braceDepth;
}
else if (c == ')' || c == ')' || c == '}')
{
--braceDepth;
}
if (braceDepth == 0 && (c == '#' || c == '&' || c == '|'))
{
return (s.Substring(0, i), ParseAttrs(s.Substring(i + 1)));
}
}
return (s, new Dictionary<string, string>());
}
}
public static bool ParseOrientation(string value)
{
switch (value.Trim())
{
case "":
case "r":
case "row": return true;
case "c":
case "column": return false;
default:
{
throw new Exception($"orientation 属性值只能为row|r|column|c");
}
}
}
public static bool IsNormalFieldName(string name)
{
return !name.StartsWith("__") && !name.StartsWith("#");
}
public static Dictionary<string, string> MergeTags(Dictionary<string, string> tags1, Dictionary<string, string> tags2)
{
if (tags2 != null && tags2.Count > 0)
{
if (tags1 != null)
{
if (tags1.Count == 0)
{
return tags2;
}
else
{
var result = new Dictionary<string, string>(tags1);
result.AddAll(tags2);
return result;
}
}
else
{
return tags2;
}
}
else
{
return tags1;
}
}
public static string EscapeCommentByCurrentLanguage(string comment)
{
var curLan = DefAssemblyBase.LocalAssebmly.CurrentLanguage;
switch (curLan)
{
case ELanguage.INVALID: throw new Exception($"not set current language. can't get recommend naming convention name");
case ELanguage.CS:
case ELanguage.JAVA:
case ELanguage.GO:
case ELanguage.CPP:
case ELanguage.LUA:
case ELanguage.JS:
case ELanguage.TYPESCRIPT:
case ELanguage.PYTHON:
case ELanguage.RUST:
case ELanguage.PROTOBUF:
#if !LUBAN_LITE
return System.Web.HttpUtility.HtmlEncode(comment).Replace("\n", "<br/>");
#else
throw new NotSupportedException();
#endif
default: throw new Exception($"unknown language:{curLan}");
}
}
}
}