Пример #1
0
        private static Element _GetItemContainer(Document doc, MenuViewModel MenuViewModel)
        {
            // find the item container.
            if (!string.IsNullOrEmpty(MenuViewModel.ItemContainer))
            {
                var itemcontainer = DomService.GetElementByKoobooId(doc, MenuViewModel.ItemContainer) as Element;
                if (itemcontainer != null)
                {
                    return(itemcontainer);
                }
            }

            List <Element> containerlist = new List <Element>();

            foreach (var item in MenuViewModel.children)
            {
                if (!string.IsNullOrEmpty(item.ContainerElement))
                {
                    var element = DomService.GetElementByKoobooId(doc, item.ContainerElement) as Element;
                    if (element != null)
                    {
                        containerlist.Add(element);
                    }
                }
            }

            if (containerlist.Count == 0)
            {
                foreach (var item in MenuViewModel.children)
                {
                    var element = DomService.GetElementByKoobooId(doc, item.LinkElement) as Element;
                    if (element != null)
                    {
                        containerlist.Add(element);
                    }
                }
            }
            if (containerlist.Count > 1)
            {
                var element = DomService.FindParent(containerlist);
                if (element != null)
                {
                    MenuViewModel.ItemContainer = DomService.GetKoobooId(element);
                }
                return(element);
            }
            return(null);
        }
Пример #2
0
        public static void AddNewMenu(SiteDb SiteDb, Page page, MenuViewModel NewMenuViewModel)
        {
            // menu view can start only with item container.
            Menu menu = CreateMenu(page.Dom, NewMenuViewModel);

            if (string.IsNullOrEmpty(menu.Name))
            {
                menu.Name = SiteDb.Menus.GetNewMenuName();
            }

            SiteDb.Menus.AddOrUpdate(menu);

            var maincontainer = NewMenuViewModel.ItemContainer;

            var element = DomService.GetElementByKoobooId(page.Dom, maincontainer);

            string newbody = page.Body.Substring(0, element.location.openTokenStartIndex);

            newbody += "<menu id='" + menu.Name + "'></menu>";
            newbody += page.Body.Substring(element.location.endTokenEndIndex + 1);

            page.Body = newbody;
            SiteDb.Pages.AddOrUpdate(page);
        }
Пример #3
0
        public static Menu CreateMenu(Document doc, MenuViewModel MenuViewModel)
        {
            Menu    menu             = new Menu();
            Element LinkElement      = null;
            Element ItemContainer    = null;
            Element ContainerElement = null;

            int MenuTemplateStart = int.MaxValue;
            int MenuTemplaetEnd   = 0;

            if (!string.IsNullOrEmpty(MenuViewModel.LinkElement) && !string.IsNullOrEmpty(MenuViewModel.ContainerElement))
            {
                var linkelement = DomService.GetElementByKoobooId(doc, MenuViewModel.LinkElement);
                if (linkelement != null)
                {
                    LinkElement = linkelement as Element;
                }

                var container = DomService.GetElementByKoobooId(doc, MenuViewModel.ContainerElement);
                if (container == null && linkelement != null)
                {
                    container = linkelement;
                }
                if (container != null)
                {
                    ContainerElement  = container as Element;
                    MenuTemplateStart = ContainerElement.location.openTokenStartIndex;
                    MenuTemplaetEnd   = ContainerElement.location.endTokenEndIndex;
                }
            }

            string SubMenuItemsTemplate     = null;
            string SubMenuItemOrginalString = null;
            int    SubMenuStart             = int.MaxValue;
            int    SubMenuEnd = 0;

            if (MenuViewModel.children.Count > 0)
            {
                List <Menu> SubMenus = new List <Menu>();

                foreach (var item in MenuViewModel.children)
                {
                    Menu submenu = CreateMenu(doc, item);
                    if (submenu != null)
                    {
                        SubMenus.Add(submenu);
                        if (submenu.tempdata.StartIndex < SubMenuStart)
                        {
                            SubMenuStart = submenu.tempdata.StartIndex;
                        }
                        if (submenu.tempdata.EndIndex > SubMenuEnd)
                        {
                            SubMenuEnd = submenu.tempdata.EndIndex;
                        }
                    }
                }

                ItemContainer = _GetItemContainer(doc, MenuViewModel);

                string SubMenuString = doc.HtmlSource.Substring(SubMenuStart, SubMenuEnd - SubMenuStart + 1);

                if (ItemContainer != null)
                {
                    // 1, sub item within the link element...
                    if (ContainerElement == null || DomService.ContainsOrEqualElement(ContainerElement, ItemContainer))
                    {
                        SubMenuItemOrginalString = ItemContainer.OuterHtml;
                        SubMenuItemsTemplate     = SubMenuItemOrginalString.Replace(SubMenuString, MenuHelper.MarkSubItems);
                    }
                    else if (ContainerElement.isEqualNode(ItemContainer))
                    {
                        SubMenuItemOrginalString = SubMenuString;
                        SubMenuItemsTemplate     = MenuHelper.MarkSubItems;
                    }

                    else
                    {
                        var  distance = DomService.GetTreeDistance(ContainerElement, ItemContainer);
                        bool sibling  = false;
                        if (distance == 1)
                        {
                            sibling = true;
                        }
                        else if (distance < 5)
                        {
                            var nodes = DomService.GetNodesInBetween(doc, ContainerElement, ItemContainer);
                            if (nodes == null || nodes.Count == 0 || IsPossibleSeperator(nodes))
                            {
                                sibling = true;
                            }
                        }

                        if (sibling)
                        {
                            if (MenuTemplateStart > ItemContainer.location.openTokenStartIndex)
                            {
                                MenuTemplateStart = ItemContainer.location.openTokenStartIndex;
                            }

                            if (MenuTemplaetEnd < ItemContainer.location.endTokenEndIndex)
                            {
                                MenuTemplaetEnd = ItemContainer.location.endTokenEndIndex;
                            }

                            SubMenuItemOrginalString = ItemContainer.OuterHtml;
                            SubMenuItemsTemplate     = SubMenuItemOrginalString.Replace(SubMenuString, MenuHelper.MarkSubItems);
                        }

                        else
                        {
                            //menu.RenderSubMenuSeperated = true;
                            SubMenuItemOrginalString = ItemContainer.OuterHtml;
                            SubMenuItemsTemplate     = ItemContainer.OuterHtml.Replace(SubMenuString, MenuHelper.MarkSubItems);
                        }
                    }
                }

                if (SubMenus.Count > 0)
                {
                    menu.children.AddRange(SubMenus);
                }
            }

            if (MenuTemplateStart > 0 && MenuTemplaetEnd > 0)
            {
                string menutemplate = doc.HtmlSource.Substring(MenuTemplateStart, MenuTemplaetEnd - MenuTemplateStart + 1);

                if (!string.IsNullOrEmpty(SubMenuItemOrginalString))
                {
                    menutemplate = menutemplate.Replace(SubMenuItemOrginalString, MenuHelper.MarkSubItems);
                }

                string OriginalLink = LinkElement.OuterHtml;
                string NewLInk      = DomService.ReplaceLink(LinkElement, MenuHelper.MarkHref, MenuHelper.MarkAnchorText);
                menutemplate  = menutemplate.Replace(OriginalLink, NewLInk);
                menu.Template = menutemplate;
                menu.Name     = MenuViewModel.text;
                menu.Url      = MenuViewModel.href;
            }

            menu.SubItemContainer = SubMenuItemsTemplate;

            menu.tempdata.StartIndex = MenuTemplateStart;
            menu.tempdata.EndIndex   = MenuTemplaetEnd;

            if (menu.tempdata.StartIndex == 0 || menu.tempdata.EndIndex == 0)
            {
                if (ItemContainer != null)
                {
                    menu.tempdata.StartIndex = ItemContainer.location.openTokenStartIndex;
                    menu.tempdata.EndIndex   = ItemContainer.location.endTokenEndIndex;
                }
            }
            return(menu);
        }