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