LabelUtility.cs 7.9 KB

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