local eliminate_varname_conflicts = true
if not e2_parse_args then include("extpp.lua") end
local readfile = readfile or function(filename)
return file.Read("../lua/entities/gmod_wire_expression2/core/"..filename)
end
local writefile = writefile or function(filename, contents)
print("--- Writing to file 'data/e2doc/"..filename.."' ---")
return file.Write("e2doc/"..filename, contents)
end
local p_typename = "[a-z][a-z0-9]*"
local p_typeid = "[a-z][a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?"
local p_argname = "[a-zA-Z][a-zA-Z0-9]*"
local p_funcname = "[a-z][a-zA-Z0-9]*"
local p_func_operator = "[-a-zA-Z0-9+*/%%^=!><&|$_]*"
local function ltrim(s)
return string.match(s, "^%s*(.-)$")
end
local function rtrim(s)
return string.match(s, "^(.-)%s*$")
end
local function trim(s)
return string.match(s, "^%s*(.-)%s*$")
end
local mess_with_args
function mess_with_args(args, desc, thistype)
local args_referenced = string.match(desc, "<"..p_argname..">")
local argtable,ellipses = e2_parse_args(args)
local indices = {}
if thistype ~= "" then indices[string.upper(e2_get_typeid(thistype))] = 2 end
args = ''
for i,name in ipairs(argtable.argnames) do
local typeid = string.upper(argtable.typeids[i])
local index = ""
if args_referenced then
index = indices[typeid]
if index then
indices[typeid] = index+1
else
index = ""
indices[typeid] = 2
end
end
local newname = typeid..""..index..""
if index == "" then newname = typeid end
desc = desc:gsub("<"..name..">", "''"..newname.."''")
if i ~= 1 then args = args .. "," end
args = args .. newname
end
if ellipses then
if #argtable.argnames ~= 0 then args = args .. "," end
args = args .. "..."
end
return args,desc
end
local function e2doc(filename, outfile)
if not outfile then
outfile = string.match(filename,"^.*%.").."txt"
end
local current = {}
local output = { '====Commands====\n:{|style="background:#E6E6FA"\n!align="left" width="150"| Function\n!align="left" width="60"| Returns\n!align="left" width="1000"| Description\n' }
local insert_line = true
for line in string.gmatch(readfile(filename), "%s*(.-)%s*\n") do
if line:sub(1,3) == "---" then
if line:match("[^-%s]") then table.insert(current, ltrim(line:sub(4))) end
elseif line:sub(1,3) == "///" then
table.insert(current, ltrim(line:sub(4)))
elseif line:sub(1,12) == "--[[********" or line:sub(1,9) == "/********" then
if line:find("^%-%-%[%[%*%*%*%*%*%*%*%*+%]%]%-%-$") or line:find("^/%*%*%*%*%*%*%*%*+/$") then
insert_line = true
end
elseif line:sub(1,10) == "e2function" then
local ret, thistype, colon, name, args = line:match("e2function%s+("..p_typename..")%s+([a-z0-9]-)%s*(:?)%s*("..p_func_operator..")%(([^)]*)%)")
if thistype~="" and colon=="" then error("E2doc syntax error: Function names may not start with a number.",0) end
if thistype=="" and colon~="" then error("E2doc syntax error: No type for 'this' given.",0) end
if thistype:sub(1,1):find("[0-9]") then error("E2doc syntax error: Type names may not start with a number.",0) end
desc = table.concat(current, "
")
current = {}
if name:sub(1,8) ~= "operator" and not desc:match("@nodoc") then
if insert_line then
table.insert(output, '|-\n| bgcolor="SteelBlue" | || bgcolor="SteelBlue" | || bgcolor="SteelBlue" | \n')
insert_line = false
end
args, desc = mess_with_args(args, desc, thistype)
if ret == "void" then
ret = ""
else
ret = string.upper(e2_get_typeid(ret))
end
if thistype ~= "" then
thistype = string.upper(e2_get_typeid(thistype))
desc = desc:gsub("", "''"..thistype.."''")
thistype = thistype..":"
end
table.insert(output, string.format("|-\n|%s%s(%s) || %s || ", thistype, name, args, ret))
--desc = desc:gsub("<([^<>]+)>", "''%1''")
table.insert(output, desc)
table.insert(output, "\n")
end
end
end -- for line
output = table.concat(output).."|}\n"
print(output)
writefile(outfile, output)
end
-- Add a client-side "e2doc" console command
if SERVER then
AddCSLuaFile("e2doc.lua")
e2doc = nil
elseif CLIENT then
concommand.Add("e2doc",
function(player, command, args)
if not file.IsDir("e2doc") then file.CreateDir("e2doc") end
if not file.IsDir("e2doc/custom") then file.CreateDir("e2doc/custom") end
local path = string.match(args[2] or args[1],"^%s*(.+)/")
if path and not file.IsDir("e2doc/"..path) then file.CreateDir("e2doc/"..path) end
e2doc(args[1], args[2])
end
,
function (commandName,args) -- autocomplete function
args = string.match(args,"^%s*(.-)%s*$")
local path = string.match(args,"^%s*(.+/)") or ""
local files = file.FindInLua("entities/gmod_wire_expression2/core/"..args.."*")
local ret = {}
for _,v in ipairs(files) do
if string.sub(v,1,1) ~= "." then
if file.IsDir('../lua/entities/gmod_wire_expression2/core/'..path..v) then
table.insert(ret, "e2doc "..path..v.."/")
else
table.insert(ret, "e2doc "..path..v)
end
end
end
return ret
end
)
end