using System; using System.Globalization; using System.Linq; using System.Text; namespace IrcTokens { public class Protocol { private static readonly string[] TagUnescaped = new [] { "\\", " ", ";", "\r", "\n" }; private static readonly string[] TagEscaped = new [] { "\\\\", "\\s", "\\:", "\\r", "\\n" }; /// /// Unescape ircv3 tag /// /// escaped string /// unescaped string public static string UnescapeTag(string val) { var unescaped = new StringBuilder(); var graphemeIterator = StringInfo.GetTextElementEnumerator(val); graphemeIterator.Reset(); while (graphemeIterator.MoveNext()) { var current = graphemeIterator.GetTextElement(); if (current == @"\") { try { graphemeIterator.MoveNext(); var next = graphemeIterator.GetTextElement(); var pair = current + next; unescaped.Append(TagEscaped.Contains(pair) ? TagUnescaped[Array.IndexOf(TagEscaped, pair)] : next); } catch (InvalidOperationException) { // ignored } } else unescaped.Append(current); } return unescaped.ToString(); } /// /// Escape strings for use in ircv3 tags /// /// string to escape /// escaped string public static string EscapeTag(string val) { for (var i = 0; i < TagUnescaped.Length; ++i) { val = val.Replace(TagUnescaped[i], TagEscaped[i]); } return val; } } }