using System.Collections.Generic; using System.Text; namespace FairyGUI.Utils { /// /// /// public class UBBParser { public static UBBParser inst = new UBBParser(); string _text; int _readPos; public TagHandler defaultTagHandler; public Dictionary handlers; public int defaultImgWidth = 0; public int defaultImgHeight = 0; public delegate string TagHandler(string tagName, bool end, string attr); public UBBParser() { handlers = new Dictionary(); handlers["url"] = onTag_URL; handlers["img"] = onTag_IMG; handlers["b"] = onTag_Simple; handlers["i"] = onTag_Simple; handlers["u"] = onTag_Simple; handlers["sup"] = onTag_Simple; handlers["sub"] = onTag_Simple; handlers["color"] = onTag_COLOR; handlers["font"] = onTag_FONT; handlers["size"] = onTag_SIZE; handlers["align"] = onTag_ALIGN; handlers["strike"] = onTag_Simple; } protected string onTag_URL(string tagName, bool end, string attr) { if (!end) { if (attr != null) return ""; else { string href = GetTagText(false); return ""; } } else return ""; } protected string onTag_IMG(string tagName, bool end, string attr) { if (!end) { string src = GetTagText(true); if (src == null || src.Length == 0) return null; if (defaultImgWidth != 0) return ""; else return ""; } else return null; } protected string onTag_Simple(string tagName, bool end, string attr) { return end ? ("") : ("<" + tagName + ">"); } protected string onTag_COLOR(string tagName, bool end, string attr) { if (!end) return ""; else return ""; } protected string onTag_FONT(string tagName, bool end, string attr) { if (!end) return ""; else return ""; } protected string onTag_SIZE(string tagName, bool end, string attr) { if (!end) return ""; else return ""; } protected string onTag_ALIGN(string tagName, bool end, string attr) { if (!end) return "

"; else return "

"; } public string GetTagText(bool remove) { int pos1 = _readPos; int pos2; StringBuilder buffer = null; while ((pos2 = _text.IndexOf('[', pos1)) != -1) { if (buffer == null) buffer = new StringBuilder(); if (_text[pos2 - 1] == '\\') { buffer.Append(_text, pos1, pos2 - pos1 - 1); buffer.Append('['); pos1 = pos2 + 1; } else { buffer.Append(_text, pos1, pos2 - pos1); break; } } if (pos2 == -1) return null; if (remove) _readPos = pos2; return buffer.ToString(); } public string Parse(string text) { _text = text; int pos1 = 0, pos2, pos3; bool end; string tag, attr; string repl; StringBuilder buffer = null; TagHandler func; while ((pos2 = _text.IndexOf('[', pos1)) != -1) { if (buffer == null) buffer = new StringBuilder(); if (pos2 > 0 && _text[pos2 - 1] == '\\') { buffer.Append(_text, pos1, pos2 - pos1 - 1); buffer.Append('['); pos1 = pos2 + 1; continue; } buffer.Append(_text, pos1, pos2 - pos1); pos1 = pos2; pos2 = _text.IndexOf(']', pos1); if (pos2 == -1) break; if (pos2 == pos1 + 1) { buffer.Append(_text, pos1, 2); pos1 = pos2 + 1; continue; } end = _text[pos1 + 1] == '/'; pos3 = end ? pos1 + 2 : pos1 + 1; tag = _text.Substring(pos3, pos2 - pos3); _readPos = pos2 + 1; attr = null; repl = null; pos3 = tag.IndexOf('='); if (pos3 != -1) { attr = tag.Substring(pos3 + 1); tag = tag.Substring(0, pos3); } tag = tag.ToLower(); if (handlers.TryGetValue(tag, out func)) { repl = func(tag, end, attr); if (repl != null) buffer.Append(repl); } else if (defaultTagHandler != null) { repl = defaultTagHandler(tag, end, attr); if (repl != null) buffer.Append(repl); else buffer.Append(_text, pos1, pos2 - pos1 + 1); } else { buffer.Append(_text, pos1, pos2 - pos1 + 1); } pos1 = _readPos; } if (buffer == null) { _text = null; return text; } else { if (pos1 < _text.Length) buffer.Append(_text, pos1, _text.Length - pos1); _text = null; return buffer.ToString(); } } } }