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);
}
}
}