ConfigurationExtensions
Represents a helper to construct objects with externally defined
classes and libraries.
using AngleSharp.Dom;
using AngleSharp.Network;
using AngleSharp.Services;
using AngleSharp.Services.Media;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Extensions
{
[DebuggerStepThrough]
internal static class ConfigurationExtensions
{
public static Encoding DefaultEncoding(this IConfiguration configuration)
{
if (configuration == null)
configuration = Configuration.Default;
return TextEncoding.Suggest(configuration.GetLanguage());
}
public static CultureInfo GetCulture(this IConfiguration options)
{
return options.Culture ?? CultureInfo.CurrentUICulture;
}
public static CultureInfo GetCultureFromLanguage(this IConfiguration options, string language)
{
try {
return new CultureInfo(language);
} catch (CultureNotFoundException) {
return options.GetCulture();
}
}
public static string GetLanguage(this IConfiguration options)
{
return options.GetCulture().Name;
}
public static TService GetService<TService>(this IConfiguration configuration) where TService : IService
{
foreach (IService service in configuration.Services) {
if (service is TService)
return (TService)service;
}
return default(TService);
}
public static IEnumerable<TService> GetServices<TService>(this IConfiguration configuration) where TService : IService
{
foreach (IService service in configuration.Services) {
if (service is TService)
yield return (TService)service;
}
}
public static string GetCookie(this IConfiguration options, string origin)
{
ICookieService service = options.GetService<ICookieService>();
if (service != null)
return service[origin];
return string.Empty;
}
public static void SetCookie(this IConfiguration options, string origin, string value)
{
ICookieService service = options.GetService<ICookieService>();
if (service != null)
service[origin] = value;
}
public static ISpellCheckService GetSpellCheck(this IConfiguration options, string language)
{
ISpellCheckService result = null;
CultureInfo cultureFromLanguage = options.GetCultureFromLanguage(language);
foreach (ISpellCheckService service in options.GetServices<ISpellCheckService>()) {
if (service.Culture.Equals(cultureFromLanguage))
return service;
if (service.Culture.TwoLetterISOLanguageName == cultureFromLanguage.TwoLetterISOLanguageName)
result = service;
}
return result;
}
public static IRequester GetRequester(this IConfiguration options, string protocol)
{
foreach (IRequester requester in options.Requesters) {
if (requester.SupportsProtocol(protocol))
return requester;
}
return null;
}
public static Task<TResource> LoadResource<TResource>(this IConfiguration options, Url url) where TResource : IResourceInfo
{
return options.LoadResource<TResource>(url, CancellationToken.None);
}
public static async Task<TResource> LoadResource<TResource>(this IConfiguration options, Url url, CancellationToken cancel) where TResource : IResourceInfo
{
IRequester requester = options.GetRequester(url.Scheme);
if (requester != null) {
using (IResponse response = await requester.LoadAsync(url, cancel).ConfigureAwait(false)) {
if (response == null)
return default(TResource);
foreach (IResourceService<TResource> service in ConfigurationExtensions.GetServices<IResourceService<TResource>>(options)) {
if (service.SupportsType(response.Headers[HeaderNames.ContentType]))
return await service.CreateAsync(response, cancel).ConfigureAwait(false);
}
}
}
return default(TResource);
}
public static IStyleEngine GetStyleEngine(this IConfiguration configuration, string type)
{
foreach (IStyleEngine styleEngine in configuration.StyleEngines) {
if (styleEngine.Type.Equals(type, StringComparison.OrdinalIgnoreCase))
return styleEngine;
}
return null;
}
public static IStyleSheet ParseStyling(this IConfiguration configuration, string source, StyleOptions options, string type = null)
{
return configuration.GetStyleEngine(type ?? MimeTypes.Css)?.Parse(source, options);
}
public static IStyleSheet ParseStyling(this IConfiguration configuration, IResponse response, StyleOptions options, string type = null)
{
return configuration.GetStyleEngine(type ?? MimeTypes.Css)?.Parse(response, options);
}
public static IScriptEngine GetScriptEngine(this IConfiguration configuration, string type)
{
foreach (IScriptEngine scriptEngine in configuration.ScriptEngines) {
if (scriptEngine.Type.Equals(type, StringComparison.OrdinalIgnoreCase))
return scriptEngine;
}
return null;
}
public static void RunScript(this IConfiguration configuration, string source, ScriptOptions options, string type = null)
{
if (configuration.IsScripting)
configuration.GetScriptEngine(type ?? MimeTypes.DefaultJavaScript)?.Evaluate(source, options);
}
public static void RunScript(this IConfiguration configuration, IResponse response, ScriptOptions options, string type = null)
{
if (configuration.IsScripting)
configuration.GetScriptEngine(type ?? MimeTypes.DefaultJavaScript)?.Evaluate(response, options);
}
public static IBrowsingContext NewContext(this IConfiguration options, Sandboxes security)
{
IContextService service = options.GetService<IContextService>();
if (service == null)
return new SimpleBrowsingContext(options, security);
return service.Create(options, security);
}
public static IBrowsingContext FindContext(this IConfiguration options, string name)
{
return options.GetService<IContextService>()?.Find(name);
}
public static ICommandService GetCommand(this IConfiguration options, string commandId)
{
foreach (ICommandService service in options.GetServices<ICommandService>()) {
if (service.CommandId.Equals(commandId, StringComparison.OrdinalIgnoreCase))
return service;
}
return null;
}
public static Task<Stream> LoadCached(this IConfiguration options, Url url)
{
return options.LoadCached(url, CancellationToken.None);
}
public static async Task<Stream> LoadCached(this IConfiguration options, Url url, CancellationToken cancel)
{
IEnumerable<ICacheLoaderService> services = options.GetServices<ICacheLoaderService>();
foreach (ICacheLoaderService item in services) {
Stream stream = await item.LoadAsync(url, cancel);
if (stream != null)
return stream;
}
return null;
}
}
}