示例#1
0
 void Reset()
 {
     cssDocument = new CssDocument();
     _currentAtMedia = new CssAtMedia();
     cssDocument.Add(_currentAtMedia);
     _mediaStack.Clear();
     this._currentSelectorAttr = null;
     this._currentSelectorExpr = null;
     this._currentProperty = null;
     this._latestPropertyValue = null;
 }
示例#2
0
        static void SetPropertyValue(BoxSpec spec, WebDom.CssPropertyDeclaration decl)
        {
            //assign property
            CssCodeValueExpression cssValue = decl.GetPropertyValue(0);

            switch (decl.WellknownPropertyName)
            {
            case WellknownCssPropertyName.Display:
                spec.CssDisplay = UserMapUtil.GetDisplayType(cssValue);
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.BorderBottomWidth:
                spec.BorderBottomWidth = cssValue.AsBorderLength();
                break;

            case WellknownCssPropertyName.BorderLeftWidth:
                spec.BorderLeftWidth = cssValue.AsBorderLength();
                break;

            case WellknownCssPropertyName.BorderRightWidth:
                spec.BorderRightWidth = cssValue.AsBorderLength();
                break;

            case WellknownCssPropertyName.BorderTopWidth:
                spec.BorderTopWidth = cssValue.AsBorderLength();
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.BorderBottomStyle:
                spec.BorderBottomStyle = UserMapUtil.GetBorderStyle(cssValue);
                break;

            case WellknownCssPropertyName.BorderLeftStyle:
                spec.BorderLeftStyle = UserMapUtil.GetBorderStyle(cssValue);
                break;

            case WellknownCssPropertyName.BorderRightStyle:
                spec.BorderRightStyle = UserMapUtil.GetBorderStyle(cssValue);
                break;

            case WellknownCssPropertyName.BorderTopStyle:
                spec.BorderTopStyle = UserMapUtil.GetBorderStyle(cssValue);
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.BorderBottomColor:
                spec.BorderBottomColor = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.BorderLeftColor:
                spec.BorderLeftColor = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.BorderRightColor:
                spec.BorderRightColor = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.BorderTopColor:
                spec.BorderTopColor = AsColor(cssValue);;
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.BorderSpacing:

                SetBorderSpacing(spec, cssValue);
                break;

            case WellknownCssPropertyName.BorderCollapse:
                spec.BorderCollapse = UserMapUtil.GetBorderCollapse(cssValue);
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.BoxSizing:
                spec.BoxSizing = UserMapUtil.GetBoxSizing(cssValue);
                break;

            case WellknownCssPropertyName.BoxShadow:
                SetBoxShadow(spec, decl);
                break;

            case WellknownCssPropertyName.CornerRadius:

                SetCornerRadius(spec, cssValue);
                break;

            case WellknownCssPropertyName.CornerNWRadius:
                spec.CornerNWRadius = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.CornerNERadius:
                spec.CornerNERadius = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.CornerSERadius:
                spec.CornerSERadius = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.CornerSWRadius:
                spec.CornerSWRadius = cssValue.AsLength();
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.MarginBottom:
                spec.MarginBottom = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.MarginLeft:
                spec.MarginLeft = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.MarginRight:
                spec.MarginRight = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.MarginTop:
                spec.MarginTop = cssValue.AsTranslatedLength();
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.PaddingBottom:
                spec.PaddingBottom = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.PaddingLeft:
                spec.PaddingLeft = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.PaddingRight:
                spec.PaddingRight = cssValue.AsTranslatedLength();
                break;

            case WellknownCssPropertyName.PaddingTop:
                spec.PaddingTop = cssValue.AsTranslatedLength();
                break;

            //------------------------------------------------
            case WellknownCssPropertyName.Left:
                spec.Left = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.Top:
                spec.Top = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.Width:
                spec.Width = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.MaxWidth:
                spec.MaxWidth = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.Height:
                spec.Height = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.BackgroundColor:
                spec.BackgroundColor = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.BackgroundImage:
                spec.BackgroundImageBinder = new ClientImageBinder(cssValue.GetTranslatedStringValue());
                break;

            case WellknownCssPropertyName.BackgroundPosition:
                SetBackgroundPosition(spec, cssValue);
                break;

            case WellknownCssPropertyName.BackgroundRepeat:
                spec.BackgroundRepeat = UserMapUtil.GetBackgroundRepeat(cssValue);
                break;

            case WellknownCssPropertyName.BackgroundGradient:
                spec.BackgroundGradient = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.BackgroundGradientAngle:
                spec.BackgroundGradientAngle = cssValue.AsNumber();
                break;

            case WellknownCssPropertyName.Color:
                spec.Color = AsColor(cssValue);
                break;

            case WellknownCssPropertyName.Direction:
                spec.CssDirection = UserMapUtil.GetCssDirection(cssValue);
                break;

            case WellknownCssPropertyName.EmptyCells:
                spec.EmptyCells = UserMapUtil.GetEmptyCell(cssValue);
                break;

            case WellknownCssPropertyName.Float:
                spec.Float = UserMapUtil.GetFloat(cssValue);
                break;

            case WellknownCssPropertyName.Position:
                spec.Position = UserMapUtil.GetCssPosition(cssValue);
                break;

            case WellknownCssPropertyName.LineHeight:
                spec.LineHeight = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.VerticalAlign:
                spec.VerticalAlign = UserMapUtil.GetVerticalAlign(cssValue);
                break;

            case WellknownCssPropertyName.TextIndent:
                spec.TextIndent = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.TextAlign:

                spec.CssTextAlign = UserMapUtil.GetTextAlign(cssValue);
                break;

            case WellknownCssPropertyName.TextDecoration:
                spec.TextDecoration = UserMapUtil.GetTextDecoration(cssValue);
                break;

            case WellknownCssPropertyName.Whitespace:
                spec.WhiteSpace = UserMapUtil.GetWhitespace(cssValue);
                break;

            case WellknownCssPropertyName.WordBreak:
                spec.WordBreak = UserMapUtil.GetWordBreak(cssValue);
                break;

            case WellknownCssPropertyName.Visibility:
                spec.Visibility = UserMapUtil.GetVisibility(cssValue);
                break;

            case WellknownCssPropertyName.WordSpacing:
                spec.WordSpacing = cssValue.AsLength();
                break;

            case WellknownCssPropertyName.FontFamily:
                spec.FontFamily = cssValue.GetTranslatedStringValue();
                break;

            case WellknownCssPropertyName.FontSize:

                SetFontSize(spec, cssValue);
                break;

            case WellknownCssPropertyName.FontStyle:
                spec.FontStyle = UserMapUtil.GetFontStyle(cssValue);
                break;

            case WellknownCssPropertyName.FontVariant:
                spec.FontVariant = UserMapUtil.GetFontVariant(cssValue);
                break;

            case WellknownCssPropertyName.FontWeight:
                spec.FontWeight = UserMapUtil.GetFontWeight(cssValue);
                break;

            case WellknownCssPropertyName.ListStyle:
                spec.ListStyle = cssValue.GetTranslatedStringValue();
                break;

            case WellknownCssPropertyName.ListStylePosition:
                spec.ListStylePosition = UserMapUtil.GetListStylePosition(cssValue);
                break;

            case WellknownCssPropertyName.ListStyleImage:
                spec.ListStyleImage = cssValue.GetTranslatedStringValue();
                break;

            case WellknownCssPropertyName.ListStyleType:
                spec.ListStyleType = UserMapUtil.GetListStyleType(cssValue);
                break;

            case WellknownCssPropertyName.Overflow:
                spec.Overflow = UserMapUtil.GetOverflow(cssValue);
                break;

            //------------------------------------------------
            //for flex container
            case WellknownCssPropertyName.Flex:
            {
                //TODO: implement this
            }
            break;

            case WellknownCssPropertyName.FlexDirection:
            {
                //TODO: implement this
            }
            break;

            case WellknownCssPropertyName.FlexFlow:
            {
                //TODO: implement this
            }
            break;

            case WellknownCssPropertyName.FlexWrap:
            {
                //TODO: implement this
            }
            break;

            //------------------------------------------------
            //for flex item
            case WellknownCssPropertyName.FlexGrow:
                spec.FlexGrow = (int)cssValue.AsNumber();
                break;

            case WellknownCssPropertyName.FlexShrink:
                spec.FlexShrink = (int)cssValue.AsNumber();
                break;

            case WellknownCssPropertyName.FlexOrder:
                spec.FlexOrder = (int)cssValue.AsNumber();
                break;

            //------------------------------------------------
            //experiment : for container
            case WellknownCssPropertyName.FlexExtensionNum:
                spec.FlexExtensionNum = (int)cssValue.AsNumber();
                break;

            //experiment : for space part
            case WellknownCssPropertyName.FlexExtensionPart:
                spec.FlexExtensionPart = (int)cssValue.AsNumber();
                break;
            }
        }
示例#3
0
        void LexerEmitHandler(CssTokenName tkname, int start, int len)
        {
            switch (parseState)
            {
                default:
                    {
                        throw new NotSupportedException();
                    }
                    break;
                case CssParseState.Init:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.Comment:
                                {
                                    //comment token  
                                }
                                break;
                            case CssTokenName.RBrace:
                                {
                                    //exit from current ruleset block
                                    if (this._mediaStack.Count > 0)
                                    {
                                        this._currentAtMedia = this._mediaStack.Pop();
                                    }
                                }
                                break;
                            case CssTokenName.Star:
                                {
                                    //start new code block 
                                    CssRuleSet newblock;
                                    this._currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector(SimpleElementSelectorKind.All));
                                    parseState = CssParseState.MoreBlockName;
                                }
                                break;
                            case CssTokenName.At:
                                {
                                    //at rule                                    
                                    parseState = CssParseState.ExpectAtRuleName;
                                }
                                break;
                            //--------------------------------------------------
                            //1.
                            case CssTokenName.Colon:
                                {
                                    CssRuleSet newblock;
                                    _currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector(SimpleElementSelectorKind.PseudoClass));
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //2.
                            case CssTokenName.Dot:
                                {
                                    CssRuleSet newblock;
                                    _currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector(SimpleElementSelectorKind.ClassName));
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //3. 
                            case CssTokenName.DoubleColon:
                                {
                                    CssRuleSet newblock;
                                    _currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector(SimpleElementSelectorKind.Extend));
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //4.
                            case CssTokenName.Iden:
                                {
                                    //block name
                                    CssRuleSet newblock;
                                    _currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector());
                                    this._currentSelectorExpr.Name = new string(this.textBuffer, start, len);
                                    parseState = CssParseState.MoreBlockName;
                                }
                                break;
                            //5. 
                            case CssTokenName.Sharp:
                                {
                                    CssRuleSet newblock;
                                    _currentAtMedia.AddRuleSet(this._currentRuleSet = newblock = new CssRuleSet());
                                    newblock.AddSelector(this._currentSelectorExpr = new CssSimpleElementSelector(SimpleElementSelectorKind.Id));
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.MoreBlockName:
                    {
                        //more 
                        switch (tkname)
                        {
                            case CssTokenName.LBrace:
                                {
                                    //block body
                                    parseState = CssParseState.BlockBody;
                                }
                                break;
                            case CssTokenName.LBracket:
                                {
                                    //element attr
                                    parseState = CssParseState.ExpectBlockAttrIden;
                                }
                                break;
                            //1. 
                            case CssTokenName.Colon:
                                {
                                    //wait iden after colon
                                    var cssSelector = new CssSimpleElementSelector();
                                    cssSelector.selectorType = SimpleElementSelectorKind.PseudoClass;
                                    _currentRuleSet.AddSelector(cssSelector);
                                    this._currentSelectorExpr = cssSelector;
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //2. 
                            case CssTokenName.Dot:
                                {
                                    var cssSelector = new CssSimpleElementSelector();
                                    cssSelector.selectorType = SimpleElementSelectorKind.ClassName;
                                    _currentRuleSet.AddSelector(cssSelector);
                                    this._currentSelectorExpr = cssSelector;
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //3. 
                            case CssTokenName.DoubleColon:
                                {
                                    var cssSelector = new CssSimpleElementSelector();
                                    cssSelector.selectorType = SimpleElementSelectorKind.Extend;
                                    _currentRuleSet.AddSelector(cssSelector);
                                    this._currentSelectorExpr = cssSelector;
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //4. 
                            case CssTokenName.Iden:
                                {
                                    //add more block name                                     
                                    var cssSelector = new CssSimpleElementSelector();
                                    cssSelector.selectorType = SimpleElementSelectorKind.TagName;
                                    cssSelector.Name = new string(this.textBuffer, start, len);
                                    _currentRuleSet.AddSelector(cssSelector);
                                    this._currentSelectorExpr = cssSelector;
                                }
                                break;
                            //5. 
                            case CssTokenName.Sharp:
                                {
                                    //id
                                    var cssSelector = new CssSimpleElementSelector();
                                    cssSelector.selectorType = SimpleElementSelectorKind.Id;
                                    _currentRuleSet.AddSelector(cssSelector);
                                    this._currentSelectorExpr = cssSelector;
                                    parseState = CssParseState.ExpectIdenAfterSpecialBlockNameSymbol;
                                }
                                break;
                            //----------------------------------------------------
                               
                            //element combinator operators
                            case CssTokenName.Comma:
                                {
                                    this._currentRuleSet.PrepareExpression(CssCombinatorOperator.List);
                                }
                                break;
                            case CssTokenName.Star:
                                {
                                }break;

                            case CssTokenName.RAngle:
                                {
                                }
                                break;
                            case CssTokenName.Plus:
                                {
                                }
                                break;
                            case CssTokenName.Tile:
                                {
                                }
                                break;
                            //----------------------------------------------------
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.ExpectIdenAfterSpecialBlockNameSymbol:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.Iden:
                                {
                                    this._currentSelectorExpr.Name = new string(this.textBuffer, start, len);
                                    parseState = CssParseState.MoreBlockName;
                                }
                                break;
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                        }
                    }
                    break;
                case CssParseState.ExpectBlockAttrIden:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.Iden:
                                {
                                    //attribute  
                                    parseState = CssParseState.AfterAttrName;
                                    this._currentSelectorExpr.AddAttribute(this._currentSelectorAttr = new CssAttributeSelectorExpression());
                                    this._currentSelectorAttr.AttributeName = new string(this.textBuffer, start, len);
                                }
                                break;
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.AfterAttrName:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.OpEq:
                                {
                                    parseState = CssParseState.ExpectedBlockAttrValue;
                                    //expected  attr value
                                }
                                break;
                            case CssTokenName.RBracket:
                                {
                                    //no attr value
                                    parseState = CssParseState.MoreBlockName;
                                }
                                break;
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.ExpectedBlockAttrValue:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.LiteralString:
                                {
                                    this._currentSelectorAttr.valueExpression = this._latestPropertyValue =
                                        new CssCodePrimitiveExpression(new string(this.textBuffer, start, len), CssValueHint.LiteralString);
                                    this._currentSelectorAttr = null;
                                }
                                break;
                            default:
                                {
                                }
                                break;
                        }
                        parseState = CssParseState.AfterBlockNameAttr;
                    }
                    break;
                case CssParseState.AfterBlockNameAttr:
                    {
                        switch (tkname)
                        {
                            default:
                                {
                                }
                                break;
                            case CssTokenName.RBracket:
                                {
                                    parseState = CssParseState.MoreBlockName;
                                    this._currentSelectorAttr = null;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.BlockBody:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.Iden:
                                {
                                    //block name

                                    //create css property 
                                    string cssPropName = new string(this.textBuffer, start, len);
                                    var wellknownName = UserMapUtil.GetWellKnownPropName(cssPropName);
                                    if (wellknownName == WellknownCssPropertyName.Unknown)
                                    {
                                        _currentRuleSet.AddCssCodeProperty(this._currentProperty =
                                            new CssPropertyDeclaration(cssPropName));
                                    }
                                    else
                                    {
                                        _currentRuleSet.AddCssCodeProperty(this._currentProperty =
                                            new CssPropertyDeclaration(wellknownName));
                                    }
                                    this._latestPropertyValue = null;
                                    parseState = CssParseState.AfterPropertyName;
                                }
                                break;
                            case CssTokenName.RBrace:
                                {
                                    //close current block
                                    this._currentProperty = null;
                                    this._currentSelectorAttr = null;
                                    this._currentSelectorExpr = null;
                                    parseState = CssParseState.Init;
                                }
                                break;
                            case CssTokenName.SemiColon:
                                {
                                    //another semi colon just skip
                                }
                                break;
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.AfterPropertyName:
                    {
                        if (tkname == CssTokenName.Colon)
                        {
                            parseState = CssParseState.ExpectPropertyValue;
                        }
                        else
                        {
                            throw new NotSupportedException();
                        }
                    }
                    break;
                case CssParseState.ExpectPropertyValue:
                    {
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.Sharp:
                                {
                                    //follow by hex color value
                                    parseState = CssParseState.ExpectValueOfHexColor;
                                }
                                break;
                            case CssTokenName.LiteralString:
                                {
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                         new CssCodePrimitiveExpression(new string(this.textBuffer, start, len), CssValueHint.LiteralString));
                                    parseState = CssParseState.AfterPropertyValue;
                                }
                                break;
                            case CssTokenName.Number:
                                {
                                    float number = float.Parse(new string(this.textBuffer, start, len));
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                          new CssCodePrimitiveExpression(number));
                                    parseState = CssParseState.AfterPropertyValue;
                                }
                                break;
                            case CssTokenName.NumberUnit:
                                {
                                }
                                break;
                            case CssTokenName.Iden:
                                {
                                    //property value
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                        new CssCodePrimitiveExpression(new string(this.textBuffer, start, len), CssValueHint.Iden));
                                    parseState = CssParseState.AfterPropertyValue;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.ExpectValueOfHexColor:
                    {
                        switch (tkname)
                        {
                            case CssTokenName.Iden:
                                {
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                       new CssCodePrimitiveExpression("#" + new string(this.textBuffer, start, len),
                                           CssValueHint.HexColor));
                                }
                                break;
                            case CssTokenName.Number:
                                {
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                         new CssCodePrimitiveExpression("#" + new string(this.textBuffer, start, len),
                                             CssValueHint.HexColor));
                                }
                                break;
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                        }
                        parseState = CssParseState.AfterPropertyValue;
                    }
                    break;
                case CssParseState.AfterPropertyValue:
                    {
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.Comma:
                                {
                                    //skip comma
                                }
                                break;
                            case CssTokenName.Percent:
                                {
                                    if (_latestPropertyValue is CssCodePrimitiveExpression)
                                    {
                                        ((CssCodePrimitiveExpression)_latestPropertyValue).Unit = "%";
                                    }
                                }
                                break;
                            case CssTokenName.Divide:
                                {
                                    //eg. font: style variant weight size/line-height family;

                                    CssCodeBinaryExpression codeBinaryOpExpr = new CssCodeBinaryExpression();
                                    codeBinaryOpExpr.OpName = CssValueOpName.Divide;
                                    codeBinaryOpExpr.Left = this._latestPropertyValue;
                                    //replace previous add value ***
                                    int valueCount = this._currentProperty.ValueCount;
                                    //replace
                                    this._currentProperty.ReplaceValue(valueCount - 1, codeBinaryOpExpr);
                                    this._latestPropertyValue = codeBinaryOpExpr;
                                }
                                break;
                            case CssTokenName.LiteralString:
                                {
                                    var literalValue = new string(this.textBuffer, start, len);
                                    throw new NotSupportedException();
                                }
                                break;
                            case CssTokenName.LParen:
                                {
                                    //function 
                                    parseState = CssParseState.ExpectedFuncParameter;
                                    //make current prop value as func
                                    CssCodeFunctionCallExpression funcCallExpr = new CssCodeFunctionCallExpression(
                                        this._latestPropertyValue.ToString());
                                    int valueCount = this._currentProperty.ValueCount;
                                    this._currentProperty.ReplaceValue(valueCount - 1, funcCallExpr);
                                    this._latestPropertyValue = funcCallExpr;
                                }
                                break;
                            case CssTokenName.RBrace:
                                {
                                    //close block
                                    parseState = CssParseState.Init;
                                }
                                break;
                            case CssTokenName.SemiColon:
                                {
                                    //start new proeprty
                                    parseState = CssParseState.BlockBody;
                                    this._currentProperty = null;
                                }
                                break;
                            case CssTokenName.Iden:
                                {
                                    //another property value                                     
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                        new CssCodePrimitiveExpression(new string(this.textBuffer, start, len), CssValueHint.Iden));
                                }
                                break;
                            case CssTokenName.Number:
                                {
                                    //another property value
                                    float number = float.Parse(new string(this.textBuffer, start, len));
                                    this._currentProperty.AddValue(this._latestPropertyValue =
                                        new CssCodePrimitiveExpression(number));
                                }
                                break;
                            case CssTokenName.NumberUnit:
                                {
                                    //number unit 
                                    if (_latestPropertyValue is CssCodePrimitiveExpression)
                                    {
                                        ((CssCodePrimitiveExpression)_latestPropertyValue).Unit = new string(this.textBuffer, start, len);
                                    }
                                }
                                break;
                            case CssTokenName.Sharp:
                                {
                                    parseState = CssParseState.ExpectValueOfHexColor;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.ExpectAtRuleName:
                    {
                        //iden
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.Iden:
                                {
                                    string iden = new string(this.textBuffer, start, len);
                                    //create new rule
                                    _currentRuleSet = null;
                                    _currentProperty = null;
                                    _currentSelectorAttr = null;
                                    _currentSelectorExpr = null;
                                    switch (iden)
                                    {
                                        case "media":
                                            {
                                                parseState = CssParseState.MediaList;
                                                //store previous media 
                                                if (this._currentAtMedia != null)
                                                {
                                                    this._mediaStack.Push(this._currentAtMedia);
                                                }

                                                this.cssDocument.Add(this._currentAtMedia = new CssAtMedia());
                                            }
                                            break;
                                        case "import":
                                            {
                                                parseState = CssParseState.ExpectImportURL;
                                            }
                                            break;
                                        case "page":
                                            {
                                                throw new NotSupportedException();
                                            }
                                            break;
                                        default:
                                            {
                                                throw new NotSupportedException();
                                            }
                                            break;
                                    }
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.MediaList:
                    {
                        //medialist sep by comma
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.Iden:
                                {
                                    //media name                                     
                                    this._currentAtMedia.AddMedia(new string(this.textBuffer, start, len));
                                }
                                break;
                            case CssTokenName.Comma:
                                {
                                    //wait for another media
                                }
                                break;
                            case CssTokenName.LBrace:
                                {
                                    //begin rule set part
                                    parseState = CssParseState.Init;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.ExpectedFuncParameter:
                    {
                        string funcArg = new string(this.textBuffer, start, len);
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.RParen:
                                {
                                    this.parseState = CssParseState.AfterPropertyValue;
                                }
                                break;
                            case CssTokenName.LiteralString:
                                {
                                    ((CssCodeFunctionCallExpression)this._latestPropertyValue).AddFuncArg(
                                        new CssCodePrimitiveExpression(funcArg, CssValueHint.LiteralString));
                                    this.parseState = CssParseState.AfterFuncParameter;
                                }
                                break;
                            case CssTokenName.Number:
                                {
                                    float number = float.Parse(funcArg);
                                    ((CssCodeFunctionCallExpression)this._latestPropertyValue).AddFuncArg(
                                          new CssCodePrimitiveExpression(number));
                                    this.parseState = CssParseState.AfterFuncParameter;
                                }
                                break;
                            case CssTokenName.Iden:
                                {
                                    ((CssCodeFunctionCallExpression)this._latestPropertyValue).AddFuncArg(
                                        new CssCodePrimitiveExpression(funcArg, CssValueHint.Iden));
                                    this.parseState = CssParseState.AfterFuncParameter;
                                }
                                break;
                        }
                    }
                    break;
                case CssParseState.AfterFuncParameter:
                    {
                        switch (tkname)
                        {
                            default:
                                {
                                    throw new NotSupportedException();
                                }
                            case CssTokenName.RParen:
                                {
                                    this.parseState = CssParseState.AfterPropertyValue;
                                }
                                break;
                            case CssTokenName.Comma:
                                {
                                    this.parseState = CssParseState.ExpectedFuncParameter;
                                }
                                break;
                        }
                    }
                    break;
            }
        }
示例#4
0
 static CssPropertyDeclaration CloneProp(WellknownCssPropertyName newName, CssCodeValueExpression prop)
 {
     return new CssPropertyDeclaration(newName, prop);
 }