private static T AddSections <T>(T currPage) where T : StandardPage { GenericContainerBlock rootWrapper = currPage.ContentLink.CreateGenericBlockForPage <GenericContainerBlock>("root"); rootWrapper = GenerateNewPageFromXMLSection(currPage.ContentLink, new List <BaseBlockData>(), rootWrapper) as GenericContainerBlock; ContentArea area = rootWrapper.MainContentArea; currPage.MainContentArea = area; return(currPage); }
/// <summary> /// Recursively goes through the XML file and generates a block-tree. /// </summary> /// <param name="parentReference"></param> /// <param name="currentBlocksList"></param> /// <param name="parentWrapper"></param> /// <returns>A BaseBlockData with a ContentArea with all blocks in a tree structure </returns> private static BaseBlockData GenerateNewPageFromXMLSection(ContentReference parentReference, IList <BaseBlockData> currentBlocksList, GenericContainerBlock parentWrapper) { while (_xmlReader.ReadAndCount()) { switch (_xmlReader.NodeType) { case XmlNodeType.EndElement: //Save Element //Return the blocks within a section wrapper if (currentBlocksList.Count > 1) { if (parentWrapper.MainContentArea == null) { parentWrapper.MainContentArea = new ContentArea(); } foreach (var genericContainerBlock in currentBlocksList) { _repo.SaveAndPublish(genericContainerBlock); ContentAreaItem item = new ContentAreaItem { ContentLink = (genericContainerBlock as IContent).ContentLink }; parentWrapper.MainContentArea.Items.Add(item); } if (parentReference != _rootReference) { _repo.SaveAndPublish(parentWrapper); } return(parentWrapper); } //Return just the single block else if (currentBlocksList.Any()) { var newBlock = currentBlocksList.First(); _repo.SaveAndPublish(newBlock); return(newBlock); } else { return(null); } case XmlNodeType.CDATA: case XmlNodeType.Text: //TEXT //CDATA var text = _xmlReader.GetAttribute("text") ?? _xmlReader.Value; var html = FormatOpenAndClosedElement(text, "text", "p"); TextBlock textBlock = BlockHelper.CreateTextBlock(parentReference ?? _rootReference, html, $"TextBlock - {text.Substring(0, Math.Min(text.Length, 20))}"); if (textBlock != null) { currentBlocksList.Add(textBlock); } break; case (XmlNodeType.Element): if (_xmlReader.IsEmptyElement) { switch (_xmlReader.Name) { case "video": //TODO break; case "image": var url = _xmlReader.GetAttribute("url"); var title = _xmlReader.GetAttribute("title"); if (!url.IsNullOrEmpty()) { ImageBlock imgBlock = BlockHelper.CreateImageBlock(parentReference ?? _rootReference, url, title); if (imgBlock != null) { currentBlocksList.Add(imgBlock); } } break; case "header": var headerText = _xmlReader.GetAttribute("text"); var type = _xmlReader.GetAttribute("type") ?? "h1"; var header = FormatOpenAndClosedElement(headerText, "header", type); TextBlock t = BlockHelper.CreateTextBlock(parentReference ?? _rootReference, header, $"HeaderBlock - {headerText.Substring(0, Math.Min(headerText.Length, 20))}"); if (t != null) { currentBlocksList.Add(t); } break; } } else if (_xmlReader.IsStartElement()) { var background = _xmlReader.GetAttribute("background"); GenericContainerBlock newWrapperBlock = (parentReference ?? _rootReference).CreateGenericBlockForPage <GenericContainerBlock>($"Container- {_xmlReader.Name.CapitalizeFirstLetter()}"); var sectionReference = ContentReference.EmptyReference; if (_xmlReader.SectionHasManyChildren()) { sectionReference = _repo.SaveAndPublish(newWrapperBlock); } if (!background.IsNullOrEmpty()) { newWrapperBlock.BackgroundColor = background; } var reference = sectionReference.IsNullOrEmpty() ? parentReference : sectionReference; var block = GenerateNewPageFromXMLSection(reference, new List <BaseBlockData>(), newWrapperBlock); if (block != null) { currentBlocksList.Add(block); } } break; } } return(parentWrapper); }