LabelUtility.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Xml;
  8. #if UNITY_EDITOR
  9. using UnityEditor;
  10. #endif
  11. using UnityEngine;
  12. using AtlasUtility;
  13. public class LabelUtility : MonoBehaviour
  14. {
  15. #region Config
  16. public TextAsset Script;
  17. public List<TextAsset> Languages;
  18. public List<GameObject> Prefabs;
  19. private static string Mark = "//Mark";
  20. private static string Prefix = "public static string ";
  21. #endregion
  22. public void ClearLabels()
  23. {
  24. if (EditorUtility.DisplayDialog("注意", "清空所有标签?", "确定", "取消"))
  25. {
  26. string path = AssetDatabase.GetAssetPath(Script);
  27. string fileStr = File.ReadAllText(path);
  28. fileStr = Regex.Replace(fileStr, "(?<=\\{)[^\\}]*(?=\\})", $"\r\n\t{Mark}\r\n");
  29. File.WriteAllText(path, fileStr);
  30. }
  31. }
  32. public void CreateLabelFromPrefabs()
  33. {
  34. if (EditorUtility.DisplayDialog("注意", "新建Prefab标签?", "确定", "取消"))
  35. {
  36. StringBuilder stringBuilder = new StringBuilder(Script.text);
  37. foreach (var prefab in Prefabs)
  38. {
  39. CreateLabel(prefab, stringBuilder);
  40. }
  41. string path = AssetDatabase.GetAssetPath(Script);
  42. File.WriteAllText(path, stringBuilder.ToString());
  43. }
  44. }
  45. private void CreateLabel(GameObject prefab, StringBuilder stringBuilder)
  46. {
  47. Transform[] transforms = prefab.GetComponentsInChildren<Transform>(true);
  48. Match match = Regex.Match(stringBuilder.ToString(), Mark);
  49. if (match.Success)
  50. {
  51. stringBuilder.Replace(Mark, "", match.Index, match.Length);
  52. int insertIndex = match.Index + 2;
  53. for (int i = 0; i < transforms.Length; i++)
  54. {
  55. string insertStr = $"\t{Prefix}{transforms[i].name} = \"{transforms[i].name}\";";
  56. stringBuilder.Insert(insertIndex, insertStr);
  57. insertIndex += insertStr.Length;
  58. if (i < transforms.Length - 1)
  59. {
  60. stringBuilder.Insert(insertIndex, "\r\n");
  61. insertIndex += 2;
  62. }
  63. else if (i == transforms.Length - 1)
  64. {
  65. stringBuilder.Insert(insertIndex, $"\r\n\t{Mark}\r\n");
  66. }
  67. }
  68. }
  69. else
  70. {
  71. throw new Exception("没有找到标记");
  72. }
  73. }
  74. public void CreateLabelFromLanguage()
  75. {
  76. if (EditorUtility.DisplayDialog("注意", "新建Language标签?", "确定", "取消"))
  77. {
  78. StringBuilder stringBuilder = new StringBuilder(Script.text);
  79. foreach (var language in Languages)
  80. {
  81. XmlDocument document = new XmlDocument();
  82. document.LoadXml(language.text);
  83. CreateLabelFromLanguageDocument(document, stringBuilder);
  84. }
  85. string path = AssetDatabase.GetAssetPath(Script);
  86. File.WriteAllText(path, stringBuilder.ToString());
  87. }
  88. }
  89. private void CreateLabelFromLanguageDocument(XmlDocument document, StringBuilder stringBuilder)
  90. {
  91. XmlNodeList childNodes = document.SelectSingleNode("lan").ChildNodes;
  92. for (int i = 0; i < childNodes.Count; i++)
  93. {
  94. CreateLabel(childNodes[i], stringBuilder);
  95. }
  96. }
  97. private void CreateLabel(XmlNode node, StringBuilder stringBuilder)
  98. {
  99. Match match = Regex.Match(stringBuilder.ToString(), Mark);
  100. if (match.Success)
  101. {
  102. stringBuilder.Replace(Mark, "", match.Index, match.Length);
  103. int insertIndex = match.Index + 2;
  104. for (int i = 0; i < node.ChildNodes.Count; i++)
  105. {
  106. XmlNode childNode = node.ChildNodes[i];
  107. string insertStr;
  108. if (i == 0)
  109. {
  110. insertStr = $"\t{Prefix}{node.Name} = \"{node.Name}\"\r\n;";
  111. stringBuilder.Insert(insertIndex, insertStr);
  112. insertIndex += insertStr.Length;
  113. }
  114. insertStr = $"\t{Prefix}{node.Name}__{childNode.Name} = \"{node.Name}__{childNode.Name}\";";
  115. stringBuilder.Insert(insertIndex, insertStr);
  116. insertIndex += insertStr.Length;
  117. if (i < node.ChildNodes.Count - 1)
  118. {
  119. stringBuilder.Insert(insertIndex, "\r\n");
  120. insertIndex += 2;
  121. }
  122. else if (i == node.ChildNodes.Count - 1)
  123. {
  124. stringBuilder.Insert(insertIndex, $"\r\n\t{Mark}\r\n");
  125. }
  126. }
  127. }
  128. else
  129. {
  130. throw new Exception("没有找到标记");
  131. }
  132. }
  133. //public void ReplaceLabels()
  134. //{
  135. // Transform[] transforms = Prefabs[0].GetComponentsInChildren<Transform>(true);
  136. // string[] pathes = Directory.GetFiles(Application.dataPath, "*.cs", SearchOption.AllDirectories);
  137. // foreach (var path in pathes)
  138. // {
  139. // if (path.Contains("PrefabLabel"))
  140. // {
  141. // continue;
  142. // }
  143. // string fileStr = File.ReadAllText(path);
  144. // foreach (var transform in transforms)
  145. // {
  146. // if (transform.name == "Canvas")
  147. // {
  148. // continue;
  149. // }
  150. // fileStr = Regex.Replace(fileStr, $"\"{transform.name}\"", $"PrefabLabel.{transform.name}");
  151. // }
  152. // File.WriteAllText(path, fileStr);
  153. // }
  154. //}
  155. //public void TestReplaceLabels()
  156. //{
  157. // Transform[] transforms = Prefabs[0].GetComponentsInChildren<Transform>(true);
  158. // string path = AssetDatabase.GetAssetPath(TextAsset);
  159. // string fileStr = File.ReadAllText(path);
  160. // foreach (var transform in transforms)
  161. // {
  162. // if (transform.name == "Canvas")
  163. // {
  164. // continue;
  165. // }
  166. // fileStr = Regex.Replace(fileStr, $"\"{transform.name}\"", $"PrefabLabel.{transform.name}");
  167. // }
  168. // File.WriteAllText(path, fileStr);
  169. //}
  170. public void ReplaceLanguageLabels()
  171. {
  172. string[] pathes = Directory.GetFiles(Application.dataPath, "*.cs", SearchOption.AllDirectories);
  173. foreach (var path in pathes)
  174. {
  175. ReplaceLanguageLabel(path);
  176. }
  177. }
  178. public void ReplaceLanguageLabel(string path)
  179. {
  180. string fileStr = File.ReadAllText(path);
  181. string pattern = "(?<=Language\\.GetStr\\()[^\\)]+(?=\\))|(?<=MulLanStr\\()[^\\)]+(?=\\))";
  182. Match match = Regex.Match(fileStr, pattern);
  183. while (match.Success)
  184. {
  185. string[] strings = match.Value.Replace(" ", "").Split(',');
  186. if (strings.Length == 1)
  187. {
  188. match = match.NextMatch();
  189. }
  190. else
  191. {
  192. fileStr = fileStr.ReplaceByLength(match.Index, match.Length, $"LanguageLabel.{strings[0].Trim('"')}__{strings[1].Trim('"')}");
  193. match = Regex.Match(fileStr, pattern);
  194. }
  195. }
  196. File.WriteAllText(path, fileStr);
  197. }
  198. }