using System.Diagnostics.Contracts; using System.Text; using System.Text.RegularExpressions; namespace StabilityMatrix.Core.Extensions; public static class StringExtensions { private static string EncodeNonAsciiCharacters(string value) { var sb = new StringBuilder(); foreach (var c in value) { // If not ascii or not printable if (c > 127 || c < 32) { // This character is too big for ASCII var encodedValue = "\\u" + ((int)c).ToString("x4"); sb.Append(encodedValue); } else { sb.Append(c); } } return sb.ToString(); } /// /// Converts string to repr /// public static string ToRepr(this string? str) { if (str is null) { return ""; } using var writer = new StringWriter(); writer.Write("'"); foreach (var ch in str) { writer.Write( ch switch { '\0' => "\\0", '\n' => "\\n", '\r' => "\\r", '\t' => "\\t", // Non ascii _ when ch > 127 || ch < 32 => $"\\u{(int)ch:x4}", _ => ch.ToString() } ); } writer.Write("'"); return writer.ToString(); } /// /// Counts continuous sequence of a character /// from the start of the string /// public static int CountStart(this string str, char c) { var count = 0; foreach (var ch in str) { if (ch == c) { count++; } else { break; } } return count; } /// /// Strips the substring from the start of the string /// [Pure] public static string StripStart(this string str, string subString) { var index = str.IndexOf(subString, StringComparison.Ordinal); return index < 0 ? str : str.Remove(index, subString.Length); } /// /// Strips the substring from the end of the string /// [Pure] public static string StripEnd(this string str, string subString) { var index = str.LastIndexOf(subString, StringComparison.Ordinal); return index < 0 ? str : str.Remove(index, subString.Length); } /// /// Splits lines by \n and \r\n /// [Pure] // ReSharper disable once ReturnTypeCanBeEnumerable.Global public static string[] SplitLines( this string str, StringSplitOptions options = StringSplitOptions.None ) { return str.Split(new[] { "\r\n", "\n" }, options); } }