-- TIME_STAMP 2022-03-21 16:14:43 v 0.4 -- coding:utf-8 local FunctionHeader = {} FunctionHeader.SelectExt = function(self) local ext = props['FileExt']:lower() if ext == 'au3' then self:AU3() elseif ext == 'lua' then self:LUA() else print('!> There is no header function for "*.'..ext..'"!') end end FunctionHeader.AU3 = function(self) local caret = editor.CurrentPos local line = editor:LineFromPosition(caret) local textline = editor:GetLine(line) local text = '' -- line has continuation mark ? while true do text = text .. textline if not textline:find('%s_[\r\n]-') then break end line = line +1 textline = editor:GetLine(line) end -- remove continuation mark & line break, shorten many %s to one text = text:gsub('%s_[\r\n]-', ' '):gsub('%s+', ' ') -- extract name and params local fname, param = text:match('([%w_]+)%s-(%b())') if fname == nil then print('!> No function declaration in this line!') return end param = param:sub(2,-2) local tTemp, tParam, len = {}, {}, 7 -- {{$var,default-value,Const/ByRef}}, min var-len=7 if param ~= '' then for m in param:gmatch('%s*([^,]+)') do table.insert(tTemp, m) end local var, defval for i=1, #tTemp do if tTemp[i]:find('^[Cc][Oo][Nn][Ss][Tt]') then var = tTemp[i]:match('(%$[%w_]+)') if tTemp[i]:find('%s[Bb][Yy][Rr][Ee][Ff]') then table.insert(tParam, {var, nil, 'Const ByRef'}) else table.insert(tParam, {var, nil, 'Const'}) end elseif tTemp[i]:find('^[Bb][Yy][Rr][Ee][Ff]') then var = tTemp[i]:match('(%$[%w_]+)') table.insert(tParam, {var, nil, 'ByRef'}) elseif tTemp[i]:find('%$[%w_]+%s*=%s*') then var, defval = tTemp[i]:match('^(%$[%w_]+)%s*=%s*(.+)') table.insert(tParam, {var, defval}) else var = tTemp[i]:match('^(%$[%w_]+)') table.insert(tParam, {var}) end if var:len() > len then len = var:len() end end end local n, sHeader, sIntro, sDots, sOpt, sAdd, sSpace = "\r\n", "", "", "; ...............: ", "; ....[optional].: ", "", "" sHeader = sHeader .. "; #FUNCTION# " .. string.rep("=", 87) .. n sHeader = sHeader .. "; Name ..........: " .. fname .. n sHeader = sHeader .. "; Description ...: " .. n sHeader = sHeader .. "; Parameter(s)...: " if #tParam > 0 then sSpace = (" "):rep(len +2 -tParam[1][1]:len()) if tParam[1][2] ~= nil then sAdd = "[optional] (Default: ".. tParam[1][2] ..")" end if tParam[1][3] ~= nil then sAdd = "(".. tParam[1][3] ..")" end sHeader = sHeader .. tParam[1][1] .. sSpace .. sAdd end if #tParam > 1 then sHeader = sHeader .. n for i=2, #tParam do sAdd, sIntro, sSpace = "", sDots, (" "):rep(len +2 -tParam[i][1]:len()) if tParam[i][2] ~= nil then sAdd, sIntro = "(Default: ".. tParam[i][2] ..")", sOpt end if tParam[i][3] ~= nil then sAdd = "(".. tParam[i][3] ..")" end sHeader = sHeader .. sIntro .. tParam[i][1] .. sSpace .. sAdd .. n end else sHeader = sHeader .. n end sHeader = sHeader .. "; Return values .: " .. "Success " .. n sHeader = sHeader .. "; ...............: " .. "Failure " .. n sHeader = sHeader .. "; Author ........: " .. props['UDFCreator'] .. n sHeader = sHeader .. "; Remarks .......: " .. n sHeader = sHeader .. "; " .. string.rep("=", 98) .. n local posIns = editor:PositionFromLine(editor:LineFromPosition(caret)) editor:InsertText(posIns, sHeader) end FunctionHeader.LUA = function(self) local caret = editor.CurrentPos local line = editor:LineFromPosition(caret) local home = editor:PositionFromLine(line) local text = editor:GetLine(line) if text == nil then print('!> No function declaration in this line!') return end if not text:find('function') then print('!> No function declaration in this line!') return end -- match "local function fname(param)" local p, fname, param = text:match('()local function ([%w_]+)%s-(%b())') -- match "function fname(param)" if fname == nil then p, fname, param = text:match('()function ([%w_]+)%s-(%b())') end -- match "local fname = function(param)" if fname == nil then p, fname, param = text:match('()local ([%w_]+)%s-=%s-function(%b())') end -- match "table.fname = function()" if fname == nil then p, fname, param = text:match('()([%w_]+%.[%w_]+)%s-=%s-function(%b())') end -- match "fname = function(param)" if fname == nil then p, fname, param = text:match('()([%w_]+)%s-=%s-function(%b())') end param = param:sub(2,-2) local tParam = {} -- {var} if param ~= '' then for m in param:gmatch('%s*([^,]+)') do m = m:match('%s*([^%s]+)%s*') table.insert(tParam, m) end end local n, sHeader, sDots, sIndent= "\n", "", ".............: ", "" if p > 1 then sIndent = (' '):rep(p-1) end sHeader = sHeader .. sIndent .. "--[[ #FUNCTION# " .. n sHeader = sHeader .. sIndent .. " Name ........: " .. fname .. n sHeader = sHeader .. sIndent .. " Description .: " .. n sHeader = sHeader .. sIndent .. " Parameter(s).: " if #tParam > 0 then sHeader = sHeader .. tParam[1] end if #tParam > 1 then sHeader = sHeader .. n for i=2, #tParam do sHeader = sHeader .. sDots .. tParam[i] .. n end else sHeader = sHeader .. n end sHeader = sHeader .. sIndent .. " Return ......: " .. "Success " .. n sHeader = sHeader .. sIndent .. " .............: " .. "Failure " .. n sHeader = sHeader .. sIndent .. " Author ......: " .. props['UDFCreator'] .. n sHeader = sHeader .. sIndent .. " Remarks .....: " .. n sHeader = sHeader .. sIndent .. "]]\n" .. sIndent .. string.rep("-", 100) .. n editor:InsertText(home, sHeader) end FunctionHeader:SelectExt()