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.
 
 
 
 

347 line
9.9 KiB

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