AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.1" />

 ValueConverterExtensions

Essential extensions for using the value converters.
using AngleSharp.Css; using AngleSharp.Css.ValueConverters; using AngleSharp.Dom.Css; using System; using System.Collections.Generic; using System.Diagnostics; namespace AngleSharp.Extensions { [DebuggerStepThrough] internal static class ValueConverterExtensions { private static readonly IValueConverter<bool> delimiter = new StructValueConverter<bool>(delegate(ICssValue m) { if (m != CssValue.Delimiter) return null; return true; }); public static bool VaryStart<T>(this IValueConverter<T> converter, CssValueList list, Action<T> setResult) { return converter.VaryStart(list, (IValueConverter<T> c, ICssValue v) => c.TryConvert(v, setResult)); } public static bool VaryStart<T>(this IValueConverter<T> converter, CssValueList list) { return converter.VaryStart(list, (IValueConverter<T> c, ICssValue v) => c.Validate(v)); } private static bool VaryStart<T>(this IValueConverter<T> converter, CssValueList list, Func<IValueConverter<T>, ICssValue, bool> validate) { int num = Math.Max(converter.MinArgs, 1); for (int num2 = Math.Min(converter.MaxArgs, list.Length); num2 >= num; num2--) { object cssValue; if (num2 <= 1) cssValue = list[0]; else { ICssValue cssValue2 = list.Subset(0, num2); cssValue = cssValue2; } ICssValue arg = (ICssValue)cssValue; if (validate(converter, arg)) { list.RemoveRange(0, num2); return true; } } return validate(converter, null); } public static bool VaryAll<T>(this IValueConverter<T> converter, CssValueList list, Action<T> setResult) { return converter.VaryAll(list, (IValueConverter<T> c, ICssValue v) => c.TryConvert(v, setResult)); } public static bool VaryAll<T>(this IValueConverter<T> converter, CssValueList list) { return converter.VaryAll(list, (IValueConverter<T> c, ICssValue v) => c.Validate(v)); } private static bool VaryAll<T>(this IValueConverter<T> converter, CssValueList list, Func<IValueConverter<T>, ICssValue, bool> validate) { int num = Math.Max(converter.MinArgs, 1); int maxArgs = converter.MaxArgs; for (int i = 0; i < list.Length; i++) { for (int num2 = Math.Min(Math.Min(maxArgs, list.Length) + i, list.Length); num2 >= i + num; num2--) { int num3 = num2 - i; object cssValue; if (num3 <= 1) cssValue = list[i]; else { ICssValue cssValue2 = list.Subset(i, num2); cssValue = cssValue2; } ICssValue arg = (ICssValue)cssValue; if (validate(converter, arg)) { list.RemoveRange(i, num3); return true; } } } return validate(converter, null); } public static IValueConverter<T[]> Many<T>(this IValueConverter<T> converter, int min = 1, int max = int.MaxValue) { return new OneOrMoreValueConverter<T>(converter, min, max); } public static IValueConverter<T[]> FromList<T>(this IValueConverter<T> converter) { return new ListValueConverter<T>(converter); } public static IValueConverter<T> ToConverter<T>(this Dictionary<string, T> values) { return new DictionaryValueConverter<T>(values); } public static IValueConverter<U> To<T, U>(this IValueConverter<T> converter, Func<T, U> result) { return new ToValueConverter<T, U>(converter, result); } public static IValueConverter<T> Atomic<T>(this IValueConverter<T> converter) { return new AtomicValueConverter<T>(converter); } public static IValueConverter<Tuple<T, T, T, T>> Periodic<T>(this IValueConverter<T> converter) { return converter.To((T m) => Tuple.Create<T, T, T, T>(m, m, m, m)).Or(new ArgumentsValueConverter<T, T>(converter, converter).To((Tuple<T, T> m) => Tuple.Create<T, T, T, T>(m.Item1, m.Item2, m.Item1, m.Item2))).Or(new ArgumentsValueConverter<T, T, T>(converter, converter, converter).To((Tuple<T, T, T> m) => Tuple.Create<T, T, T, T>(m.Item1, m.Item2, m.Item3, m.Item2))) .Or(new ArgumentsValueConverter<T, T, T, T>(converter, converter, converter, converter)); } public static IValueConverter<Tuple<T[], U>> RequiresEnd<T, U>(this IValueConverter<T[]> listConverter, IValueConverter<U> endConverter) { return new EndListValueConverter<T, U>(listConverter, endConverter); } public static IValueConverter<T> Required<T>(this IValueConverter<T> converter) { return new RequiredValueConverter<T>(converter); } public static IValueConverter<ICssValue> Val<T>(this IValueConverter<T> converter) { return new ToValueConverter<T>(converter); } public static IValueConverter<T> Option<T>(this IValueConverter<T> converter, T defaultValue) { return new OptionValueConverter<T>(converter, defaultValue); } public static IValueConverter<ICssValue> Option(this IValueConverter<ICssValue> converter) { return new OptionValueConverter<ICssValue>(converter, null); } public static IValueConverter<T> Or<T>(this IValueConverter<T> primary, IValueConverter<T> secondary) { return new OrValueConverter<T>(primary, secondary); } public static IValueConverter<T> Or<T>(this IValueConverter<T> primary, string keyword, T value) { return new OrValueConverter<T>(primary, (IValueConverter<T>)new IdentifierValueConverter<T>(keyword, value)); } public static IValueConverter<T?> ToNullable<T>(this IValueConverter<T> primary) where T : struct { return primary.To((Func<T, T?>)((T m) => m)); } public static IValueConverter<T> OrDefault<T>(this IValueConverter<T> primary) { return primary.Or(new IdentifierValueConverter<T>(Keywords.Auto, default(T))); } public static IValueConverter<T?> OrNullDefault<T>(this IValueConverter<T> primary) where T : struct { return primary.ToNullable().OrDefault(); } public static IValueConverter<T> Constraint<T>(this IValueConverter<T> primary, Predicate<T> constraint) { return new ConstraintValueConverter<T>(primary, constraint); } public static IValueConverter<T> StartsWithKeyword<T>(this IValueConverter<T> converter, string keyword) { return new OrderedOptionsConverter<bool, T>(new IdentifierValueConverter<bool>(keyword, true).Required(), converter.Required()).To((Tuple<bool, T> m) => m.Item2); } public static IValueConverter<T> StartsWithDelimiter<T>(this IValueConverter<T> converter) { return new OrderedOptionsConverter<bool, T>(delimiter.Required(), converter.Required()).To((Tuple<bool, T> m) => m.Item2); } } }