CssParserExtensions
Extensions to be used exclusively by the parser or the tokenizer.
using AngleSharp.Dom.Css;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace AngleSharp.Parser.Css
{
[DebuggerStepThrough]
internal static class CssParserExtensions
{
public static int GetCode(this CssParseError code)
{
return (int)code;
}
public static string InKeyframesName(this IEnumerator<CssToken> tokens)
{
CssToken current = tokens.Current;
if (current.Type == CssTokenType.Ident) {
tokens.MoveNext();
return current.Data;
}
return string.Empty;
}
public static KeyframeSelector InKeyframeText(this IEnumerator<CssToken> tokens)
{
List<Percent> list = new List<Percent>();
do {
CssToken current = tokens.Current;
if (list.Count > 0) {
if (current.Type == CssTokenType.CurlyBracketOpen)
break;
if (current.Type != CssTokenType.Comma || !tokens.MoveNext())
return null;
current = tokens.Current;
}
if (current.Type == CssTokenType.Percentage)
list.Add(new Percent(((CssUnitToken)current).Value));
else if (current.Type == CssTokenType.Ident && current.Data.Equals(Keywords.From)) {
list.Add(Percent.Zero);
} else {
if (current.Type != CssTokenType.Ident || !current.Data.Equals(Keywords.To))
return null;
list.Add(Percent.Hundred);
}
} while (tokens.MoveNext());
return new KeyframeSelector(list);
}
public static void JumpToEndOfDeclaration(this IEnumerator<CssToken> tokens)
{
int num = 0;
int num2 = 0;
int num3 = 0;
do {
switch (tokens.Current.Type) {
case CssTokenType.CurlyBracketClose:
if (num <= 0 && num2 <= 0 && num3 <= 0)
return;
num2--;
break;
case CssTokenType.CurlyBracketOpen:
num2++;
break;
case CssTokenType.RoundBracketClose:
num--;
break;
case CssTokenType.Function:
case CssTokenType.RoundBracketOpen:
num++;
break;
case CssTokenType.SquareBracketClose:
num3--;
break;
case CssTokenType.SquareBracketOpen:
num3++;
break;
case CssTokenType.Semicolon:
if (num <= 0 && num2 <= 0 && num3 <= 0)
return;
break;
}
} while (tokens.MoveNext());
}
public static void JumpToNextSemicolon(this IEnumerator<CssToken> tokens)
{
int num = 0;
int num2 = 0;
int num3 = 0;
do {
switch (tokens.Current.Type) {
case CssTokenType.CurlyBracketClose:
num2--;
break;
case CssTokenType.CurlyBracketOpen:
num2++;
break;
case CssTokenType.RoundBracketClose:
num--;
break;
case CssTokenType.Function:
case CssTokenType.RoundBracketOpen:
num++;
break;
case CssTokenType.SquareBracketClose:
num3--;
break;
case CssTokenType.SquareBracketOpen:
num3++;
break;
case CssTokenType.Semicolon:
if (num <= 0 && num2 <= 0 && num3 <= 0)
return;
break;
}
} while (tokens.MoveNext());
}
public static void JumpToClosedArguments(this IEnumerator<CssToken> tokens)
{
int num = 0;
int num2 = 0;
int num3 = 0;
do {
switch (tokens.Current.Type) {
case CssTokenType.CurlyBracketClose:
num2--;
break;
case CssTokenType.CurlyBracketOpen:
num2++;
break;
case CssTokenType.RoundBracketClose:
if (num <= 0 && num2 <= 0 && num3 <= 0)
return;
num--;
break;
case CssTokenType.Function:
case CssTokenType.RoundBracketOpen:
num++;
break;
case CssTokenType.SquareBracketClose:
num3--;
break;
case CssTokenType.SquareBracketOpen:
num3++;
break;
}
} while (tokens.MoveNext());
}
public static CssMedium GetMedium(this IEnumerator<CssToken> tokens)
{
CssToken current = tokens.Current;
CssMedium cssMedium = new CssMedium();
if (current.Type == CssTokenType.Ident) {
string data = current.Data;
if (string.Compare(data, Keywords.Not, StringComparison.OrdinalIgnoreCase) == 0) {
tokens.MoveNext();
cssMedium.IsInverse = true;
} else if (string.Compare(data, Keywords.Only, StringComparison.OrdinalIgnoreCase) == 0) {
tokens.MoveNext();
cssMedium.IsExclusive = true;
}
}
return cssMedium;
}
public static void SkipUnknownRule(this IEnumerator<CssToken> tokens)
{
int num = 0;
int num2 = 0;
int num3 = 0;
bool flag = true;
do {
switch (tokens.Current.Type) {
case CssTokenType.Semicolon:
flag = (num > 0 || num2 > 0 || num3 > 0);
break;
case CssTokenType.CurlyBracketClose:
num--;
flag = (num > 0 || num2 > 0 || num3 > 0);
break;
case CssTokenType.Function:
case CssTokenType.RoundBracketOpen:
num2++;
break;
case CssTokenType.RoundBracketClose:
num2--;
break;
case CssTokenType.SquareBracketClose:
num3--;
break;
case CssTokenType.SquareBracketOpen:
num3++;
break;
case CssTokenType.CurlyBracketOpen:
num++;
break;
}
} while (flag && tokens.MoveNext());
}
public static ICssValue ToUnit(this CssUnitToken token)
{
if (token.Type == CssTokenType.Percentage)
return new Percent(token.Value);
return Factory.Units.Create(token.Value, token.Unit.ToLowerInvariant());
}
}
}