public static CssBox CreateTableColumnOrColumnGroup(CssBox parent, HtmlElement childElement, bool fixDisplayType, CssDisplay selectedCssDisplayType) { CssBox col = null; if (fixDisplayType) { col = new CssBox(childElement.Spec, parent.RootGfx, selectedCssDisplayType); } else { col = new CssBox(childElement.Spec, parent.RootGfx); } col.SetController(childElement); parent.AppendChild(col); string spanValue; int spanNum = 1;//default if (childElement.TryGetAttribute(WellknownName.Span, out spanValue)) { if (!int.TryParse(spanValue, out spanNum)) { spanNum = 1; } if (spanNum < 0) { spanNum = -spanNum; } } col.SetRowSpanAndColSpan(1, spanNum); return col; }
public static CssBox CreateTableCell(CssBox parent, HtmlElement childElement, bool fixDisplayType) { CssBox tableCell = null; if (fixDisplayType) { tableCell = new CssBox(childElement.Spec, parent.RootGfx, CssDisplay.TableCell); } else { tableCell = new CssBox(childElement.Spec, parent.RootGfx); } tableCell.SetController(childElement); parent.AppendChild(tableCell); //---------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------- //get rowspan and colspan here int nRowSpan = 1; int nColSpan = 1; string rowspan; if (childElement.TryGetAttribute(WellknownName.RowSpan, out rowspan)) { if (!int.TryParse(rowspan, out nRowSpan)) { nRowSpan = 1; } } string colspan; if (childElement.TryGetAttribute(WellknownName.ColSpan, out colspan)) { if (!int.TryParse(colspan, out nColSpan)) { nColSpan = 1; } } //---------------------------------------------------------- tableCell.SetRowSpanAndColSpan(nRowSpan, nColSpan); return tableCell; }
CssBox CreateImageBox(CssBox parent, HtmlElement childElement) { string imgsrc; ImageBinder imgBinder = null; if (childElement.TryGetAttribute(WellknownName.Src, out imgsrc)) { var clientImageBinder = new ClientImageBinder(imgsrc); imgBinder = clientImageBinder; clientImageBinder.SetOwner(childElement); } else { var clientImageBinder = new ClientImageBinder(null); imgBinder = clientImageBinder; clientImageBinder.SetOwner(childElement); } CssBoxImage boxImage = new CssBoxImage(childElement.Spec, parent.RootGfx, imgBinder); boxImage.SetController(childElement); parent.AppendChild(boxImage); return boxImage; }
static void AssignStylesFromTranslatedAttributesHTML5(HtmlElement tag) { //some html attr contains css value if (tag.AttributeCount > 0) { foreach (var attr in tag.GetAttributeIterForward()) { //attr switch by wellknown property name switch ((WebDom.WellknownName)attr.LocalNameIndex) { case WebDom.WellknownName.Align: { //deprecated in HTML4.1 //string value = attr.Value.ToLower(); //if (value == "left" // || value == "center" // || value == "right" // || value == "justify") //{ // WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( // value, WebDom.CssValueHint.Iden); // box.CssTextAlign = UserMapUtil.GetTextAlign(propValue); //} //else //{ // WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( // value, WebDom.CssValueHint.Iden); // box.VerticalAlign = UserMapUtil.GetVerticalAlign(propValue); //} //break; } break; case WebDom.WellknownName.Background: //deprecated in HTML4.1 //box.BackgroundImageBinder = new ImageBinder(attr.Value.ToLower()); break; case WebDom.WellknownName.BackgroundColor: //deprecated in HTML5 //box.BackgroundColor = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.Border: { //not support in HTML5 //CssLength borderLen = TranslateLength(UserMapUtil.MakeBorderLength(attr.Value.ToLower())); //if (!borderLen.HasError) //{ // if (borderLen.Number > 0) // { // box.BorderLeftStyle = // box.BorderTopStyle = // box.BorderRightStyle = // box.BorderBottomStyle = CssBorderStyle.Solid; // } // box.BorderLeftWidth = // box.BorderTopWidth = // box.BorderRightWidth = // box.BorderBottomWidth = borderLen; // if (tag.WellknownTagName == WellknownHtmlTagName.TABLE && borderLen.Number > 0) // { // //Cascades to the TD's the border spacified in the TABLE tag. // var borderWidth = CssLength.MakePixelLength(1); // ForEachCellInTable(box, cell => // { // //for all cells // cell.BorderLeftStyle = cell.BorderTopStyle = cell.BorderRightStyle = cell.BorderBottomStyle = CssBorderStyle.Solid; // CssConstants.Solid; // cell.BorderLeftWidth = cell.BorderTopWidth = cell.BorderRightWidth = cell.BorderBottomWidth = borderWidth; // }); // } //} } break; case WebDom.WellknownName.BorderColor: //box.BorderLeftColor = // box.BorderTopColor = // box.BorderRightColor = // box.BorderBottomColor = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.CellSpacing: //html5 not support in HTML5, use CSS instead //box.BorderSpacingHorizontal = box.BorderSpacingVertical = TranslateLength(attr); break; case WebDom.WellknownName.CellPadding: { //html5 not support in HTML5, use CSS instead *** // CssLength len01 = UserMapUtil.ParseGenericLength(attr.Value.ToLower()); // if (len01.HasError && (len01.Number > 0)) // { // CssLength len02 = CssLength.MakePixelLength(len01.Number); // ForEachCellInTable(box, cell => // { //#if DEBUG // // cell.dbugBB = dbugTT++; //#endif // cell.PaddingLeft = cell.PaddingTop = cell.PaddingRight = cell.PaddingBottom = len02; // }); // } // else // { // ForEachCellInTable(box, cell => // cell.PaddingLeft = cell.PaddingTop = cell.PaddingRight = cell.PaddingBottom = len01); // } } break; case WebDom.WellknownName.Color: //deprecate // box.Color = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.Dir: { WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( attr.Value.ToLower(), WebDom.CssValueHint.Iden); //assign var spec = tag.Spec; spec.CssDirection = UserMapUtil.GetCssDirection(propValue); } break; case WebDom.WellknownName.Face: //deprecate //box.FontFamily = CssParser.ParseFontFamily(attr.Value.ToLower()); break; case WebDom.WellknownName.Height: { var spec = tag.Spec; spec.Height = TranslateLength(attr); } break; case WebDom.WellknownName.HSpace: //deprecated //box.MarginRight = box.MarginLeft = TranslateLength(attr); break; case WebDom.WellknownName.Nowrap: //deprecate //box.WhiteSpace = CssWhiteSpace.NoWrap; break; case WebDom.WellknownName.Size: { //deprecate //switch (tag.WellknownTagName) //{ // case WellknownHtmlTagName.HR: // { // box.Height = TranslateLength(attr); // } break; // case WellknownHtmlTagName.FONT: // { // var ruleset = activeTemplate.ParseCssBlock("", attr.Value.ToLower()); // foreach (WebDom.CssPropertyDeclaration propDecl in ruleset.GetAssignmentIter()) // { // //assign each property // AssignPropertyValue(box, box.ParentBox, propDecl); // } // //WebDom.CssCodePrimitiveExpression prim = new WebDom.CssCodePrimitiveExpression(value, // //box.SetFontSize(value); // } break; //} } break; case WebDom.WellknownName.VAlign: { //w3.org //valign for table display elements: //col,colgroup,tbody,td,tfoot,th,thead,tr WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( attr.Value.ToLower(), WebDom.CssValueHint.Iden); tag.Spec.VerticalAlign = UserMapUtil.GetVerticalAlign(propValue); } break; case WebDom.WellknownName.VSpace: //deprecated //box.MarginTop = box.MarginBottom = TranslateLength(attr); break; case WebDom.WellknownName.Width: { var spec = tag.Spec; spec.Width = TranslateLength(attr); } break; case WellknownName.Src: { var cssBoxImage = HtmlElement.InternalGetPrincipalBox(tag) as CssBoxImage; if (cssBoxImage != null) { string imgsrc; //ImageBinder imgBinder = null; if (tag.TryGetAttribute(WellknownName.Src, out imgsrc)) { CssBoxImage cssBoxImage1 = HtmlElement.InternalGetPrincipalBox(tag) as CssBoxImage; PixelFarm.Drawing.ImageBinder imgbinder1 = cssBoxImage1.ImageBinder; if (imgbinder1.ImageSource != imgsrc) { //var clientImageBinder = new ClientImageBinder(imgsrc); //imgbinder1 = clientImageBinder; //clientImageBinder.SetOwner(tag); cssBoxImage1.ImageBinder = new PixelFarm.Drawing.ImageBinder(imgsrc); } } else { //var clientImageBinder = new ClientImageBinder(null); //imgBinder = clientImageBinder; //clientImageBinder.SetOwner(tag); } } } break; } } } }
void PrepareStylesAndContentOfChildNodes( HtmlElement parentElement, TopDownActiveCssTemplate activeCssTemplate) { //recursive CssBox principalCssBox = parentElement.CurrentPrincipalBox; bool isblockContext = true;//default if (principalCssBox != null) { isblockContext = principalCssBox.IsBlock; } foreach (WebDom.DomNode node in parentElement.GetChildNodeIterForward()) { activeCssTemplate.EnterLevel(); switch (node.NodeKind) { case WebDom.HtmlNodeKind.OpenElement: case WebDom.HtmlNodeKind.ShortElement: { HtmlElement htmlElement = (HtmlElement)node; htmlElement.WellknownElementName = WellKnownDomNodeMap.EvaluateTagName(htmlElement.LocalName); switch (htmlElement.WellknownElementName) { case WellKnownDomNodeName.style: { //style element should have textnode child int j = htmlElement.ChildrenCount; for (int i = 0; i < j; ++i) { var ch = htmlElement.GetChildNode(i); switch (ch.NodeKind) { case HtmlNodeKind.TextNode: { HtmlTextNode textNode = (HtmlTextNode)htmlElement.GetChildNode(0); activeCssTemplate.LoadRawStyleElementContent(new string(textNode.GetOriginalBuffer())); //break i = j; } break; } } activeCssTemplate.ExitLevel(); continue; } case WellKnownDomNodeName.link: { //<link rel="stylesheet" DomAttribute relAttr; if (htmlElement.TryGetAttribute(WellknownName.Rel, out relAttr)) { //switch link type switch (relAttr.Value.ToLower()) { case "stylesheet": { //if found DomAttribute hrefAttr; if (htmlElement.TryGetAttribute(WellknownName.Href, out hrefAttr)) { string stylesheet = RaiseRequestStyleSheet(hrefAttr.Value); if (stylesheet != null) { activeCssTemplate.LoadRawStyleElementContent(stylesheet); } } } break; case "import": { //load data canbe sync or async DomAttribute hrefAttr; if (htmlElement.TryGetAttribute(WellknownName.Href, out hrefAttr)) { //import other html, reuseable html component //TODO: implement import request algo here } } break; } } activeCssTemplate.ExitLevel(); continue; } } //----------------------------- //apply style for this node ApplyStyleSheetForSingleHtmlElement(htmlElement, parentElement.Spec, activeCssTemplate); //----------------------------- //recursive PrepareStylesAndContentOfChildNodes(htmlElement, activeCssTemplate); //----------------------------- } break; case WebDom.HtmlNodeKind.TextNode: { UpdateTextNode(parentElement, (HtmlTextNode)node, isblockContext); } break; } activeCssTemplate.ExitLevel(); } }
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(); //*** //===================== }
static void AssignStylesFromTranslatedAttributesHTML5(HtmlElement tag) { //some html attr contains css value if (tag.AttributeCount > 0) { foreach (var attr in tag.GetAttributeIterForward()) { //attr switch by wellknown property name switch ((WebDom.WellknownName)attr.LocalNameIndex) { case WebDom.WellknownName.Align: { //deprecated in HTML4.1 //string value = attr.Value.ToLower(); //if (value == "left" // || value == "center" // || value == "right" // || value == "justify") //{ // WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( // value, WebDom.CssValueHint.Iden); // box.CssTextAlign = UserMapUtil.GetTextAlign(propValue); //} //else //{ // WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( // value, WebDom.CssValueHint.Iden); // box.VerticalAlign = UserMapUtil.GetVerticalAlign(propValue); //} //break; } break; case WebDom.WellknownName.Background: //deprecated in HTML4.1 //box.BackgroundImageBinder = new ImageBinder(attr.Value.ToLower()); break; case WebDom.WellknownName.BackgroundColor: //deprecated in HTML5 //box.BackgroundColor = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.Border: { //not support in HTML5 //CssLength borderLen = TranslateLength(UserMapUtil.MakeBorderLength(attr.Value.ToLower())); //if (!borderLen.HasError) //{ // if (borderLen.Number > 0) // { // box.BorderLeftStyle = // box.BorderTopStyle = // box.BorderRightStyle = // box.BorderBottomStyle = CssBorderStyle.Solid; // } // box.BorderLeftWidth = // box.BorderTopWidth = // box.BorderRightWidth = // box.BorderBottomWidth = borderLen; // if (tag.WellknownTagName == WellknownHtmlTagName.TABLE && borderLen.Number > 0) // { // //Cascades to the TD's the border spacified in the TABLE tag. // var borderWidth = CssLength.MakePixelLength(1); // ForEachCellInTable(box, cell => // { // //for all cells // cell.BorderLeftStyle = cell.BorderTopStyle = cell.BorderRightStyle = cell.BorderBottomStyle = CssBorderStyle.Solid; // CssConstants.Solid; // cell.BorderLeftWidth = cell.BorderTopWidth = cell.BorderRightWidth = cell.BorderBottomWidth = borderWidth; // }); // } //} } break; case WebDom.WellknownName.BorderColor: //box.BorderLeftColor = // box.BorderTopColor = // box.BorderRightColor = // box.BorderBottomColor = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.CellSpacing: //html5 not support in HTML5, use CSS instead //box.BorderSpacingHorizontal = box.BorderSpacingVertical = TranslateLength(attr); break; case WebDom.WellknownName.CellPadding: { //html5 not support in HTML5, use CSS instead *** // CssLength len01 = UserMapUtil.ParseGenericLength(attr.Value.ToLower()); // if (len01.HasError && (len01.Number > 0)) // { // CssLength len02 = CssLength.MakePixelLength(len01.Number); // ForEachCellInTable(box, cell => // { //#if DEBUG // // cell.dbugBB = dbugTT++; //#endif // cell.PaddingLeft = cell.PaddingTop = cell.PaddingRight = cell.PaddingBottom = len02; // }); // } // else // { // ForEachCellInTable(box, cell => // cell.PaddingLeft = cell.PaddingTop = cell.PaddingRight = cell.PaddingBottom = len01); // } } break; case WebDom.WellknownName.Color: //deprecate // box.Color = CssValueParser.GetActualColor(attr.Value.ToLower()); break; case WebDom.WellknownName.Dir: { WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( attr.Value.ToLower(), WebDom.CssValueHint.Iden); //assign var spec = tag.Spec; spec.CssDirection = UserMapUtil.GetCssDirection(propValue); } break; case WebDom.WellknownName.Face: //deprecate //box.FontFamily = CssParser.ParseFontFamily(attr.Value.ToLower()); break; case WebDom.WellknownName.Height: { var spec = tag.Spec; spec.Height = TranslateLength(attr); } break; case WebDom.WellknownName.HSpace: //deprecated //box.MarginRight = box.MarginLeft = TranslateLength(attr); break; case WebDom.WellknownName.Nowrap: //deprecate //box.WhiteSpace = CssWhiteSpace.NoWrap; break; case WebDom.WellknownName.Size: { //deprecate //switch (tag.WellknownTagName) //{ // case WellknownHtmlTagName.HR: // { // box.Height = TranslateLength(attr); // } break; // case WellknownHtmlTagName.FONT: // { // var ruleset = activeTemplate.ParseCssBlock("", attr.Value.ToLower()); // foreach (WebDom.CssPropertyDeclaration propDecl in ruleset.GetAssignmentIter()) // { // //assign each property // AssignPropertyValue(box, box.ParentBox, propDecl); // } // //WebDom.CssCodePrimitiveExpression prim = new WebDom.CssCodePrimitiveExpression(value, // //box.SetFontSize(value); // } break; //} } break; case WebDom.WellknownName.VAlign: { //w3.org //valign for table display elements: //col,colgroup,tbody,td,tfoot,th,thead,tr WebDom.CssCodePrimitiveExpression propValue = new WebDom.CssCodePrimitiveExpression( attr.Value.ToLower(), WebDom.CssValueHint.Iden); tag.Spec.VerticalAlign = UserMapUtil.GetVerticalAlign(propValue); } break; case WebDom.WellknownName.VSpace: //deprecated //box.MarginTop = box.MarginBottom = TranslateLength(attr); break; case WebDom.WellknownName.Width: { var spec = tag.Spec; spec.Width = TranslateLength(attr); } break; case WellknownName.Src: { var cssBoxImage = HtmlElement.InternalGetPrincipalBox(tag) as CssBoxImage; if (cssBoxImage != null) { string imgsrc; //ImageBinder imgBinder = null; if (tag.TryGetAttribute(WellknownName.Src, out imgsrc)) { var cssBoxImage1 = HtmlElement.InternalGetPrincipalBox(tag) as CssBoxImage; var imgbinder1 = cssBoxImage1.ImageBinder; if (imgbinder1.ImageSource != imgsrc) { var clientImageBinder = new ClientImageBinder(imgsrc); imgbinder1 = clientImageBinder; clientImageBinder.SetOwner(tag); cssBoxImage1.ImageBinder = clientImageBinder; } } else { //var clientImageBinder = new ClientImageBinder(null); //imgBinder = clientImageBinder; //clientImageBinder.SetOwner(tag); } } } 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(); //*** //===================== }