CssValue
Represents a CSS value.
using AngleSharp.Extensions;
using AngleSharp.Parser.Css;
using System;
using System.Collections;
using System.Collections.Generic;
namespace AngleSharp.Dom.Css
{
internal sealed class CssValue : ICssValue, IEnumerable<CssToken>, IEnumerable
{
private readonly CssValueType _type;
private readonly List<CssToken> _tokens;
public static CssValue Initial = FromString(Keywords.Initial, CssValueType.Initial);
public CssToken this[int index] {
get {
return _tokens[index];
}
}
public int Count => _tokens.Count;
public CssValueType Type => _type;
public string CssText => _tokens.ToText();
private CssValue(CssToken token, CssValueType type)
{
_tokens = new List<CssToken>();
_tokens.Add(token);
_type = type;
}
public CssValue(IEnumerable<CssToken> tokens)
{
_tokens = new List<CssToken>(tokens);
_type = FindType(_tokens);
}
public static CssValue FromString(string text, CssValueType type)
{
CssToken token = new CssToken(CssTokenType.Ident, text, TextPosition.Empty);
return new CssValue(token, type);
}
private static CssValueType FindType(List<CssToken> tokens)
{
CssValueType cssValueType = CssValueType.Custom;
int num = 0;
if (tokens.Count == 1) {
if (tokens[0].Data.Equals(Keywords.Initial, StringComparison.OrdinalIgnoreCase))
return CssValueType.Initial;
if (tokens[0].Data.Equals(Keywords.Inherit, StringComparison.OrdinalIgnoreCase))
return CssValueType.Inherit;
}
for (int i = 0; i < tokens.Count; i++) {
if (cssValueType == CssValueType.Custom)
cssValueType = CssValueType.Primitive;
if (tokens[i].Type == CssTokenType.RoundBracketClose)
num--;
if (tokens[i].Type == CssTokenType.RoundBracketOpen)
num++;
if (num <= 0 && (tokens[i].Type == CssTokenType.Whitespace || tokens[i].Type == CssTokenType.Comma || (tokens[i].Type == CssTokenType.Delim && tokens[i].Data == "/")))
cssValueType = CssValueType.List;
}
return cssValueType;
}
public IEnumerator<CssToken> GetEnumerator()
{
return _tokens.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}