StartsWithValueConverter
using AngleSharp.Dom.Css;
using AngleSharp.Parser.Css;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AngleSharp.Css.ValueConverters
{
internal sealed class StartsWithValueConverter : IValueConverter
{
private sealed class StartValue : IPropertyValue
{
private readonly string _start;
private readonly IPropertyValue _value;
private readonly CssValue _original;
public string CssText => _start + " " + _value.CssText;
public CssValue Original => _original;
public StartValue(string start, IPropertyValue value, IEnumerable<CssToken> tokens)
{
_start = start;
_value = value;
_original = new CssValue(tokens);
}
public CssValue ExtractFor(string name)
{
return _value.ExtractFor(name);
}
}
private readonly CssTokenType _type;
private readonly string _data;
private readonly IValueConverter _converter;
public StartsWithValueConverter(CssTokenType type, string data, IValueConverter converter)
{
_type = type;
_data = data;
_converter = converter;
}
public IPropertyValue Convert(IEnumerable<CssToken> value)
{
List<CssToken> list = Transform(value);
if (list == null)
return null;
return CreateFrom(_converter.Convert(list), value);
}
public IPropertyValue Construct(CssProperty[] properties)
{
IPropertyValue propertyValue = _converter.Construct(properties);
if (propertyValue == null)
return null;
return CreateFrom(propertyValue, Enumerable.Empty<CssToken>());
}
private IPropertyValue CreateFrom(IPropertyValue value, IEnumerable<CssToken> tokens)
{
if (value == null)
return null;
return new StartValue(_data, value, tokens);
}
private List<CssToken> Transform(IEnumerable<CssToken> values)
{
IEnumerator<CssToken> enumerator = values.GetEnumerator();
while (enumerator.MoveNext() && enumerator.Current.Type == CssTokenType.Whitespace) {
}
if (enumerator.Current.Type == _type && enumerator.Current.Data.Equals(_data, StringComparison.OrdinalIgnoreCase)) {
List<CssToken> list = new List<CssToken>();
while (enumerator.MoveNext()) {
if (enumerator.Current.Type != CssTokenType.Whitespace || list.Count != 0)
list.Add(enumerator.Current);
}
return list;
}
return null;
}
}
}