427 lines
12 KiB
C#
427 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
namespace FairyGUI.Utils
|
|
{
|
|
/// <summary>
|
|
/// A simplest and readonly XML class
|
|
/// </summary>
|
|
public class XML
|
|
{
|
|
public string name;
|
|
public string text;
|
|
|
|
Dictionary<string, string> _attributes;
|
|
XMLList _children;
|
|
|
|
public static XML Create(string tag)
|
|
{
|
|
XML xml = new XML();
|
|
xml.name = tag;
|
|
return xml;
|
|
}
|
|
|
|
public XML(string XmlString)
|
|
{
|
|
Parse(XmlString);
|
|
}
|
|
|
|
private XML()
|
|
{
|
|
}
|
|
|
|
public Dictionary<string, string> attributes
|
|
{
|
|
get
|
|
{
|
|
if (_attributes == null)
|
|
_attributes = new Dictionary<string, string>();
|
|
return _attributes;
|
|
}
|
|
}
|
|
|
|
public bool HasAttribute(string attrName)
|
|
{
|
|
if (_attributes == null)
|
|
return false;
|
|
|
|
return _attributes.ContainsKey(attrName);
|
|
}
|
|
|
|
public string GetAttribute(string attrName)
|
|
{
|
|
return GetAttribute(attrName, null);
|
|
}
|
|
|
|
public string GetAttribute(string attrName, string defValue)
|
|
{
|
|
if (_attributes == null)
|
|
return defValue;
|
|
|
|
string ret;
|
|
if (_attributes.TryGetValue(attrName, out ret))
|
|
return ret;
|
|
else
|
|
return defValue;
|
|
}
|
|
|
|
public int GetAttributeInt(string attrName)
|
|
{
|
|
return GetAttributeInt(attrName, 0);
|
|
}
|
|
|
|
public int GetAttributeInt(string attrName, int defValue)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value == null || value.Length == 0)
|
|
return defValue;
|
|
|
|
int ret;
|
|
if (int.TryParse(value, out ret))
|
|
return ret;
|
|
else
|
|
return defValue;
|
|
}
|
|
|
|
public float GetAttributeFloat(string attrName)
|
|
{
|
|
return GetAttributeFloat(attrName, 0);
|
|
}
|
|
|
|
public float GetAttributeFloat(string attrName, float defValue)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value == null || value.Length == 0)
|
|
return defValue;
|
|
|
|
float ret;
|
|
if (float.TryParse(value, out ret))
|
|
return ret;
|
|
else
|
|
return defValue;
|
|
}
|
|
|
|
public bool GetAttributeBool(string attrName)
|
|
{
|
|
return GetAttributeBool(attrName, false);
|
|
}
|
|
|
|
public bool GetAttributeBool(string attrName, bool defValue)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value == null || value.Length == 0)
|
|
return defValue;
|
|
|
|
bool ret;
|
|
if (bool.TryParse(value, out ret))
|
|
return ret;
|
|
else
|
|
return defValue;
|
|
}
|
|
|
|
public string[] GetAttributeArray(string attrName)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value != null)
|
|
{
|
|
if (value.Length == 0)
|
|
return new string[] { };
|
|
else
|
|
return value.Split(',');
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
|
|
public string[] GetAttributeArray(string attrName, char seperator)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value != null)
|
|
{
|
|
if (value.Length == 0)
|
|
return new string[] { };
|
|
else
|
|
return value.Split(seperator);
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
|
|
public Color GetAttributeColor(string attrName, Color defValue)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value == null || value.Length == 0)
|
|
return defValue;
|
|
|
|
return ToolSet.ConvertFromHtmlColor(value);
|
|
}
|
|
|
|
public Vector2 GetAttributeVector(string attrName)
|
|
{
|
|
string value = GetAttribute(attrName);
|
|
if (value != null)
|
|
{
|
|
string[] arr = value.Split(',');
|
|
return new Vector2(float.Parse(arr[0]), float.Parse(arr[1]));
|
|
}
|
|
else
|
|
return Vector2.zero;
|
|
}
|
|
|
|
public void SetAttribute(string attrName, string attrValue)
|
|
{
|
|
if (_attributes == null)
|
|
_attributes = new Dictionary<string, string>();
|
|
|
|
_attributes[attrName] = attrValue;
|
|
}
|
|
|
|
public void SetAttribute(string attrName, bool attrValue)
|
|
{
|
|
if (_attributes == null)
|
|
_attributes = new Dictionary<string, string>();
|
|
|
|
_attributes[attrName] = attrValue ? "true" : "false";
|
|
}
|
|
|
|
public void SetAttribute(string attrName, int attrValue)
|
|
{
|
|
if (_attributes == null)
|
|
_attributes = new Dictionary<string, string>();
|
|
|
|
_attributes[attrName] = attrValue.ToString();
|
|
}
|
|
|
|
public void SetAttribute(string attrName, float attrValue)
|
|
{
|
|
if (_attributes == null)
|
|
_attributes = new Dictionary<string, string>();
|
|
|
|
_attributes[attrName] = string.Format("{0:0.####}", attrValue);
|
|
}
|
|
|
|
public void RemoveAttribute(string attrName)
|
|
{
|
|
if (_attributes != null)
|
|
_attributes.Remove(attrName);
|
|
}
|
|
|
|
public XML GetNode(string selector)
|
|
{
|
|
if (_children == null)
|
|
return null;
|
|
else
|
|
return _children.Find(selector);
|
|
}
|
|
|
|
public XMLList elements
|
|
{
|
|
get
|
|
{
|
|
if (_children == null)
|
|
_children = new XMLList();
|
|
return _children;
|
|
}
|
|
}
|
|
|
|
public XMLList Elements()
|
|
{
|
|
if (_children == null)
|
|
_children = new XMLList();
|
|
return _children;
|
|
}
|
|
|
|
public XMLList Elements(string selector)
|
|
{
|
|
if (_children == null)
|
|
_children = new XMLList();
|
|
return _children.Filter(selector);
|
|
}
|
|
|
|
public XMLList.Enumerator GetEnumerator()
|
|
{
|
|
if (_children == null)
|
|
return new XMLList.Enumerator(null, null);
|
|
else
|
|
return new XMLList.Enumerator(_children.rawList, null);
|
|
}
|
|
|
|
public XMLList.Enumerator GetEnumerator(string selector)
|
|
{
|
|
if (_children == null)
|
|
return new XMLList.Enumerator(null, selector);
|
|
else
|
|
return new XMLList.Enumerator(_children.rawList, selector);
|
|
}
|
|
|
|
public void AppendChild(XML child)
|
|
{
|
|
this.elements.Add(child);
|
|
}
|
|
|
|
public void RemoveChild(XML child)
|
|
{
|
|
if (_children == null)
|
|
return;
|
|
|
|
this._children.rawList.Remove(child);
|
|
}
|
|
|
|
public void RemoveChildren(string selector)
|
|
{
|
|
if (_children == null)
|
|
return;
|
|
|
|
if (string.IsNullOrEmpty(selector))
|
|
_children.Clear();
|
|
else
|
|
_children.RemoveAll(selector);
|
|
}
|
|
|
|
static Stack<XML> sNodeStack = new Stack<XML>();
|
|
public void Parse(string aSource)
|
|
{
|
|
Reset();
|
|
|
|
XML lastOpenNode = null;
|
|
sNodeStack.Clear();
|
|
|
|
XMLIterator.Begin(aSource);
|
|
while (XMLIterator.NextTag())
|
|
{
|
|
if (XMLIterator.tagType == XMLTagType.Start || XMLIterator.tagType == XMLTagType.Void)
|
|
{
|
|
XML childNode;
|
|
if (lastOpenNode != null)
|
|
childNode = new XML();
|
|
else
|
|
{
|
|
if (this.name != null)
|
|
{
|
|
Reset();
|
|
throw new Exception("Invalid xml format - no root node.");
|
|
}
|
|
childNode = this;
|
|
}
|
|
|
|
childNode.name = XMLIterator.tagName;
|
|
childNode._attributes = XMLIterator.GetAttributes(childNode._attributes);
|
|
|
|
if (lastOpenNode != null)
|
|
{
|
|
if (XMLIterator.tagType != XMLTagType.Void)
|
|
sNodeStack.Push(lastOpenNode);
|
|
if (lastOpenNode._children == null)
|
|
lastOpenNode._children = new XMLList();
|
|
lastOpenNode._children.Add(childNode);
|
|
}
|
|
if (XMLIterator.tagType != XMLTagType.Void)
|
|
lastOpenNode = childNode;
|
|
}
|
|
else if (XMLIterator.tagType == XMLTagType.End)
|
|
{
|
|
if (lastOpenNode == null || lastOpenNode.name != XMLIterator.tagName)
|
|
{
|
|
Reset();
|
|
throw new Exception("Invalid xml format - <" + XMLIterator.tagName + "> dismatched.");
|
|
}
|
|
|
|
if (lastOpenNode._children == null || lastOpenNode._children.Count == 0)
|
|
{
|
|
lastOpenNode.text = XMLIterator.GetText();
|
|
}
|
|
|
|
if (sNodeStack.Count > 0)
|
|
lastOpenNode = sNodeStack.Pop();
|
|
else
|
|
lastOpenNode = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
if (_attributes != null)
|
|
_attributes.Clear();
|
|
if (_children != null)
|
|
_children.Clear();
|
|
this.text = null;
|
|
}
|
|
|
|
public string ToXMLString(bool includeHeader)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
if (includeHeader)
|
|
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
|
|
ToXMLString(sb, 0);
|
|
return sb.ToString();
|
|
}
|
|
|
|
void ToXMLString(StringBuilder sb, int tabs)
|
|
{
|
|
if (tabs > 0)
|
|
sb.Append(' ', tabs * 2);
|
|
|
|
if (name == "!")
|
|
{
|
|
sb.Append("<!--");
|
|
if (text != null)
|
|
{
|
|
int c = sb.Length;
|
|
sb.Append(text);
|
|
XMLUtils.EncodeString(sb, c);
|
|
}
|
|
sb.Append("-->");
|
|
return;
|
|
}
|
|
|
|
sb.Append('<').Append(name);
|
|
if (_attributes != null)
|
|
{
|
|
foreach (KeyValuePair<string, string> kv in _attributes)
|
|
{
|
|
sb.Append(' ');
|
|
sb.Append(kv.Key).Append('=').Append('\"');
|
|
int c = sb.Length;
|
|
sb.Append(kv.Value);
|
|
XMLUtils.EncodeString(sb, c, true);
|
|
sb.Append("\"");
|
|
}
|
|
}
|
|
|
|
int numChildren = _children != null ? _children.Count : 0;
|
|
|
|
if (string.IsNullOrEmpty(text) && numChildren == 0)
|
|
sb.Append("/>");
|
|
else
|
|
{
|
|
sb.Append('>');
|
|
|
|
if (!string.IsNullOrEmpty(text))
|
|
{
|
|
int c = sb.Length;
|
|
sb.Append(text);
|
|
XMLUtils.EncodeString(sb, c);
|
|
}
|
|
|
|
if (numChildren > 0)
|
|
{
|
|
sb.Append('\n');
|
|
int ctabs = tabs + 1;
|
|
for (int i = 0; i < numChildren; i++)
|
|
{
|
|
_children[i].ToXMLString(sb, ctabs);
|
|
sb.Append('\n');
|
|
}
|
|
|
|
if (tabs > 0)
|
|
sb.Append(' ', tabs * 2);
|
|
}
|
|
|
|
sb.Append("</").Append(name).Append(">");
|
|
}
|
|
}
|
|
}
|
|
} |