diff options
Diffstat (limited to '')
-rw-r--r-- | MCServer/Plugins/InfoDump.lua | 218 |
1 files changed, 172 insertions, 46 deletions
diff --git a/MCServer/Plugins/InfoDump.lua b/MCServer/Plugins/InfoDump.lua index df47d566b..6b1da7a77 100644 --- a/MCServer/Plugins/InfoDump.lua +++ b/MCServer/Plugins/InfoDump.lua @@ -2,10 +2,17 @@ -- InfoDump.lua --- Goes through all subfolders, loads Info.lua and dumps its g_PluginInfo into various text formats --- This is used for generating plugin documentation for the forum and for GitHub's INFO.md files +--[[ +Loads plugins' Info.lua and dumps its g_PluginInfo into various text formats +This is used for generating plugin documentation for the forum and for GitHub's INFO.md files --- This script requires LuaRocks with LFS installed, instructions are printed when this is not present. +This script can be used in two ways: +Executing "lua InfoDump.lua" will go through all subfolders and dump each Info.lua file it can find + Note that this mode of operation requires LuaRocks with LFS installed; instructions are printed + when the prerequisites are not met. +Executing "lua InfoDump.lua PluginName" will load the Info.lua file from PluginName's folder and dump +only that one plugin's documentation. This mode of operation doesn't require LuaRocks +--]] @@ -17,33 +24,6 @@ if (_VERSION ~= "Lua 5.1") then return; end --- Try to load lfs, do not abort if not found -local lfs, err = pcall( - function() - return require("lfs") - end -); - --- Rather, print a nice message with instructions: -if not(lfs) then - print([[ -Cannot load LuaFileSystem -Install it through luarocks by executing the following command: - sudo luarocks install luafilesystem - -If you don't have luarocks installed, you need to install them using your OS's package manager, usually: - sudo apt-get install luarocks -On windows, a binary distribution can be downloaded from the LuaRocks homepage, http://luarocks.org/en/Download -]]); - - print("Original error text: ", err); - return; -end - --- We now know that LFS is present, get it normally: -lfs = require("lfs"); - - @@ -161,6 +141,21 @@ end +--- Returns a string specifying the command. +-- If a_Command is a simple string, returns a_Command colorized to blue +-- If a_Command is a table, expects members Name (full command name) and Params (command parameters), +-- colorizes command name blue and params green +local function GetCommandRefForum(a_Command) + if (type(a_Command) == "string") then + return "[color=blue]" .. a_Command .. "[/color]"; + end + return "[color=blue]" .. a_Command.Name .. "[/color] [color=green]" .. a_Command.Params .. "[/color]"; +end + + + + + --- Writes the specified command detailed help array to the output file, in the forum dump format local function WriteCommandParameterCombinationsForum(a_CmdString, a_ParameterCombinations, f) assert(type(a_CmdString) == "string"); @@ -270,6 +265,97 @@ end +--- Collects all permissions mentioned in the info, returns them as a sorted array +-- Each array item is {Name = "PermissionName", Info = { PermissionInfo }} +local function BuildPermissions(a_PluginInfo) + -- Collect all used permissions from Commands, reference the commands that use the permission: + local Permissions = a_PluginInfo.Permissions or {}; + local function CollectPermissions(a_CmdPrefix, a_Commands) + for cmd, info in pairs(a_Commands) do + CommandString = a_CmdPrefix .. cmd; + if ((info.Permission ~= nil) and (info.Permission ~= "")) then + -- Add the permission to the list of permissions: + local Permission = Permissions[info.Permission] or {}; + Permissions[info.Permission] = Permission; + -- Add the command to the list of commands using this permission: + Permission.CommandsAffected = Permission.CommandsAffected or {}; + table.insert(Permission.CommandsAffected, CommandString); + end + + -- Process the command param combinations for permissions: + local ParamCombinations = info.ParameterCombinations or {}; + for idx, comb in ipairs(ParamCombinations) do + if ((comb.Permission ~= nil) and (comb.Permission ~= "")) then + -- Add the permission to the list of permissions: + local Permission = Permissions[comb.Permission] or {}; + Permissions[info.Permission] = Permission; + -- Add the command to the list of commands using this permission: + Permission.CommandsAffected = Permission.CommandsAffected or {}; + table.insert(Permission.CommandsAffected, {Name = CommandString, Params = comb.Params}); + end + end + + -- Process subcommands: + if (info.Subcommands ~= nil) then + CollectPermissions(CommandString .. " ", info.Subcommands); + end + end + end + CollectPermissions("", a_PluginInfo.Commands); + + -- Copy the list of permissions to an array: + local PermArray = {}; + for name, perm in pairs(Permissions) do + table.insert(PermArray, {Name = name, Info = perm}); + end + + -- Sort the permissions array: + table.sort(PermArray, + function(p1, p2) + return (p1.Name < p2.Name); + end + ); + return PermArray; +end + + + + + +local function DumpPermissionsForum(a_PluginInfo, f) + -- Get the processed sorted array of permissions: + local Permissions = BuildPermissions(a_PluginInfo); + if ((Permissions == nil) or (#Permissions <= 0)) then + return; + end + + -- Dump the permissions: + f:write("\n[size=X-Large]Permissions[/size]\n[list]\n"); + for idx, perm in ipairs(Permissions) do + f:write(" - [color=red]", perm.Name, "[/color] - "); + f:write(perm.Info.Description or ""); + local CommandsAffected = perm.Info.CommandsAffected or {}; + if (#CommandsAffected > 0) then + f:write("\n[list] Commands affected:\n- "); + local Affects = {}; + for idx2, cmd in ipairs(CommandsAffected) do + table.insert(Affects, GetCommandRefForum(cmd)); + end + f:write(table.concat(Affects, "\n - ")); + f:write("\n[/list]"); + end + if (perm.Info.RecommendedGroups ~= nil) then + f:write("\n[list] Recommended groups: ", perm.Info.RecommendedGroups, "[/list]"); + end + f:write("\n"); + end + f:write("[/list]"); +end + + + + + local function DumpPluginInfoForum(a_PluginFolder, a_PluginInfo) -- Open the output file: local f, msg = io.open(a_PluginInfo.Name .. "_forum.txt", "w"); @@ -282,6 +368,7 @@ local function DumpPluginInfoForum(a_PluginFolder, a_PluginInfo) f:write(ForumizeString(a_PluginInfo.Description), "\n"); DumpAdditionalInfoForum(a_PluginInfo, f); DumpCommandsForum(a_PluginInfo, f); + DumpPermissionsForum(a_PluginInfo, f); f:close(); end @@ -301,12 +388,6 @@ end --- Tries to load the g_PluginInfo from the plugin's Info.lua file -- Returns the g_PluginInfo table on success, or nil and error message on failure local function LoadPluginInfo(a_FolderName) - -- Check if the Info file is present at all: - local Attribs = lfs.attributes(a_FolderName .. "/Info.lua"); - if ((Attribs == nil) or (Attribs.mode ~= "file")) then - return nil; - end - -- Load and compile the Info file: local cfg, err = loadfile(a_FolderName .. "/Info.lua"); if (cfg == nil) then @@ -332,7 +413,7 @@ local function ProcessPluginFolder(a_FolderName) local PluginInfo, Msg = LoadPluginInfo(a_FolderName); if (PluginInfo == nil) then if (Msg ~= nil) then - print("\tCannot load Info.lua: " .. Msg); + print("\t" .. Msg); end return; end @@ -343,19 +424,64 @@ end -print("Processing plugin subfolders:"); -for fnam in lfs.dir(".") do - if ((fnam ~= ".") and (fnam ~= "..")) then - local Attributes = lfs.attributes(fnam); - if (Attributes ~= nil) then - if (Attributes.mode == "directory") then - print(fnam); - ProcessPluginFolder(fnam); - end +--- Tries to load LFS through LuaRocks, returns the LFS instance, or nil on error +local function LoadLFS() + -- Try to load lfs, do not abort if not found ... + local lfs, err = pcall( + function() + return require("lfs") end + ); + + -- ... rather, print a nice message with instructions: + if not(lfs) then + print([[ + Cannot load LuaFileSystem + Install it through luarocks by executing the following command: + luarocks install luafilesystem (Windows) + sudo luarocks install luafilesystem (*nix) + + If you don't have luarocks installed, you need to install them using your OS's package manager, usually: + sudo apt-get install luarocks (Ubuntu / Debian) + On windows, a binary distribution can be downloaded from the LuaRocks homepage, http://luarocks.org/en/Download + ]]); + + print("Original error text: ", err); + return nil; end + + -- We now know that LFS is present, get it normally: + return require("lfs"); end + +local Arg1 = ...; +if ((Arg1 ~= nil) and (Arg1 ~= "")) then + -- Called with a plugin folder name, export only that one + ProcessPluginFolder(Arg1) +else + -- Called without any arguments, process all subfolders: + local lfs = LoadLFS(); + if (lfs == nil) then + -- LFS not loaded, error has already been printed, just bail out + return; + end + print("Processing plugin subfolders:"); + for fnam in lfs.dir(".") do + if ((fnam ~= ".") and (fnam ~= "..")) then + local Attributes = lfs.attributes(fnam); + if (Attributes ~= nil) then + if (Attributes.mode == "directory") then + print(fnam); + ProcessPluginFolder(fnam); + end + end + end + end +end +print("Done."); + + |