private static SearchItem ProcessLine(string line, string searchQuery, SearchProvider provider) { line = line.Trim(); var m = essRx.Match(line); var filePath = m.Groups[1].Value.Replace("\\", "/"); var essmi = new ESSMatchInfo { path = filePath.Replace(Application.dataPath, "Assets").Replace("\\", "/"), lineNumber = int.Parse(m.Groups[2].Value), content = m.Groups[3].Value }; var fsq = searchQuery.Replace("*", ""); var content = Regex.Replace(essmi.content, fsq, "<color=#FFFF00>" + fsq + "</color>", RegexOptions.IgnoreCase); var description = $"{essmi.path} (<b>{essmi.lineNumber}</b>)"; return(provider.CreateItem(essmi.content.GetHashCode().ToString(), content, description, null, essmi)); }
internal static SearchProvider CreateProvider() { if (!File.Exists(ess_exe)) { return(null); } return(new SearchProvider(type, displayName) { priority = 7000, filterId = "ess:", fetchItems = (context, items, provider) => { if (s_BuildingIndex) { return; } if (context.sendAsyncItems == null) { return; } if (s_SearchThread != null && s_SearchThread.IsAlive) { s_StopEvent.Set(); if (!s_SearchThread.Join(100)) { s_SearchThread.Abort(); } } var localSearchId = context.searchId; var localSearchQuery = context.searchQuery; var localIndexPath = indexPath; var localDataPath = Application.dataPath; var localSendItemsCallback = context.sendAsyncItems; s_StopEvent.Reset(); s_SearchThread = new Thread(() => { var result = RunESS("search", ParamValueString("index", localIndexPath), localSearchQuery); if (result.code != 0) { return; } var entries = result.output.Split('\n').Where(line => line.Trim().Length > 0); var asyncItems = entries.Select(line => { var m = essRx.Match(line); var filePath = m.Groups[1].Value.Replace("\\", "/"); var essmi = new ESSMatchInfo { path = filePath.Replace(localDataPath, "Assets").Replace("\\", "/"), lineNumber = int.Parse(m.Groups[2].Value), content = m.Groups[3].Value }; var fsq = localSearchQuery.Replace("*", ""); var content = Regex.Replace(essmi.content, fsq, "<color=#FFFF00>" + fsq + "</color>", RegexOptions.IgnoreCase); var description = $"{essmi.path} (<b>{essmi.lineNumber}</b>)"; return provider.CreateItem(essmi.content.GetHashCode().ToString(), content, description, null, essmi); }).ToArray(); if (asyncItems.Length > 0) { localSendItemsCallback(localSearchId, asyncItems); } }); s_SearchThread.Start(); }, fetchThumbnail = (item, context) => { if (item.data == null) { return null; } if (item.thumbnail) { return item.thumbnail; } var essmi = (ESSMatchInfo)item.data; item.thumbnail = UnityEditorInternal.InternalEditorUtility.FindIconForFile(essmi.path); return item.thumbnail; } }); }