ConfigurationExtensions
A set of useful extensions for Configuration (or derived) objects.
using AngleSharp.Dom.Css;
using AngleSharp.Extensions;
using AngleSharp.Network;
using AngleSharp.Network.Default;
using AngleSharp.Services;
using AngleSharp.Services.Default;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace AngleSharp
{
public static class ConfigurationExtensions
{
public sealed class LoaderSetup
{
public bool { get; set; }
public bool IsResourceLoadingEnabled { get; set; }
public Predicate<IRequest> Filter { get; set; }
}
public static Configuration With(this IConfiguration configuration, object service)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
if (service == null)
throw new ArgumentNullException("service");
return new Configuration(configuration.Services.Concat(service));
}
public static Configuration With(this IConfiguration configuration, IEnumerable<object> services)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
if (services == null)
throw new ArgumentNullException("services");
return new Configuration(configuration.Services.Concat(services));
}
public static IConfiguration With<TService>(this IConfiguration configuration, Func<IBrowsingContext, TService> creator)
{
IEnumerable<object> enumerable = configuration.Services;
IEnumerable<Func<IBrowsingContext, TService>> enumerable2 = configuration.Services.OfType<Func<IBrowsingContext, TService>>();
if (enumerable2.Any())
enumerable = enumerable.Except(enumerable2);
return new Configuration(enumerable.Concat(creator));
}
public static Configuration SetCulture(this IConfiguration configuration, string name)
{
CultureInfo culture = new CultureInfo(name);
return configuration.SetCulture(culture);
}
public static Configuration SetCulture(this IConfiguration configuration, CultureInfo culture)
{
return configuration.With(culture);
}
public static IConfiguration WithCss(this IConfiguration configuration, Action<CssStyleEngine> setup = null)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
if (!configuration.GetServices<IStylingProvider>().Any()) {
StylingService stylingService = new StylingService();
CssStyleEngine cssStyleEngine = new CssStyleEngine();
setup?.Invoke(cssStyleEngine);
stylingService.Register(cssStyleEngine);
return configuration.With(stylingService);
}
return configuration;
}
public static IConfiguration WithDefaultLoader(this IConfiguration configuration, Action<LoaderSetup> setup = null, IEnumerable<IRequester> requesters = null)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
configuration = configuration.With(requesters ?? new IRequester[2] {
new HttpRequester(null),
new DataRequester()
});
LoaderSetup config = new LoaderSetup {
Filter = null,
IsNavigationEnabled = true,
IsResourceLoadingEnabled = false
};
configuration.GetFactory<IServiceFactory>();
setup?.Invoke(config);
if (config.IsNavigationEnabled)
configuration = configuration.With((Func<IBrowsingContext, IDocumentLoader>)((IBrowsingContext ctx) => new DocumentLoader(ctx, config.Filter)));
if (config.IsResourceLoadingEnabled)
configuration = configuration.With((Func<IBrowsingContext, IResourceLoader>)((IBrowsingContext ctx) => new ResourceLoader(ctx, config.Filter)));
return configuration;
}
public static IConfiguration WithLocaleBasedEncoding(this IConfiguration configuration)
{
if (configuration == null)
throw new ArgumentException("configuration");
if (!configuration.GetServices<IEncodingProvider>().Any()) {
LocaleEncodingProvider service = new LocaleEncodingProvider();
return configuration.With(service);
}
return configuration;
}
public static IConfiguration WithCookies(this IConfiguration configuration)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
if (!configuration.GetServices<ICookieProvider>().Any()) {
MemoryCookieProvider service = new MemoryCookieProvider();
return configuration.With(service);
}
return configuration;
}
}
}