StringExtensions
Useful methods for string objects.
using AngleSharp.Css;
using AngleSharp.DOM;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text;
namespace AngleSharp.Extensions
{
[DebuggerStepThrough]
internal static class StringExtensions
{
public static bool Contains(this IEnumerable<char> list, char element)
{
foreach (char item in list) {
if (item == element)
return true;
}
return false;
}
public static T ToEnum<T>(this string value, T defaultValue) where T : struct, IComparable
{
if (string.IsNullOrEmpty(value))
return defaultValue;
T result = default(T);
if (Enum.TryParse(value, true, out result))
return result;
return defaultValue;
}
public static double ToDouble(this string value, double defaultValue = 0)
{
if (string.IsNullOrEmpty(value))
return defaultValue;
if (double.TryParse(value, out double result))
return result;
return defaultValue;
}
public static int ToInteger(this string value, int defaultValue = 0)
{
if (string.IsNullOrEmpty(value))
return defaultValue;
if (int.TryParse(value, out int result))
return result;
return defaultValue;
}
public static uint ToInteger(this string value, uint defaultValue = 0)
{
if (string.IsNullOrEmpty(value))
return defaultValue;
if (uint.TryParse(value, out uint result))
return result;
return defaultValue;
}
public static bool ToBoolean(this string value, bool defaultValue = false)
{
if (string.IsNullOrEmpty(value))
return defaultValue;
if (bool.TryParse(value, out bool result))
return result;
return defaultValue;
}
public static string ReplaceFirst(this string text, string search, string replace)
{
int num = text.IndexOf(search);
if (num < 0)
return text;
return text.Substring(0, num) + replace + text.Substring(num + search.Length);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool Contains(this string str, string content)
{
return str.IndexOf(content) >= 0;
}
public static string CollapseAndStrip(this string str)
{
List<char> list = new List<char>();
bool flag = true;
for (int i = 0; i < str.Length; i++) {
if (str[i].IsSpaceCharacter()) {
if (!flag) {
list.Add(' ');
flag = true;
}
} else {
flag = false;
list.Add(str[i]);
}
}
if (flag && list.Count > 0)
list.RemoveAt(list.Count - 1);
return new string(list.ToArray());
}
public static string Collapse(this string str)
{
List<char> list = new List<char>();
bool flag = false;
for (int i = 0; i < str.Length; i++) {
if (str[i].IsSpaceCharacter()) {
if (!flag) {
list.Add(' ');
flag = true;
}
} else {
flag = false;
list.Add(str[i]);
}
}
return new string(list.ToArray());
}
public static bool Contains(this string[] list, string element, StringComparison comparison = StringComparison.Ordinal)
{
for (int i = 0; i < list.Length; i++) {
if (list[i].Equals(element, comparison))
return true;
}
return false;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2)
{
if (!(element == item1))
return element == item2;
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2, string item3)
{
if (!(element == item1) && !(element == item2))
return element == item3;
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4)
{
if (!(element == item1) && !(element == item2) && !(element == item3))
return element == item4;
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5)
{
if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4))
return element == item5;
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5, string item6)
{
if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4) && !(element == item5))
return element == item6;
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5, string item6, string item7)
{
if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4) && !(element == item5) && !(element == item6))
return element == item7;
return true;
}
public static string StripLineBreaks(this string str)
{
char[] array = str.ToCharArray();
int num = 0;
int num2 = array.Length;
int num3 = 0;
while (num3 < num2) {
array[num3] = array[num3 + num];
if (array[num3].IsLineBreak()) {
num++;
num2--;
} else
num3++;
}
return new string(array, 0, num2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string StripLeadingTailingSpaces(this string str)
{
return str.ToCharArray().StripLeadingTailingSpaces();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string StripLeadingTailingSpaces(this char[] array)
{
int i = 0;
int num = array.Length - 1;
for (; i < array.Length && array[i].IsSpaceCharacter(); i++) {
}
while (num > i && array[num].IsSpaceCharacter()) {
num--;
}
return new string(array, i, 1 + num - i);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string[] SplitWithoutTrimming(this string str, char c)
{
return str.ToCharArray().SplitWithoutTrimming(c);
}
public static string[] SplitWithoutTrimming(this char[] chars, char c)
{
List<string> list = new List<string>();
int num = 0;
for (int i = 0; i < chars.Length; i++) {
if (chars[i] == c) {
if (i > num)
list.Add(new string(chars, num, i - num));
num = i + 1;
}
}
if (chars.Length > num)
list.Add(new string(chars, num, chars.Length - num));
return list.ToArray();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string[] SplitCommas(this string str)
{
return str.SplitWithTrimming(',');
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string[] SplitHyphens(this string str)
{
return str.SplitWithTrimming('-');
}
public static string[] SplitSpaces(this string str)
{
List<string> list = new List<string>();
List<char> list2 = new List<char>();
char[] array = str.ToCharArray();
for (int i = 0; i <= array.Length; i++) {
if (i == array.Length || array[i].IsSpaceCharacter()) {
if (list2.Count > 0) {
string text = list2.ToArray().StripLeadingTailingSpaces();
if (text.Length != 0)
list.Add(text);
list2.Clear();
}
} else
list2.Add(array[i]);
}
return list.ToArray();
}
public static string[] SplitWithTrimming(this string str, char c)
{
List<string> list = new List<string>();
List<char> list2 = new List<char>();
char[] array = str.ToCharArray();
for (int i = 0; i <= array.Length; i++) {
if (i == array.Length || array[i] == c) {
if (list2.Count > 0) {
string text = list2.ToArray().StripLeadingTailingSpaces();
if (text.Length != 0)
list.Add(text);
list2.Clear();
}
} else
list2.Add(array[i]);
}
return list.ToArray();
}
public static bool IsDigit(this string s)
{
for (int i = 0; i < s.Length; i++) {
if (!s[i].IsDigit())
return false;
}
return true;
}
public static bool IsHex(this string s)
{
for (int i = 0; i < s.Length; i++) {
if (!s[i].IsHex())
return false;
}
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int FromHex(this string s)
{
return int.Parse(s, NumberStyles.HexNumber);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int FromDec(this string s)
{
return int.Parse(s, NumberStyles.Integer);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string HtmlEncode(this string value, Encoding encoding)
{
return value;
}
public static string CssString(this string value)
{
StringBuilder stringBuilder = Pool.NewStringBuilder();
stringBuilder.Append('"');
if (!string.IsNullOrEmpty(value)) {
foreach (char c in value) {
switch (c) {
case ' ':
throw new DomException(ErrorCode.InvalidCharacter);
case '"':
case '\\':
stringBuilder.Append('\\').Append(c);
break;
default:
if (c.IsInRange(1, 31) || c == '{')
stringBuilder.Append('\\').Append(c.ToHex()).Append(' ');
else
stringBuilder.Append(c);
break;
}
}
}
stringBuilder.Append('"');
return stringBuilder.ToPool();
}
public static string CssUrl(this string value)
{
return FunctionNames.Url + "(" + value.CssString() + ")";
}
public static string UrlEncode(this string value, Encoding encoding)
{
StringBuilder stringBuilder = Pool.NewStringBuilder();
byte[] bytes = encoding.GetBytes(value);
byte[] array = bytes;
for (int i = 0; i < array.Length; i++) {
byte b = array[i];
char c = (char)b;
switch (c) {
case ' ':
stringBuilder.Append('+');
break;
default:
if (!c.IsAlphanumericAscii()) {
stringBuilder.Append('%').Append(b.ToString("X2"));
break;
}
goto case '*';
case '*':
case '-':
case '.':
stringBuilder.Append(c);
break;
}
}
return stringBuilder.ToPool();
}
}
}