[MethodImpl(MethodImplOptions.AggressiveInlining)]// Private static function called in loops, inline it static CssFunction Consume_Function(DataConsumer <CssToken> Stream) { if (Stream is null) { throw new CssParserException(CssErrors.STREAM_IS_NULL); } if (Stream.Next.Type != ECssTokenType.FunctionName) { throw new CssParserException(CssErrors.EXPECTING_FUNCTION_NAME_TOKEN, Stream); } var name = (Stream.Next as FunctionNameToken).Value; CssFunction Func = new CssFunction(name); CssToken Token; do { Token = Stream.Consume(); switch (Token.Type) { case ECssTokenType.EOF: case ECssTokenType.Parenth_Close: return(Func); default: Stream.Reconsume(); Func.Arguments.Add(Consume_ComponentValue(Stream)); break; } }while (Token.Type != ECssTokenType.EOF); return(Func); }
public void GetFunctionArguments(string cssFunc, int numberOfArgs) { var cssFunction = new CssFunction(cssFunc); var args = cssFunction.Arguments; Assert.AreEqual(args.Count, numberOfArgs); }
public void GetFunctionNameTest(string cssFunctionString, string name) { var cssFunction = new CssFunction(cssFunctionString); var funcName = cssFunction.FunctionName; Assert.AreEqual(funcName, name); }
static PseudoElementSelector Consume_Pseudo_Element_Selector(DataConsumer <CssToken> Stream) { Stream.Consume(2);// Consume the '::' prefix switch (Stream.Next.Type) { case ECssTokenType.Ident: { return(new PseudoElementSelector(Stream.Consume <IdentToken>().Value)); } case ECssTokenType.FunctionName: { throw new CssParserException("Encountered unexpected 'FunctionNameToken' in parsed list (Should have been turned into a 'CssFunction' token already!)"); } case ECssTokenType.Function: { CssFunction func = Stream.Consume <CssFunction>(); return(new CssPseudoElementSelectorFunction(func.Name, func.Arguments)); } } return(null); }
public static CssValue Consume_CssValue(DataConsumer <CssToken> Stream) { if (Stream is null) { throw new CssParserException(CssErrors.STREAM_IS_NULL); } Contract.EndContractBlock(); CssToken Token = Stream.Next; switch (Token.Type) { case ECssTokenType.Dimension: { var tok = Stream.Consume() as DimensionToken; ECssUnit unit = ECssUnit.PX; if (!string.IsNullOrEmpty(tok.Unit)) { ECssUnit unitLookup = Lookup.Enum <ECssUnit>(tok.Unit); unit = unitLookup; } return(new CssValue(ECssValueTypes.DIMENSION, tok.Number, unit)); } case ECssTokenType.Number: { var tok = Stream.Consume() as NumberToken; return(new CssValue(ECssValueTypes.NUMBER, tok.Number)); } case ECssTokenType.Percentage: { var tok = Stream.Consume() as PercentageToken; return(new CssValue(ECssValueTypes.PERCENT, tok.Number)); } case ECssTokenType.String: { var tok = Stream.Consume() as StringToken; return(new CssValue(ECssValueTypes.STRING, tok.Value)); } case ECssTokenType.Ident: // Keyword { var tok = Stream.Consume() as IdentToken; return(new CssValue(ECssValueTypes.KEYWORD, tok.Value)); } case ECssTokenType.FunctionName: { CssFunction func = Consume_Function(Stream); return(new CssValue(func)); } case ECssTokenType.Function: { var func = Stream.Consume() as CssFunction; return(new CssValue(func)); } case ECssTokenType.Url: { /* XXX: Finish this */ throw new NotSupportedException("URL values are not supported as of yet!"); } case ECssTokenType.EOF: { return(CssValue.Null); } default: { throw new CssParserException(String.Format(CultureInfo.InvariantCulture, CssErrors.UNHANDLED_TOKEN_FOR_CSS_VALUE, Token.Type), Stream); } } }
public void CssFunctionTest(string cssFunctionString) { var cssFunction = new CssFunction(cssFunctionString); Assert.IsNotNull(cssFunction); }