/// <summary> /// Creates a new keyframe-rule from the given source. /// </summary> /// <param name="source">The token iterator.</param> /// <returns>The keyframe-rule.</returns> CSSKeyframeRule CreateKeyframeRule(IEnumerator <CssToken> source) { var keyframe = new CSSKeyframeRule(); keyframe.ParentStyleSheet = sheet; keyframe.ParentRule = CurrentRule; open.Push(keyframe); do { if (source.Current.Type == CssTokenType.CurlyBracketOpen) { if (SkipToNextNonWhitespace(source)) { var tokens = LimitToCurrentBlock(source); AppendDeclarations(tokens.GetEnumerator(), keyframe.Style.List); } break; } buffer.Append(source.Current.ToString()); }while (source.MoveNext()); keyframe.KeyText = buffer.ToString(); buffer.Clear(); open.Pop(); return(keyframe); }
/// <summary> /// Takes a string and transforms it into a CSS keyframe rule. /// </summary> /// <param name="rule">The string to parse.</param> /// <param name="quirksMode">Optional: The status of the quirks mode flag (usually not set).</param> /// <returns>The CSSKeyframeRule object.</returns> internal static CSSKeyframeRule ParseKeyframeRule(String rule, Boolean quirksMode = false) { var parser = new CssParser(rule); var keyframe = new CSSKeyframeRule(); parser.AddRule(keyframe); parser.IsQuirksMode = quirksMode; parser.skipExceptions = false; parser.state = CssState.InKeyframeText; parser.Parse(); return(keyframe); }
/// <summary> /// Called in the text for a frame in the @keyframes rule. /// </summary> /// <param name="token">The current token.</param> /// <returns>The status.</returns> Boolean InKeyframeText(CssToken token) { if (token.Type == CssTokenType.CurlyBracketOpen) { var frame = new CSSKeyframeRule(); frame.KeyText = buffer.ToPool(); AddRule(frame); SwitchTo(CssState.InDeclaration); return(true); } else if (token.Type == CssTokenType.CurlyBracketClose) { buffer.ToPool(); KeyframesData(token); return(false); } buffer.Append(token.ToValue()); return(true); }