説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

SearcherHighlighter.cs 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Text.RegularExpressions;
  3. using UnityEngine.UIElements;
  4. namespace UnityEditor.Searcher
  5. {
  6. static class SearcherHighlighter
  7. {
  8. const char k_StartHighlightSeparator = '{';
  9. const char k_EndHighlightSeparator = '}';
  10. const string k_HighlightedStyleClassName = "Highlighted";
  11. public static void HighlightTextBasedOnQuery(VisualElement container, string text, string query)
  12. {
  13. var formattedText = text;
  14. var queryParts = query.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
  15. var regex = string.Empty;
  16. for (var index = 0; index < queryParts.Length; index++)
  17. {
  18. var queryPart = queryParts[index];
  19. regex += $"({Regex.Escape(queryPart)})";
  20. if (index < queryParts.Length - 1)
  21. regex += "|";
  22. }
  23. var matches = Regex.Matches(formattedText, regex, RegexOptions.IgnoreCase);
  24. foreach (Match match in matches)
  25. {
  26. formattedText = formattedText.Replace(match.Value,
  27. $"{k_StartHighlightSeparator}{match.Value}{k_EndHighlightSeparator}");
  28. }
  29. BuildHighlightLabels(container, formattedText);
  30. }
  31. static void BuildHighlightLabels(VisualElement container, string formattedHighlightText)
  32. {
  33. if (string.IsNullOrEmpty(formattedHighlightText))
  34. return;
  35. var substring = string.Empty;
  36. var highlighting = false;
  37. var skipCount = 0;
  38. foreach (var character in formattedHighlightText.ToCharArray())
  39. {
  40. switch (character)
  41. {
  42. // Skip embedded separators
  43. // Ex:
  44. // Query: middle e
  45. // Text: Middle Eastern
  46. // Formatted Text: {Middl{e}} {E}ast{e}rn
  47. // ^ ^
  48. case k_StartHighlightSeparator when highlighting:
  49. skipCount++;
  50. continue;
  51. case k_StartHighlightSeparator: {
  52. highlighting = true;
  53. if (!string.IsNullOrEmpty(substring))
  54. {
  55. container.Add(new Label(substring));
  56. substring = string.Empty;
  57. }
  58. continue;
  59. }
  60. case k_EndHighlightSeparator when skipCount > 0:
  61. skipCount--;
  62. continue;
  63. case k_EndHighlightSeparator: {
  64. var label = new Label(substring);
  65. label.AddToClassList(k_HighlightedStyleClassName);
  66. container.Add(label);
  67. highlighting = false;
  68. substring = string.Empty;
  69. continue;
  70. }
  71. default:
  72. substring += character;
  73. break;
  74. }
  75. }
  76. if (!string.IsNullOrEmpty(substring))
  77. {
  78. var label = new Label(substring);
  79. if (highlighting)
  80. label.AddToClassList(k_HighlightedStyleClassName);
  81. container.Add(label);
  82. }
  83. }
  84. }
  85. }