AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.9" />

.NET API 1,181,184 bytes

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