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; }
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; } }
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; } }
static CssPropertyDeclaration CloneProp(WellknownCssPropertyName newName, CssCodeValueExpression prop) { return new CssPropertyDeclaration(newName, prop); }