// Converts source data to Renderer.DTO // To convert data uses recursion // Converts elements public static DataElementDTO ToDTO(ISdmlDataElement data) { var dto = new DataElementDTO(); if (data != null) { var attributes = new List <DataAttributeDTO>(); var childs = new List <DataElementDTO>(); dto.ObjectName = data.ObjectName; foreach (var item in data.Attributes) { attributes.Add(ToDTO(item, dto)); } dto.Attributes = attributes; foreach (var item in data.Childs) { var element = ToDTO(item); element.Parent = dto; childs.Add(element); } dto.Childs = childs; dto.Value = data.Value; } else { throw new NullReferenceException("Data element is null!"); } return(dto); }
// Converts attributes public static DataAttributeDTO ToDTO(ISdmlAttribute data, DataElementDTO owner) => new DataAttributeDTO() { ObjectName = data.ObjectName, Value = data.Value, Owner = owner };
public SdmlTag(DataElementDTO data) { Object = data; }
// Builds tree and parses each element private static ElementTree BuildTree(DataElementDTO data, RenderOptions options, RenderAccumulator accumulator = null) { var tree = new ElementTree(); var acc = accumulator; if (accumulator == null) { acc = new RenderAccumulator(); } if (!string.IsNullOrEmpty(data.Value)) { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.Value; tree.Add(new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }); } else if (data.Childs.Any()) { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.OpenTag; var elementNode = new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }; RenderManager.AddTab(acc); foreach (var item in data.Childs) { var temp = BuildTree(item, options, acc); foreach (var node in temp.Elements) { elementNode.Childs.Add(node); elementNode.Data += node.Data; } } options.TargetType = RenderTargetTypes.ClosedTag; elementNode.Data += RenderManager.Render(tag, options, acc); tree.Add(elementNode); } else { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.BodylessTag; tree.Add(new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }); } RenderManager.RemoveTab(acc); return(tree); }
public static async Task <ElementTree> SerializeDataAsync(DataElementDTO data, RenderOptions options) => await Task.Run(() => BuildTree(data, options));
// Builds and return tree of elements public static ElementTree SerializeData(DataElementDTO data, RenderOptions options) => BuildTree(data, options);
// Builds tree and parses each element private static ElementTree BuildTree(DataElementDTO data, RenderOptions options, RenderAccumulator accumulator = null) { // Tree, that will exported to SdmlGenerator and will be containing all elements var tree = new ElementTree(); // Recursion accumulator. Allows to render tabulations, based on layer count var acc = accumulator; if (accumulator == null) { acc = new RenderAccumulator(); } // If data has value that means this element donesn't have childs if (!string.IsNullOrEmpty(data.Value)) { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.Value; tree.Add(new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }); } // If data contains at least one child it has to be serialized in a different way than value element else if (data.Childs.Any()) { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.OpenTag; var elementNode = new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }; // Add tab to accumulator RenderManager.AddTab(acc); foreach (var item in data.Childs) { var temp = BuildTree(item, options, acc); foreach (var node in temp.Elements) { elementNode.Childs.Add(node); elementNode.Data += node.Data; } } options.TargetType = RenderTargetTypes.ClosedTag; elementNode.Data += RenderManager.Render(tag, options, acc); tree.Add(elementNode); } // If data has no value and no childs it will be rendered as bodyless tag else { var tag = new SdmlTag(data); options.TargetType = RenderTargetTypes.BodylessTag; tree.Add(new ElementNode() { Data = RenderManager.Render(tag, options, acc), Element = tag, Parent = new SdmlTag(data.Parent) }); } // Removes tabs from accumulator RenderManager.RemoveTab(acc); return(tree); }