-- TIME_STAMP 2019-01-05 00:35:59 v 1.4 -- by BugFix shell = require "shell" -- declare table to hold helper functions local f = {} f.TimeStamp = EventClass:new(Common) -- BEFORE SAVE==============================================BEGIN function f.TimeStamp:OnBeforeSave(fname) local tFile = {Dir = props['FileDir'], Name = props['FileName'], Ext = props['FileExt']:lower()} local tSetStamp = {} -- File types to set time stamp for ext in (props['Use.TimeStamp.With.Files']):gmatch('([^|]+)') do tSetStamp[ext] = true end local tWriteBackup = {} -- File types to write version backup for ext in (props['Use.VersionBackUp.With.Files']):gmatch('([^|]+)') do tWriteBackup[ext] = true end -- check conditions to call the function if tFile.Ext == nil or (tSetStamp[tFile.Ext] == nil and tWriteBackup[tFile.Ext] == nil) then return end -- call function f.InsertTimestamp(tFile, (tSetStamp[tFile.Ext] ~= nil), (tWriteBackup[tFile.Ext] ~= nil)) end -- BEFORE SAVE================================================END -- HELPER FUNCTIONS=========================================BEGIN ----------------------------------------------------------------- ----------------------------------------------------------------- -- Create a new folder -- (incl. subfolders, if given but not exists) -- return: true, 'successfully created' = Succes -- false, 'creation failed' = Failed -- false, 'always exists' = Folder always exists f.FolderCreate = function(sPath) if not shell.fileexists(sPath) then local ret = shell.exec('CMD /C MD "' .. sPath .. '"', nil, true, true) if ret == 0 then return true, 'successfully created' else return false, 'creation failed' end else return false, 'already exists' end end ----------------------------------------------------------------- -- Write to a file f.FileWrite = function(sPath, data, flag) local fhOut = io.open(sPath, flag) fhOut:write(data) fhOut:close() return true end ----------------------------------------------------------------- -- Split version number to main and sub part f.splitVer = function(sVer) if type(sVer) ~= 'string' then sVer = tostring(sVer) end if sVer:len() == 0 then return nil end local tVer = {'',''} n = 1 for k, w in sVer:gmatch(".") do if k ~= "." then tVer[n] = tVer[n] .. k else n = n +1 end end return tonumber(tVer[1]), tonumber(tVer[2]) end ----------------------------------------------------------------- -- Get current version number and increase if required f.Version = function (text, verMark) local sVer, verMain, verSub local mustSave = 0 local vStart, vEnd = text:find("v %d+\.%d+") if vStart == nil then verMain = 0 verSub = 1 else sVer = text:sub(vStart+2, vEnd) verMain, verSub = f.splitVer(sVer) end if verMark ~= nil then verMark = text:sub(verMark, verMark) end -- choose: 'V' =Main-Num increase, Sub-Num set back to '0'; 'v' =Sub-Num increase; -- 'n' =existing Ver-Num will used as is (may be changed by hand for version jump) and a backup will create if verMark == 'V' then verMain = verMain +1 verSub = 0 mustSave = 1 elseif verMark == 'v' then verSub = verSub +1 mustSave = 1 elseif verMark == 'n' then mustSave = 1 end sVer = 'v '..verMain..'.'..verSub return sVer, mustSave end ----------------------------------------------------------------- -- Save a copy of the current file with new version number and set time stamp --[[ Need an entry in SciTEUser.properties to use right folder! #~ Set TimeStamp for following file types: EXT|EXT.. Use.TimeStamp.With.Files=au3|lua|py #~ Comment characters for single line comment: EXT=CHARACTERS|..|.. Line.Comment.Char=au3=;|lua=--|py=# #~ Use version backup for following file types: EXT|EXT.. Use.VersionBackUp.With.Files=au3|lua|py #~ Path for saving version backups [VER_DIR]: (Path/Deafult) #~ IMPORTANT: Don't write path inside quotation! #~ NO trailing backslash! #~ "Version.Path.*=default" - create subfolder in current script folder (also, if property not exists or has none value) #~ foldername: $(Version.Path.ext)\$(Version.Prefix)FILENAME.EXT\ #~ filename: \FILENAME[Version-Number].EXT Version.Prefix=DETERMINE A GLOBAL PREFIX FOR YOUR FOLDERNAMES, CAN BE LEFT BLANK (see "foldername:") i.e.: "Version.Prefix=BUVer_" for "BackUpVersion" Version.Path.au3=$(SciteDefaultHome)\VersionBackup\AU3 Version.Path.lua= Version.Path.py= ]] f.SaveToVersionFolder = function (tFile, sVer) local sSaveFolder = props['Version.Path.'..tFile.Ext]:lower() if sSaveFolder == '' then sSaveFolder = 'default' end local sPrefix = props['Version.Prefix'] local sVerFolder = sPrefix..tFile.Name..'.'..tFile.Ext..'\\' local sVerFile = tFile.Name..'['..sVer:sub(3, sVer:len())..']'..'.'..tFile.Ext if sSaveFolder == 'default' then sSaveFolder = tFile.Dir..'\\' end local len = sSaveFolder:len() if sSaveFolder:sub(len, len) ~= '\\' then sSaveFolder = sSaveFolder..'\\' end if not shell.fileexists(sSaveFolder..sVerFolder) then f.FolderCreate(sSaveFolder..sVerFolder) end if shell.fileexists(sSaveFolder..sVerFolder..sVerFile) then return nil end return f.FileWrite(sSaveFolder..sVerFolder..sVerFile, editor:GetText(), "wb") end -- HELPER FUNCTIONS===========================================END --TIME STAMP WITH VERSION BACKUP============================BEGIN f.InsertTimestamp = function (tFile, bStamp, bBackup) local EscapeMagic = function(_str) return _str:gsub('(.)', function(c) return c:gsub('([%(%)%.%%%+%-%*%?%[%^%$])', '%%%1') end) end local tCmtChar = {} for ext, cmntchr in (props['Line.Comment.Char']):gmatch('([^|=]+)=([^|]+)') do tCmtChar[ext] = cmntchr end local sCmntChar = tCmtChar[tFile.Ext] or '' if sCmntChar == '--' then sCmntChar = '' end local pattCmntChar = EscapeMagic(sCmntChar) local caret = editor.CurrentPos local s, t, lineNr, lineTxt, verMark, verLen = editor:GetText() local mustSave = 0 local sVer = 'v 0.1' lineLen = 0 local onlyStamp, space = false, ' ' local firstVisible, lineDiff = editor.FirstVisibleLine, 0 if not bBackup and bStamp then onlyStamp = true space = '' sVer = '' end local a, y = s:find(pattCmntChar.."%-* TIME_STAMP.*()\n") editor:BeginUndoAction() if a ~= nil then editor:GotoPos(a) lineNr = editor:LineFromPosition(editor.CurrentPos) lineTxt, lineLen = editor:GetLine(lineNr) if y then -- time stamp exists if not onlyStamp then verMark = lineTxt:find("[vVn][\r\n]+") if verMark == nil then -- no marker set, time stamp with/without version number if lineTxt:find("v %d+\.%d+") then -- with version number sVer, mustSave = f.Version(lineTxt, verMark) else -- without version number space = '' sVer = '' end else -- marker set, time stamp with/without version number if lineTxt:find("v %d+\.%d+") then -- with version number, version backup desired sVer, mustSave = f.Version(lineTxt, verMark) else -- without version number, first backup if lineTxt:find("%dv\r\n") then sVer = 'v 0.1' mustSave = 1 elseif lineTxt:find("%dV\r\n") then sVer = 'v 1.0' mustSave = 1 else space = '' sVer = '' end end end end t = "-- TIME_STAMP "..os.date("%Y-%m-%d %H:%M:%S")..space..sVer.."\r\n" y = a + lineLen t = sCmntChar..t editor:SetSel(a-1,y-1) editor:ReplaceSel(t) end else -- first saving - to avoid backup, use asterisk at first editor position if bBackup then mustSave = 1 end editor:SetSel(0,1) if editor:GetSelText() == '*' then -- with asterisk at first editor position: no backup will saved, only time stamp are print mustSave = 0 space = '' sVer = '' s = s:sub(2) -- delete asterisk from editor text end editor:GotoPos(0) t = "-- TIME_STAMP "..os.date("%Y-%m-%d %H:%M:%S")..space..sVer.."\r\n" t = sCmntChar..t editor:SetText(t.."\r\n"..s) lineDiff = 2 if caret == nil then caret = 0 end caret = caret + t:len() +2 end editor:EndUndoAction() editor.FirstVisibleLine = firstVisible + lineDiff if mustSave == 1 then f.SaveToVersionFolder(tFile, sVer) end editor:SetSel(caret,caret) end -- TIME STAMP WITH VERSION BACKUP=============================END