using FastReport.Utils; using FastReport.Web.Services; using System; using System.Collections.Generic; using System.Net; using System.Text; using System.Web; namespace FastReport.Web { partial class WebReport { string template_outline() { if (!Outline) return ""; if ((Report.PreparedPages?.OutlineXml?.Count ?? 0) == 0) return ""; var outline = new StringBuilder(); BuildOutline(outline, Report.PreparedPages.OutlineXml, true); return $@"
{outline}
"; } void BuildOutline(StringBuilder sb, XmlItem xml, bool top) { for (int i = 0; i < xml.Count; i++) { var opened = top && xml.Count == 1; var styleShow = opened ? @"style=""display:none""" : @"style=""display:block"""; var styleHide = opened ? @"style=""display:block""" : @"style=""display:none"""; var node = xml[i]; var hasChildren = node.Count > 0; var (text, page, offset) = ReadOutlineNode(node); var nodeId = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{ID}{page}{offset}{sb.Length}{GetCurrentTabName()}")); sb.Append($@"
"); string caret; if (hasChildren) { caret = $@""; caret += $@""; } else { caret = $@"
"; } sb.Append($@"
"); sb.Append(caret); sb.Append($@""); sb.Append($@"{HttpUtility.HtmlEncode(text)}"); sb.Append($@"
"); if (hasChildren) { sb.Append($@"
"); // line break sb.Append($@"
"); BuildOutline(sb, node, false); sb.Append("
"); } sb.Append("
"); } } (string text, int page, float offset) ReadOutlineNode(XmlItem node) { string text = node.GetProp("Text"); int page = 0; float offset = 0f; string s = node.GetProp("Page"); if (!s.IsNullOrWhiteSpace()) { page = int.Parse(s); s = node.GetProp("Offset"); if (!s.IsNullOrWhiteSpace()) offset = (float)Converter.FromString(typeof(float), s) /* * PDF_DIVIDER*/; } return (text, page, offset); } } }