FunctionValueConverter
using AngleSharp.Dom.Css;
using AngleSharp.Extensions;
using AngleSharp.Parser.Css;
using System;
using System.Collections.Generic;
namespace AngleSharp.Css.ValueConverters
{
internal sealed class FunctionValueConverter : IValueConverter
{
private sealed class FunctionValue : IPropertyValue
{
private readonly string _name;
private readonly IPropertyValue _arguments;
private readonly CssValue _value;
public string CssText => _name + "(" + _arguments.CssText + ")";
public CssValue Original => _value;
public FunctionValue(string name, IPropertyValue arguments, IEnumerable<CssToken> tokens)
{
_name = name;
_arguments = arguments;
_value = new CssValue(tokens);
}
public CssValue ExtractFor(string name)
{
return _value;
}
}
private readonly string _name;
private readonly IValueConverter _arguments;
public FunctionValueConverter(string name, IValueConverter arguments)
{
_name = name;
_arguments = arguments;
}
public IPropertyValue Convert(IEnumerable<CssToken> value)
{
CssFunctionToken cssFunctionToken = value.OnlyOrDefault() as CssFunctionToken;
if (Check(cssFunctionToken)) {
IPropertyValue propertyValue = _arguments.Convert(cssFunctionToken.ArgumentTokens);
if (propertyValue == null)
return null;
return new FunctionValue(_name, propertyValue, value);
}
return null;
}
public IPropertyValue Construct(CssProperty[] properties)
{
return properties.Guard<FunctionValue>();
}
private bool Check(CssFunctionToken function)
{
return function?.Data.Equals(_name, StringComparison.OrdinalIgnoreCase) ?? false;
}
}
}