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);
        }