AngleSharp by Florian Rappl

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

.NET API 1,229,312 bytes

 CssContentProperty

Information can be found on MDN: https://developer.mozilla.org/en-US/docs/Web/CSS/content
using AngleSharp.Css; using AngleSharp.Css.Values; using AngleSharp.Extensions; using System; using System.Collections.Generic; using System.Linq; namespace AngleSharp.Dom.Css { internal sealed class CssContentProperty : CssProperty { private abstract class ContentMode { public abstract string Stringify(IElement element); } private sealed class NormalContentMode : ContentMode { public override string Stringify(IElement element) { return string.Empty; } } private sealed class OpenQuoteContentMode : ContentMode { public override string Stringify(IElement element) { return string.Empty; } } private sealed class CloseQuoteContentMode : ContentMode { public override string Stringify(IElement element) { return string.Empty; } } private sealed class NoOpenQuoteContentMode : ContentMode { public override string Stringify(IElement element) { return string.Empty; } } private sealed class NoCloseQuoteContentMode : ContentMode { public override string Stringify(IElement element) { return string.Empty; } } private sealed class TextContentMode : ContentMode { private readonly string _text; public TextContentMode(string text) { _text = text; } public override string Stringify(IElement element) { return _text; } } private sealed class CounterContentMode : ContentMode { private readonly Counter _counter; public CounterContentMode(Counter counter) { _counter = counter; } public override string Stringify(IElement element) { return string.Empty; } } private sealed class AttributeContentMode : ContentMode { private readonly string _attribute; public AttributeContentMode(string attribute) { _attribute = attribute; } public override string Stringify(IElement element) { return element.GetAttribute(_attribute) ?? string.Empty; } } private sealed class UrlContentMode : ContentMode { private readonly string _url; public UrlContentMode(string url) { _url = url; } public override string Stringify(IElement element) { return string.Empty; } } private static readonly Dictionary<string, ContentMode> ContentModes = new Dictionary<string, ContentMode>(StringComparer.OrdinalIgnoreCase) { { Keywords.OpenQuote, new OpenQuoteContentMode() }, { Keywords.NoOpenQuote, new NoOpenQuoteContentMode() }, { Keywords.CloseQuote, new CloseQuoteContentMode() }, { Keywords.NoCloseQuote, new NoCloseQuoteContentMode() } }; private static readonly ContentMode[] Default = new NormalContentMode[1] { new NormalContentMode() }; private static readonly IValueConverter<ContentMode[]> Converter = Converters.Assign(Keywords.Normal, Default).Or(Keywords.None, new ContentMode[0]).Or(ContentModes.ToConverter().Or(Converters.UrlConverter.To(TransformUrl)).Or(Converters.StringConverter.To(TransformString)) .Or(Converters.AttrConverter.To(TransformAttr)) .Or(Converters.CounterConverter.To(TransformCounter)) .Many(1, 65535)); internal CssContentProperty(CssStyleDeclaration rule) : base(PropertyNames.Content, rule, PropertyFlags.None) { } protected override object GetDefault(IElement element) { IEnumerable<string> values = from m in Default select m.Stringify(element); return string.Join(string.Empty, values); } protected override object Compute(IElement element) { ContentMode[] source = Converter.Convert(base.Value); IEnumerable<string> values = from m in source select m.Stringify(element); return string.Join(string.Empty, values); } protected override bool IsValid(CssValue value) { return Converter.Validate(value); } private static ContentMode TransformUrl(string url) { return new UrlContentMode(url); } private static ContentMode TransformString(string str) { return new TextContentMode(str); } private static ContentMode TransformAttr(string attr) { return new AttributeContentMode(attr); } private static ContentMode TransformCounter(Counter counter) { return new CounterContentMode(counter); } } }