diff options
-rw-r--r-- | MCServer/.gitignore | 1 | ||||
-rw-r--r-- | MCServer/Plugins/APIDump/main.lua | 184 |
2 files changed, 149 insertions, 36 deletions
diff --git a/MCServer/.gitignore b/MCServer/.gitignore index 5a018cc6d..ff0517cfa 100644 --- a/MCServer/.gitignore +++ b/MCServer/.gitignore @@ -4,6 +4,7 @@ MCServer logs players world* +API/ API.txt API_wiki.txt *.dat diff --git a/MCServer/Plugins/APIDump/main.lua b/MCServer/Plugins/APIDump/main.lua index d0a1da3b1..0f63f9ab5 100644 --- a/MCServer/Plugins/APIDump/main.lua +++ b/MCServer/Plugins/APIDump/main.lua @@ -16,10 +16,13 @@ function Initialize(Plugin) LOG("Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion()) -- dump all available API functions and objects: - DumpAPI(); + -- DumpAPITxt(); -- Dump all available API objects in wiki-style tables: - DumpAPIWiki(); + -- DumpAPIWiki(); + + -- Dump all available API object in HTML format into a subfolder: + DumpAPIHtml(); return true end @@ -29,7 +32,7 @@ end -function DumpAPI() +function DumpAPITxt() LOG("Dumping all available functions to API.txt..."); function dump (prefix, a, Output) for i, v in pairs (a) do @@ -67,13 +70,55 @@ end function DumpAPIWiki() + LOG("Dumping all available functions and constants to API_wiki.txt..."); + + local API, Globals = CreateAPITables(); + + -- Now dump the whole thing into a file, formatted as a wiki table: + local function WriteClass(a_File, a_ClassAPI) + if (#a_ClassAPI.Functions > 0) then + a_File:write("Functions:\n"); + a_File:write("^ Function name ^ Parameters ^ Return value ^ Note ^\n"); + for i, n in ipairs(a_ClassAPI.Functions) do + a_File:write("| " .. n[1] .. " | | | |\n"); + end + a_File:write("\n\n"); + end + + if (#a_ClassAPI.Constants > 0) then + a_File:write("Constants:\n"); + a_File:write("^ Constant ^ Value ^ Note ^\n"); + for i, n in ipairs(a_ClassAPI.Constants) do + a_File:write("| " .. n[1] .. " | " .. n[2] .. " | |\n"); + end + a_File:write("\n\n"); + end + end + + local f = io.open("API_wiki.txt", "w"); + for i, n in ipairs(API) do + f:write("Class " .. n[1] .. "\n"); + WriteClass(f, n[2]); + f:write("\n\n\n----------------\n"); + end + f:write("globals:\n"); + WriteClass(f, Globals); + f:close(); + + LOG("API_wiki.txt file written"); +end + + + + +function CreateAPITables() --[[ We want an API table of the following shape: local API = { {"cCuboid", { Functions = { - "Sort", - "IsInside" + {"Sort"}, -- The extra table will be used to later add params, return values and notes + {"IsInside"} }, Constants = { } @@ -102,14 +147,12 @@ function DumpAPIWiki() }; --]] - LOG("Dumping all available functions and constants to API_wiki.txt..."); - local Globals = {Functions = {}, Constants = {}}; local API = {}; local function Add(a_APIContainer, a_ClassName, a_ClassObj) if (type(a_ClassObj) == "function") then - table.insert(a_APIContainer.Functions, a_ClassName); + table.insert(a_APIContainer.Functions, {a_ClassName}); elseif (type(a_ClassObj) == "number") then table.insert(a_APIContainer.Constants, {a_ClassName, a_ClassObj}); end @@ -117,7 +160,11 @@ function DumpAPIWiki() local function SortClass(a_ClassAPI) -- Sort the function list and constant lists: - table.sort(a_ClassAPI.Functions); + table.sort(a_ClassAPI.Functions, + function(f1, f2) + return (f1[1] < f2[1]); + end + ); table.sort(a_ClassAPI.Constants, function(c1, c2) return (c1[1] < c2[1]); @@ -154,38 +201,103 @@ function DumpAPIWiki() end ); - -- Now dump the whole thing into a file, formatted as a wiki table: - local function WriteClass(a_File, a_ClassAPI) - if (#a_ClassAPI.Functions > 0) then - a_File:write("Functions:\n"); - a_File:write("^ Function name ^ Parameters ^ Return value ^ Note ^\n"); - for i, n in ipairs(a_ClassAPI.Functions) do - a_File:write("| " .. n .. " | | | |\n"); - end - a_File:write("\n\n"); - end - - if (#a_ClassAPI.Constants > 0) then - a_File:write("Constants:\n"); - a_File:write("^ Constant ^ Value ^ Note ^\n"); - for i, n in ipairs(a_ClassAPI.Constants) do - a_File:write("| " .. n[1] .. " | " .. n[2] .. " | |\n"); - end - a_File:write("\n\n"); - end - end + return API, Globals; +end + + + + + +function DumpAPIHtml() + LOG("Dumping all available functions and constants to API subfolder..."); + + local API, Globals = CreateAPITables(); - local f = io.open("API_wiki.txt", "w"); + -- Create the folder: + os.execute("mkdir API"); + + -- Create a "class index" file, write each class as a link to that file, + -- then dump class contents into class-specific file + local f = io.open("API/index.html", "w"); + f:write([[<html><head><title>MCServer API - class index</title> + <link rel="stylesheet" type="text/css" href="main.css" /> + </head><body> + <ul> + ]]); for i, n in ipairs(API) do - f:write("Class " .. n[1] .. "\n"); - WriteClass(f, n[2]); - f:write("\n\n\n----------------\n"); + f:write("<li><a href=\"" .. n[1] .. ".html\">" .. n[1] .. "</a></li>\n"); + WriteHtmlClass(n); end - f:write("globals:\n"); - WriteClass(f, Globals); + f:write("</ul></body></html>"); f:close(); +end + + + + +function WriteHtmlClass(a_ClassAPI) + local cf, err = io.open("API/" .. a_ClassAPI[1] .. ".html", "w"); + if (cf == nil) then + return; + end - LOG("API_wiki.txt file written"); + local function LinkifyString(a_String) + -- TODO: Make a link out of anything with the special linkifying syntax [[link|title]] + -- a_String:gsub("\[\[" .. "[ + return a_String; + end + + cf:write([[<html><head><title>MCServer API - ]] .. a_ClassAPI[1] .. [[</title> + <link rel="stylesheet" type="text/css" href="main.css" /> + </head><body> + <h1>Contents</h1> + <ul> + ]]); + + -- Write the table of contents: + if (#a_ClassAPI[2].Constants > 0) then + cf:write("<li><a href=\"#constants\">Constants</a></li>\n"); + end + if (#a_ClassAPI[2].Functions > 0) then + cf:write("<li><a href=\"#functions\">Functions</a></li>\n"); + end + cf:write("</ul>"); + + -- Write the class description: + cf:write("<a name=\"desc\"><h1>" .. a_ClassAPI[1] .. "</h1></a>\n"); + if (a_ClassAPI.Description ~= nil) then + cf:write("<p>"); + cf:write(n.Description); + cf:write("</p>\n"); + end; + + -- Write the constants: + if (#a_ClassAPI[2].Constants > 0) then + cf:write("<a name=\"constants\"><h1>Constants</h1></a>\n"); + cf:write("<table><tr><th>Name</th><th>Value</th><th>Notes</th></tr>\n"); + for i, n in ipairs(a_ClassAPI[2].Constants) do + cf:write("<tr><td>" .. n[1] .. "</td>"); + cf:write("<td>" .. n[2] .. "</td>"); + cf:write("<td>" .. LinkifyString(n.Notes or "") .. "</td></tr>\n"); + end + cf:write("</table>\n"); + end + + -- Write the functions: + if (#a_ClassAPI[2].Functions > 0) then + cf:write("<a name=\"functions\"><h1>Functions</h1></a>\n"); + cf:write("<table><tr><th>Name</th><th>Parameters</th><th>Return value</th><th>Notes</th></tr>\n"); + for i, f in ipairs(a_ClassAPI[2].Functions) do + cf:write("<tr><td>" .. f[1] .. "</td>"); + cf:write("<td>" .. LinkifyString(f.Params or "").. "</td>"); + cf:write("<td>" .. LinkifyString(f.Return or "").. "</td>"); + cf:write("<td>" .. LinkifyString(f.Notes or "") .. "</td></tr>\n"); + end + cf:write("</table>\n"); + end + + cf:write("</body></html>"); + cf:close(); end |