protected void ImplSetAttribute(DomAttribute attr) { //handle some attribute //special for some attributes switch ((WellknownName)attr.LocalNameIndex) { case WellknownName.Style: { //TODO: parse and evaluate style here //**** WebDom.Parser.CssParser miniCssParser = CssParserPool.GetFreeParser(); //parse and evaluate the ruleset CssRuleSet parsedRuleSet = miniCssParser.ParseCssPropertyDeclarationList(attr.Value.ToCharArray()); Css.BoxSpec spec = null; if (this.ParentNode != null) { spec = ((HtmlElement)this.ParentNode).Spec; } foreach (WebDom.CssPropertyDeclaration propDecl in parsedRuleSet.GetAssignmentIter()) { SpecSetter.AssignPropertyValue( _boxSpec, spec, propDecl); } CssParserPool.ReleaseParser(ref miniCssParser); } break; } }
public override void SetAttribute(DomAttribute attr) { base.SetAttribute(attr); //to base //---------------------- switch ((WellknownName)attr.LocalNameIndex) { case WellknownName.Src: { switch (this.WellknownElementName) { case WellKnownDomNodeName.img: { if (_principalBox != null) { CssBoxImage boxImg = (CssBoxImage)_principalBox; boxImg.ImageBinder = new ImageBinder(attr.Value); boxImg.InvalidateGraphics(); } } break; } } break; case WellknownName.Style: { //TODO: parse and evaluate style here //**** WebDom.Parser.CssParser miniCssParser = CssParserPool.GetFreeParser(); //parse and evaluate the ruleset CssRuleSet parsedRuleSet = miniCssParser.ParseCssPropertyDeclarationList(attr.Value.ToCharArray()); Css.BoxSpec spec = null; if (this.ParentNode != null) { spec = ((HtmlElement)this.ParentNode).Spec; } foreach (WebDom.CssPropertyDeclaration propDecl in parsedRuleSet.GetAssignmentIter()) { SpecSetter.AssignPropertyValue( _boxSpec, spec, propDecl); } CssParserPool.ReleaseParser(ref miniCssParser); } break; } }
void ApplyStyleSheetForSingleHtmlElement( HtmlElement element, BoxSpec parentSpec, TopDownActiveCssTemplate activeCssTemplate) { BoxSpec curSpec = element.Spec; BoxSpec.InheritStyles(curSpec, parentSpec); //-------------------------------- string classValue = null; if (element.HasAttributeClass) { classValue = element.AttrClassValue; } //-------------------------------- //1. apply style activeCssTemplate.ApplyCacheTemplate(element.LocalName, classValue,//class curSpec, parentSpec); //------------------------------------------------------------------- //2. specific id if (element.HasAttributeElementId) { // element.ElementId; activeCssTemplate.ApplyActiveTemplateForSpecificElementId(element); } //3. some html translate attributes if (element.WellknownElementName != WellKnownDomNodeName.svg) { //translate svg attributes AssignStylesFromTranslatedAttributesHTML5(element); } else { AssignSvgAttributes(element); } //------------------------------------------------------------------- //4. style attribute value //'style' object of this element if (!element.IsStyleEvaluated) { CssRuleSet parsedRuleSet = null; string attrStyleValue; if (element.TryGetAttribute(WellknownName.Style, out attrStyleValue)) { //parse and evaluate the ruleset parsedRuleSet = _miniCssParser.ParseCssPropertyDeclarationList(attrStyleValue.ToCharArray()); foreach (WebDom.CssPropertyDeclaration propDecl in parsedRuleSet.GetAssignmentIter()) { SpecSetter.AssignPropertyValue( curSpec, parentSpec, propDecl); } } else { } //---------------------------------------------------------------- element.IsStyleEvaluated = true; element.ElementRuleSet = parsedRuleSet; } else { var elemRuleSet = element.ElementRuleSet; if (elemRuleSet != null) { if (curSpec.IsFreezed) { curSpec.Defreeze(); //var newspec = new BoxSpec(); //BoxSpec.CloneAllStyles(newspec, curSpec); //curSpec = newspec; //element.Spec = curSpec; } foreach (WebDom.CssPropertyDeclaration propDecl in elemRuleSet.GetAssignmentIter()) { SpecSetter.AssignPropertyValue( curSpec, parentSpec, propDecl); } } } //===================== curSpec.Freeze(); //*** //===================== }