NLDClient-yudde/ProjectNLD/Assets/ThirdParty/UniWebView/Editor/BuildGradle.cs

347 lines
9.9 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
using System;
public class UniWebViewGradleConfig
{
private readonly string m_filePath;
public UniWebViewGradleNode Root { get; }
public UniWebViewGradleConfig(string filePath)
{
var file = File.ReadAllText(filePath);
TextReader reader = new StringReader(file);
m_filePath = filePath;
Root = new UniWebViewGradleNode("root");
var curNode = Root;
var str = new StringBuilder();
var inDoubleQuote = false;
var inSingleQuote = false;
var inDollarVariable = false;
while (reader.Peek() > 0)
{
char c = (char)reader.Read();
switch (c)
{
// case '/':
// if (reader.Peek() == '/')
// {
// reader.Read();
// string comment = reader.ReadLine();
// Debug.Log("Comment line: " + comment);
// curNode.AppendChildNode(new UniWebViewGradleCommentNode(comment, curNode));
// }
// else
// {
// str.Append('/');
// }
// break;
case '\n':
case '\r':
{
var strf = FormatStr(str);
if (!string.IsNullOrEmpty(strf))
{
curNode.AppendChildNode(new UniWebViewGradleContentNode(strf, curNode));
}
}
inDollarVariable = false;
str = new StringBuilder();
break;
case '\t':
{
var strf = FormatStr(str);
if (!string.IsNullOrEmpty(strf))
{
str.Append(" ");
}
break;
}
case '{':
{
if (inDoubleQuote || inSingleQuote) {
str.Append(c);
break;
}
var n = FormatStr(str);
if (!string.IsNullOrEmpty(n))
{
UniWebViewGradleNode node = new UniWebViewGradleNode(n, curNode);
curNode.AppendChildNode(node);
curNode = node;
}
}
str = new StringBuilder();
break;
case '}':
{
if (inDoubleQuote || inSingleQuote) {
str.Append(c);
break;
}
var strf = FormatStr(str);
if (!string.IsNullOrEmpty(strf))
{
curNode.AppendChildNode(new UniWebViewGradleContentNode(strf, curNode));
}
curNode = curNode.Parent;
}
str = new StringBuilder();
break;
case '\"':
if (inDollarVariable) {
str.Append(c);
break;
}
inDoubleQuote = !inDoubleQuote;
str.Append(c);
break;
case '\'':
if (inDollarVariable) {
str.Append(c);
break;
}
inSingleQuote = !inSingleQuote;
str.Append(c);
break;
case '$':
{
if (inDoubleQuote || inSingleQuote) {
str.Append(c);
break;
}
inDollarVariable = true;
str.Append(c);
break;
}
default:
str.Append(c);
break;
}
}
// End of file.
var endline = FormatStr(str);
if (!string.IsNullOrEmpty(endline))
{
curNode.AppendChildNode(new UniWebViewGradleContentNode(endline, curNode));
}
//Debug.Log("Gradle parse done!");
}
public void Save(string path = null)
{
if (path == null) {
path = m_filePath;
}
File.WriteAllText(path, Print());
}
private static string FormatStr(StringBuilder sb)
{
var str = sb.ToString();
str = str.Trim();
return str;
}
public string Print()
{
StringBuilder sb = new StringBuilder();
PrintNode(sb, Root, -1);
// Remove the first empty line.
sb.Remove(0, 1);
return sb.ToString();
}
private string GetLevelIndent(int level)
{
if (level <= 0) return "";
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < level; i++)
{
sb.Append('\t');
}
return sb.ToString();
}
private void PrintNode(StringBuilder stringBuilder, UniWebViewGradleNode node, int level)
{
if (node.Parent != null) {
if (node is UniWebViewGradleCommentNode)
{
stringBuilder.Append("\n" + GetLevelIndent(level) + @"//" + node.Name);
}
else
{
stringBuilder.Append("\n" + GetLevelIndent(level) + node.Name);
}
}
if (node is UniWebViewGradleContentNode || node is UniWebViewGradleCommentNode) return;
if (node.Parent != null) {
stringBuilder.Append(" {");
}
foreach (var c in node.Children) {
PrintNode(stringBuilder, c, level + 1);
}
if (node.Parent != null) {
stringBuilder.Append("\n" + GetLevelIndent(level) + "}");
}
}
}
public class UniWebViewGradleNode
{
protected string m_name;
public UniWebViewGradleNode Parent { get; private set; }
public string Name => m_name;
public List<UniWebViewGradleNode> Children { get; private set; } = new List<UniWebViewGradleNode>();
public UniWebViewGradleNode(string name, UniWebViewGradleNode parent = null)
{
Parent = parent;
m_name = name;
}
public void Each(Action<UniWebViewGradleNode> f)
{
f(this);
foreach (var n in Children)
{
n.Each(f);
}
}
public void AppendChildNode(UniWebViewGradleNode node)
{
if (Children == null) Children = new List<UniWebViewGradleNode>();
Children.Add(node);
node.Parent = this;
}
public UniWebViewGradleNode TryGetNode(string path)
{
var subpath = path.Split('/');
var cnode = this;
foreach (var p in subpath)
{
if (string.IsNullOrEmpty(p)) continue;
var tnode = cnode.FindChildNodeByName(p);
if (tnode == null)
{
Debug.Log("Can't find Node:" + p);
return null;
}
cnode = tnode;
}
return cnode;
}
public UniWebViewGradleNode FindChildNodeByName(string name)
{
foreach (var n in Children)
{
if (n is UniWebViewGradleCommentNode || n is UniWebViewGradleContentNode)
continue;
if (n.Name == name)
return n;
}
return null;
}
public bool ReplaceContentStartsWith(string pattern, string value)
{
foreach (var n in Children)
{
if (!(n is UniWebViewGradleContentNode)) continue;
if (n.m_name.StartsWith(pattern))
{
n.m_name = value;
return true;
}
}
return false;
}
public UniWebViewGradleContentNode ReplaceContentOrAddStartsWith(string pattern, string value)
{
foreach (var n in Children)
{
if (!(n is UniWebViewGradleContentNode)) continue;
if (n.m_name.StartsWith(pattern))
{
n.m_name = value;
return (UniWebViewGradleContentNode)n;
}
}
return AppendContentNode(value);
}
public UniWebViewGradleContentNode AppendContentNode(string content)
{
foreach (var n in Children)
{
if (!(n is UniWebViewGradleContentNode)) continue;
if (n.m_name == content)
{
Debug.Log("UniWebViewGradleContentNode with " + content + " already exists!");
return null;
}
}
UniWebViewGradleContentNode cnode = new UniWebViewGradleContentNode(content, this);
AppendChildNode(cnode);
return cnode;
}
public bool RemoveContentNode(string contentPattern)
{
for(int i=0;i<Children.Count;i++)
{
if (!(Children[i] is UniWebViewGradleContentNode)) continue;
if(Children[i].m_name.Contains(contentPattern))
{
Children.RemoveAt(i);
return true;
}
}
return false;
}
}
public sealed class UniWebViewGradleContentNode : UniWebViewGradleNode
{
public UniWebViewGradleContentNode(String content, UniWebViewGradleNode parent) : base(content, parent)
{
}
public void SetContent(string content)
{
m_name = content;
}
}
public sealed class UniWebViewGradleCommentNode : UniWebViewGradleNode
{
public UniWebViewGradleCommentNode(String content, UniWebViewGradleNode parent) : base(content, parent)
{
}
public string GetComment()
{
return m_name;
}
}