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;
namespace AngleSharp.Dom.Css
{
internal sealed class CssContentProperty : CssProperty, ICssContentProperty, ICssProperty
{
private abstract class ContentMode
{
}
private sealed class NormalContentMode : ContentMode
{
}
private sealed class OpenQuoteContentMode : ContentMode
{
}
private sealed class CloseQuoteContentMode : ContentMode
{
}
private sealed class NoOpenQuoteContentMode : ContentMode
{
}
private sealed class NoCloseQuoteContentMode : ContentMode
{
}
private sealed class TextContentMode : ContentMode
{
private readonly string _text;
public TextContentMode(string text)
{
_text = text;
}
}
private sealed class CounterContentMode : ContentMode
{
private readonly Counter _counter;
public CounterContentMode(Counter counter)
{
_counter = counter;
}
}
private sealed class AttributeContentMode : ContentMode
{
private readonly string _attribute;
public AttributeContentMode(string attribute)
{
_attribute = attribute;
}
}
private sealed class UrlContentMode : ContentMode
{
private readonly Url _url;
public UrlContentMode(Url url)
{
_url = url;
}
}
private static readonly IValueConverter<ContentMode[]> Converter;
private static readonly ContentMode[] Default;
private static readonly Dictionary<string, ContentMode> ContentModes;
private IEnumerable<ContentMode> _mode;
static CssContentProperty()
{
ContentModes = new Dictionary<string, ContentMode>(StringComparer.OrdinalIgnoreCase);
ContentModes.Add(Keywords.OpenQuote, new OpenQuoteContentMode());
ContentModes.Add(Keywords.NoOpenQuote, new NoOpenQuoteContentMode());
ContentModes.Add(Keywords.CloseQuote, new CloseQuoteContentMode());
ContentModes.Add(Keywords.NoCloseQuote, new NoCloseQuoteContentMode());
Default = new NormalContentMode[1] {
new NormalContentMode()
};
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, 2147483647));
}
internal CssContentProperty(CssStyleDeclaration rule)
: base(PropertyNames.Content, rule, PropertyFlags.None)
{
Reset();
}
internal override void Reset()
{
_mode = Default;
}
private void SetMode(ContentMode[] mode)
{
_mode = mode;
}
protected override bool IsValid(ICssValue value)
{
return Converter.TryConvert(value, SetMode);
}
private static ContentMode TransformUrl(CssUrl 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);
}
}
}