using Newtonsoft.Json; using System; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace NadekoBot.Extensions { public static class StringExtensions { public static T MapJson(this string str) => JsonConvert.DeserializeObject(str); public static string StripHTML(this string input) { return Regex.Replace(input, "<.*?>", String.Empty); } /// /// Easy use of fast, efficient case-insensitive Contains check with StringComparison Member Types /// CurrentCulture, CurrentCultureIgnoreCase, InvariantCulture, InvariantCultureIgnoreCase, Ordinal, OrdinalIgnoreCase /// public static bool ContainsNoCase(this string str, string contains, StringComparison compare) { return str.IndexOf(contains, compare) >= 0; } public static string TrimTo(this string str, int maxLength, bool hideDots = false) { if (maxLength < 0) throw new ArgumentOutOfRangeException(nameof(maxLength), $"Argument {nameof(maxLength)} can't be negative."); if (maxLength == 0) return string.Empty; if (maxLength <= 3) return string.Concat(str.Select(c => '.')); if (str.Length < maxLength) return str; return string.Concat(str.Take(maxLength - 3)) + (hideDots ? "" : "..."); } public static string ToTitleCase(this string str) { var tokens = str.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < tokens.Length; i++) { var token = tokens[i]; tokens[i] = token.Substring(0, 1).ToUpper() + token.Substring(1); } return string.Join(" ", tokens); } /// /// Removes trailing S or ES (if specified) on the given string if the num is 1 /// /// /// /// /// String with the correct singular/plural form public static string SnPl(this string str, int? num, bool es = false) { if (str == null) throw new ArgumentNullException(nameof(str)); if (num == null) throw new ArgumentNullException(nameof(num)); return num == 1 ? str.Remove(str.Length - 1, es ? 2 : 1) : str; } //http://www.dotnetperls.com/levenshtein public static int LevenshteinDistance(this string s, string t) { var n = s.Length; var m = t.Length; var d = new int[n + 1, m + 1]; // Step 1 if (n == 0) { return m; } if (m == 0) { return n; } // Step 2 for (var i = 0; i <= n; d[i, 0] = i++) { } for (var j = 0; j <= m; d[0, j] = j++) { } // Step 3 for (var i = 1; i <= n; i++) { //Step 4 for (var j = 1; j <= m; j++) { // Step 5 var cost = (t[j - 1] == s[i - 1]) ? 0 : 1; // Step 6 d[i, j] = Math.Min( Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); } } // Step 7 return d[n, m]; } public static async Task ToStream(this string str) { var ms = new MemoryStream(); var sw = new StreamWriter(ms); await sw.WriteAsync(str); await sw.FlushAsync(); ms.Position = 0; return ms; } private static readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|.me|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3})))", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static bool IsDiscordInvite(this string str) => filterRegex.IsMatch(str); public static string Unmention(this string str) => str.Replace("@", "ම"); public static string SanitizeMentions(this string str) => str.Replace("@everyone", "@everyοne").Replace("@here", "@һere"); public static string ToBase64(this string plainText) { var plainTextBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String(plainTextBytes); } public static string GetInitials(this string txt, string glue = "") => string.Join(glue, txt.Split(' ').Select(x => x.FirstOrDefault())); } }