AngleSharp by Florian Rappl

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

 CssParserExtensions

static class 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()); } } }