using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace BFEditor.Resource { public struct LuaCheckResult { public string content; public string path; public string line; } public static class LuaCheckController { private static string luaDir = Application.dataPath + "/Developer/lua"; private static string excludeDir = Application.dataPath + "/Developer/lua/app/config"; private const char DOUBLE_QUOTES = '"'; private const char SINGLE_QUOTE = '\''; public static List ResultList = new List(); // private static Regex reg = new Regex(@".*[\u4e00-\u9fa5]+"); // 汉字 private static Regex reg = new Regex(@".*[\u0391-\uffe5]+"); //双字节字符(汉字+符号) private static HashSet ExcludeFileName = new HashSet { "first_text.lua", "gm_const.lua", "dev_tool_list_ui.lua", "gm_tool_ui.lua" }; public static void CheckAll(Action checkOverAction) { Clear(); DirectoryInfo dir = new DirectoryInfo(luaDir); FileInfo[] files = dir.GetFiles("*.lua", SearchOption.AllDirectories); for (var i = 0; i < files.Length; ++i) { FileInfo fileInfo = files[i]; //跳过系统文件和隐藏文件 if (((fileInfo.Attributes & FileAttributes.Hidden) > 0) || ((fileInfo.Attributes & FileAttributes.System) > 0)) { continue; } if (fileInfo.DirectoryName.Replace("\\", "/").Contains(excludeDir)) { continue; } if (ExcludeFileName.Contains(fileInfo.Name)) { continue; } using (StreamReader sr = new StreamReader(fileInfo.FullName)) { string lineContent; int lineNum = 0; while ((lineContent = sr.ReadLine()) != null) { lineNum++; var content = lineContent.Trim(); if (content.StartsWith("--")) { continue; } Match match; int index = content.IndexOf("--"); if(index >= 0) { var validContent = content.Substring(0, index); if( (GetQuoteCount(validContent) & 1) == 0) // 偶数 { match = reg.Match(validContent); } else { match = reg.Match(content); } } else { match = reg.Match(content); } if (match != Match.Empty) { index = content.IndexOf("Logger.log"); if (index < 0) { LuaCheckResult checkResult; checkResult.content = content; checkResult.line = string.Format("第{0}行:", lineNum); checkResult.path = fileInfo.FullName; ResultList.Add(checkResult); } } } } } if (checkOverAction != null) checkOverAction(ResultList.Count == 0); } public static int GetQuoteCount(string str) { int count = 0; for(int i = 0; i < str.Length; i++) { if(str[i] == SINGLE_QUOTE || str[i] == DOUBLE_QUOTES) { count++; } } return count; } public static void Clear() { ResultList.Clear(); } } }