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); }
private void SetPageMenu(ContentObject page, MenuObject menu) { page.SetValue("menu", menu); }
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); } }
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."); } }