public CssSpacingBox(CssBox tableBox, ref CssBox extendedBox, int startRow) : base(tableBox, new HtmlTag("none", false, new Dictionary<string, string> { { "colspan", "1" } })) { _extendedBox = extendedBox; Display = CssConstants.None; _startRow = startRow; _endRow = startRow + Int32.Parse(extendedBox.GetAttribute("rowspan", "1")) - 1; }
/// <summary> /// Read styles defined inside the dom structure in links and style elements.<br/> /// If the html tag is "style" tag parse it content and add to the css data for all future tags parsing.<br/> /// If the html tag is "link" that point to style data parse it content and add to the css data for all future tags parsing.<br/> /// </summary> /// <param name="box">the box to parse style data in</param> /// <param name="htmlContainer">the html container to use for reference resolve</param> /// <param name="cssData">the style data to fill with found styles</param> /// <param name="cssDataChanged">check if the css data has been modified by the handled html not to change the base css data</param> private void CascadeParseStyles(CssBox box, HtmlContainerInt htmlContainer, ref CssData cssData, ref bool cssDataChanged) { if (box.HtmlTag != null) { // Check for the <link rel=stylesheet> tag if (box.HtmlTag.Name.Equals("link", StringComparison.CurrentCultureIgnoreCase) && box.GetAttribute("rel", string.Empty).Equals("stylesheet", StringComparison.CurrentCultureIgnoreCase)) { CloneCssData(ref cssData, ref cssDataChanged); string stylesheet; CssData stylesheetData; StylesheetLoadHandler.LoadStylesheet(htmlContainer, box.GetAttribute("href", string.Empty), box.HtmlTag.Attributes, out stylesheet, out stylesheetData); if (stylesheet != null) _cssParser.ParseStyleSheet(cssData, stylesheet); else if (stylesheetData != null) cssData.Combine(stylesheetData); } // Check for the <style> tag if (box.HtmlTag.Name.Equals("style", StringComparison.CurrentCultureIgnoreCase) && box.Boxes.Count > 0) { CloneCssData(ref cssData, ref cssDataChanged); foreach (var child in box.Boxes) _cssParser.ParseStyleSheet(cssData, child.Text.CutSubstring()); } } foreach (var childBox in box.Boxes) { CascadeParseStyles(childBox, htmlContainer, ref cssData, ref cssDataChanged); } }
/// <summary> /// Gets the span attribute of the tag of the specified box /// </summary> /// <param name="b"></param> private static int GetSpan(CssBox b) { double f = CssValueParser.ParseNumber(b.GetAttribute("span"), 1); return Math.Max(1, Convert.ToInt32(f)); }
/// <summary> /// Gets the rowspan of the specified box /// </summary> /// <param name="b"></param> private static int GetRowSpan(CssBox b) { string att = b.GetAttribute("rowspan", "1"); int rowspan; if (!int.TryParse(att, out rowspan)) { return 1; } return rowspan; }
/// <summary> /// Gets the colspan of the specified box /// </summary> /// <param name="b"></param> private static int GetColSpan(CssBox b) { string att = b.GetAttribute("colspan", "1"); int colspan; if (!int.TryParse(att, out colspan)) { return 1; } return colspan; }
/// <summary> /// Get attribute value by given key starting search from given box, search up the tree until /// attribute found or root. /// </summary> /// <param name="box">the box to start lookup at</param> /// <param name="attribute">the attribute to get</param> /// <returns>the value of the attribute or null if not found</returns> public static string GetAttribute(CssBox box, string attribute) { string value = null; while (box != null && value == null) { value = box.GetAttribute(attribute, null); box = box.ParentBox; } return value; }