예제 #1
0
        private MenuObject GetOrCreateMenu(string name)
        {
            var menuObject = Plugin.GetSafeValue <MenuObject>(name);

            if (menuObject == null)
            {
                menuObject = new MenuObject()
                {
                    Name = name
                };
                Plugin.SetValue(name, menuObject, false);
            }

            return(menuObject);
        }
예제 #2
0
 private void SetPageMenu(ContentObject page, MenuObject menu)
 {
     page.SetValue("menu", menu);
 }
예제 #3
0
        private void DecodeMenu(object o, ContentObject menuFile, MenuObject parent = null, bool expectingMenuEntry = false)
        {
            if (o is ScriptObject obj)
            {
                if (parent == null)
                {
                    foreach (var keyPair in obj)
                    {
                        var menuName   = keyPair.Key;
                        var menuObject = new MenuObject {
                            Path = (string)menuFile.Path, Name = menuName
                        };
                        _menus.Add(menuObject);
                        Plugin.SetValue(menuName, menuObject);
                        DecodeMenu(keyPair.Value, menuFile, menuObject, false);
                    }
                }
                else
                {
                    if (expectingMenuEntry)
                    {
                        var menuObject = new MenuObject {
                            Parent = parent
                        };
                        _menus.Add(menuObject);
                        parent.Children.Add(menuObject);

                        foreach (var keyPair in obj)
                        {
                            var key   = keyPair.Key;
                            var value = keyPair.Value;
                            if (key == "path")
                            {
                                var valueAsStr = value?.ToString();

                                if (valueAsStr == null || !UPath.TryParse(valueAsStr, out _))
                                {
                                    throw new LunetException($"The path value `{valueAsStr}` is not a valid path for key `{key}`.");
                                }

                                value = (string)(menuFile.Path.GetDirectory() / (UPath)value?.ToString());
                            }

                            menuObject[key] = value;
                        }
                    }
                    else
                    {
                        foreach (var keyPair in obj)
                        {
                            var key   = keyPair.Key;
                            var value = keyPair.Value;
                            if (key == "items")
                            {
                                if (!(value is ScriptArray))
                                {
                                    throw new LunetException($"The items of menu `{parent.Name}` must be an array. The type {value?.GetType()} is not valid for this element.");
                                }
                                DecodeMenu(value, menuFile, parent, true);
                            }
                            else
                            {
                                parent[key] = value;
                            }
                        }
                    }
                }
            }
            else if (o is ScriptArray array)
            {
                if (parent == null)
                {
                    parent = new MenuObject()
                    {
                        Path = (string)menuFile.Path
                    };
                    _menus.Add(parent);
                }
                foreach (var item in array)
                {
                    DecodeMenu(item, menuFile, parent, true);
                }
            }
            else if (o is string str)
            {
                if (!UPath.TryParse(str, out var relPath))
                {
                    throw new LunetException($"Error while parsing menu [{menuFile.Path}]. The string `{str}` is not a valid path.");
                }

                if (parent == null)
                {
                    throw new LunetException($"Error while parsing menu [{menuFile.Path}]. The string `{str}` cannot be a root value.");
                }

                var menuPath = menuFile.Path.GetDirectory() / relPath;

                var menuObject = new MenuObject
                {
                    Path   = (string)menuPath,
                    Parent = parent
                };
                _menus.Add(menuObject);

                parent.Children.Add(menuObject);
            }
        }
예제 #4
0
        private void ProcessMenu(object o, ContentObject page)
        {
            if (o is string)
            {
                var menuName   = (string)o;
                var parentMenu = GetOrCreateMenu(menuName);
                var menu       = new MenuObject()
                {
                    Menu   = menuName,
                    Page   = page,
                    Parent = parentMenu,
                };
                SetPageMenu(page, menu);
                parentMenu.Add(menu);
            }
            else if (o is ScriptArray scriptArray)
            {
                foreach (var item in scriptArray)
                {
                    ProcessMenu(item, page);
                }
            }
            else if (o is IScriptObject scriptObject)
            {
                foreach (var menuName in scriptObject.GetMembers())
                {
                    var parentMenu = GetOrCreateMenu(menuName);
                    if (scriptObject.TryGetValue(menuName, out var objectValue))
                    {
                        if (objectValue is ScriptObject subScript)
                        {
                            var menu = new MenuObject()
                            {
                                Menu = menuName,
                                Page = page,
                            };
                            menu.ScriptObject.Import(subScript);

                            var localParentMenuName = menu.ParentAsString;
                            if (localParentMenuName != null)
                            {
                                var localParentMenu = parentMenu.GetSafeValue <MenuObject>(localParentMenuName);
                                if (localParentMenu == null)
                                {
                                    localParentMenu = new MenuObject()
                                    {
                                        Name = localParentMenuName, Menu = parentMenu.Name
                                    };
                                    parentMenu.SetValue(localParentMenuName, localParentMenu);
                                    parentMenu.Add(localParentMenu);
                                }
                                menu.Parent = localParentMenu;
                                SetPageMenu(page, menu);
                                localParentMenu.Add(menu);
                            }
                            else
                            {
                                var subMenuName = menu.Name;
                                if (subMenuName != null)
                                {
                                    var subMenu = parentMenu.GetSafeValue <MenuObject>(subMenuName);
                                    if (subMenu != null)
                                    {
                                        subMenu.Menu = menuName;
                                        subMenu.Page = page;
                                        subMenu.ScriptObject.Import(subScript);
                                        SetPageMenu(page, subMenu);
                                        continue;
                                    }
                                    parentMenu.SetValue(subMenuName, menu, true);
                                }
                                menu.Parent = parentMenu;
                                SetPageMenu(page, menu);
                                parentMenu.Add(menu);
                            }
                        }
                        else
                        {
                            Site.Error($"Invalid menu definition `{menuName}` must be associated with an object (key value pairs).");
                        }
                    }
                }
            }
            else
            {
                Site.Error($"Invalid menu definition `{o}`. Expecting only a string, an object or an array of object/string.");
            }
        }