暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BuildGradle.cs 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using System.IO;
  4. using System.Text;
  5. using System;
  6. public class UniWebViewGradleConfig
  7. {
  8. private UniWebViewGradleNode m_root;
  9. private String m_filePath;
  10. private UniWebViewGradleNode m_curNode;
  11. public UniWebViewGradleNode ROOT
  12. {
  13. get { return m_root; }
  14. }
  15. public UniWebViewGradleConfig(string filePath)
  16. {
  17. string file = File.ReadAllText(filePath);
  18. TextReader reader = new StringReader(file);
  19. m_filePath = filePath;
  20. m_root = new UniWebViewGradleNode("root");
  21. m_curNode = m_root;
  22. StringBuilder str = new StringBuilder();
  23. bool inDoubleQuote = false;
  24. bool inSingleQuote = false;
  25. bool inDollarVariable = false;
  26. while (reader.Peek() > 0)
  27. {
  28. char c = (char)reader.Read();
  29. switch (c)
  30. {
  31. // case '/':
  32. // if (reader.Peek() == '/')
  33. // {
  34. // reader.Read();
  35. // string comment = reader.ReadLine();
  36. // Debug.Log("Comment line: " + comment);
  37. // m_curNode.AppendChildNode(new UniWebViewGradleCommentNode(comment, m_curNode));
  38. // }
  39. // else
  40. // {
  41. // str.Append('/');
  42. // }
  43. // break;
  44. case '\n':
  45. case '\r':
  46. {
  47. var strf = FormatStr(str);
  48. if (!string.IsNullOrEmpty(strf))
  49. {
  50. m_curNode.AppendChildNode(new UniWebViewGradleContentNode(strf, m_curNode));
  51. }
  52. }
  53. inDollarVariable = false;
  54. str = new StringBuilder();
  55. break;
  56. case '\t':
  57. {
  58. var strf = FormatStr(str);
  59. if (!string.IsNullOrEmpty(strf))
  60. {
  61. str.Append(" ");
  62. }
  63. break;
  64. }
  65. case '{':
  66. {
  67. if (inDoubleQuote || inSingleQuote) {
  68. str.Append(c);
  69. break;
  70. }
  71. var n = FormatStr(str);
  72. if (!string.IsNullOrEmpty(n))
  73. {
  74. UniWebViewGradleNode node = new UniWebViewGradleNode(n, m_curNode);
  75. m_curNode.AppendChildNode(node);
  76. m_curNode = node;
  77. }
  78. }
  79. str = new StringBuilder();
  80. break;
  81. case '}':
  82. {
  83. if (inDoubleQuote || inSingleQuote) {
  84. str.Append(c);
  85. break;
  86. }
  87. var strf = FormatStr(str);
  88. if (!string.IsNullOrEmpty(strf))
  89. {
  90. m_curNode.AppendChildNode(new UniWebViewGradleContentNode(strf, m_curNode));
  91. }
  92. m_curNode = m_curNode.PARENT;
  93. }
  94. str = new StringBuilder();
  95. break;
  96. case '\"':
  97. if (inDollarVariable) {
  98. str.Append(c);
  99. break;
  100. }
  101. inDoubleQuote = !inDoubleQuote;
  102. str.Append(c);
  103. break;
  104. case '\'':
  105. if (inDollarVariable) {
  106. str.Append(c);
  107. break;
  108. }
  109. inSingleQuote = !inSingleQuote;
  110. str.Append(c);
  111. break;
  112. case '$':
  113. {
  114. if (inDoubleQuote || inSingleQuote) {
  115. str.Append(c);
  116. break;
  117. }
  118. inDollarVariable = true;
  119. str.Append(c);
  120. break;
  121. }
  122. default:
  123. str.Append(c);
  124. break;
  125. }
  126. }
  127. //Debug.Log("Gradle parse done!");
  128. }
  129. public void Save(string path = null)
  130. {
  131. if (path == null)
  132. path = m_filePath;
  133. File.WriteAllText(path, Print());
  134. //Debug.Log("Gradle parse done! " + path);
  135. }
  136. private string FormatStr(StringBuilder sb)
  137. {
  138. string str = sb.ToString();
  139. str = str.Trim();
  140. return str;
  141. }
  142. public string Print()
  143. {
  144. StringBuilder sb = new StringBuilder();
  145. printNode(sb, m_root, -1);
  146. return sb.ToString();
  147. }
  148. private string GetLevelIndent(int level)
  149. {
  150. if (level <= 0) return "";
  151. StringBuilder sb = new StringBuilder("");
  152. for (int i = 0; i < level; i++)
  153. {
  154. sb.Append('\t');
  155. }
  156. return sb.ToString();
  157. }
  158. private void printNode(StringBuilder stringBuilder, UniWebViewGradleNode node, int level)
  159. {
  160. if (node.PARENT != null)
  161. {
  162. if (node is UniWebViewGradleCommentNode)
  163. {
  164. stringBuilder.Append("\n" + GetLevelIndent(level) + @"//" + node.NAME);
  165. }
  166. else
  167. {
  168. stringBuilder.Append("\n" + GetLevelIndent(level) + node.NAME);
  169. }
  170. }
  171. if (!(node is UniWebViewGradleContentNode) && !(node is UniWebViewGradleCommentNode))
  172. {
  173. if (node.PARENT != null)
  174. {
  175. stringBuilder.Append(" {");
  176. }
  177. foreach (var c in node.CHILDREN)
  178. {
  179. printNode(stringBuilder, c, level + 1);
  180. }
  181. if (node.PARENT != null)
  182. {
  183. stringBuilder.Append("\n" + GetLevelIndent(level) + "}");
  184. }
  185. }
  186. }
  187. }
  188. public class UniWebViewGradleNode
  189. {
  190. protected List<UniWebViewGradleNode> m_children = new List<UniWebViewGradleNode>();
  191. protected UniWebViewGradleNode m_parent;
  192. protected String m_name;
  193. public UniWebViewGradleNode PARENT
  194. {
  195. get { return m_parent; }
  196. }
  197. public string NAME
  198. {
  199. get { return m_name; }
  200. }
  201. public List<UniWebViewGradleNode> CHILDREN
  202. {
  203. get { return m_children; }
  204. }
  205. public UniWebViewGradleNode(string name, UniWebViewGradleNode parent = null)
  206. {
  207. m_parent = parent;
  208. m_name = name;
  209. }
  210. public void Each(Action<UniWebViewGradleNode> f)
  211. {
  212. f(this);
  213. foreach (var n in m_children)
  214. {
  215. n.Each(f);
  216. }
  217. }
  218. public void AppendChildNode(UniWebViewGradleNode node)
  219. {
  220. if (m_children == null) m_children = new List<UniWebViewGradleNode>();
  221. m_children.Add(node);
  222. node.m_parent = this;
  223. }
  224. public UniWebViewGradleNode TryGetNode(string path)
  225. {
  226. string[] subpath = path.Split('/');
  227. UniWebViewGradleNode cnode = this;
  228. for (int i = 0; i < subpath.Length; i++)
  229. {
  230. var p = subpath[i];
  231. if (string.IsNullOrEmpty(p)) continue;
  232. UniWebViewGradleNode tnode = cnode.FindChildNodeByName(p);
  233. if (tnode == null)
  234. {
  235. Debug.Log("Can't find Node:" + p);
  236. return null;
  237. }
  238. cnode = tnode;
  239. tnode = null;
  240. }
  241. return cnode;
  242. }
  243. public UniWebViewGradleNode FindChildNodeByName(string name)
  244. {
  245. foreach (var n in m_children)
  246. {
  247. if (n is UniWebViewGradleCommentNode || n is UniWebViewGradleContentNode)
  248. continue;
  249. if (n.NAME == name)
  250. return n;
  251. }
  252. return null;
  253. }
  254. public bool ReplaceContenStartsWith(string patten, string value)
  255. {
  256. foreach (var n in m_children)
  257. {
  258. if (!(n is UniWebViewGradleContentNode)) continue;
  259. if (n.m_name.StartsWith(patten))
  260. {
  261. n.m_name = value;
  262. return true;
  263. }
  264. }
  265. return false;
  266. }
  267. public UniWebViewGradleContentNode ReplaceContenOrAddStartsWith(string patten, string value)
  268. {
  269. foreach (var n in m_children)
  270. {
  271. if (!(n is UniWebViewGradleContentNode)) continue;
  272. if (n.m_name.StartsWith(patten))
  273. {
  274. n.m_name = value;
  275. return (UniWebViewGradleContentNode)n;
  276. }
  277. }
  278. return AppendContentNode(value);
  279. }
  280. /// <summary>
  281. /// 添加子节点
  282. /// </summary>
  283. /// <param name="content"></param>
  284. /// <returns></returns>
  285. public UniWebViewGradleContentNode AppendContentNode(string content)
  286. {
  287. foreach (var n in m_children)
  288. {
  289. if (!(n is UniWebViewGradleContentNode)) continue;
  290. if (n.m_name == content)
  291. {
  292. Debug.Log("UniWebViewGradleContentNode with " + content + " already exists!");
  293. return null;
  294. }
  295. }
  296. UniWebViewGradleContentNode cnode = new UniWebViewGradleContentNode(content, this);
  297. AppendChildNode(cnode);
  298. return cnode;
  299. }
  300. public bool RemoveContentNode(string contentPattern)
  301. {
  302. for(int i=0;i<m_children.Count;i++)
  303. {
  304. if (!(m_children[i] is UniWebViewGradleContentNode)) continue;
  305. if(m_children[i].m_name.Contains(contentPattern))
  306. {
  307. m_children.RemoveAt(i);
  308. return true;
  309. }
  310. }
  311. return false;
  312. }
  313. }
  314. public sealed class UniWebViewGradleContentNode : UniWebViewGradleNode
  315. {
  316. public UniWebViewGradleContentNode(String content, UniWebViewGradleNode parent) : base(content, parent)
  317. {
  318. }
  319. public void SetContent(string content)
  320. {
  321. m_name = content;
  322. }
  323. }
  324. public sealed class UniWebViewGradleCommentNode : UniWebViewGradleNode
  325. {
  326. public UniWebViewGradleCommentNode(String content, UniWebViewGradleNode parent) : base(content, parent)
  327. {
  328. }
  329. public string GetComment()
  330. {
  331. return m_name;
  332. }
  333. }