local DevToolsMenuItemName = 'miDevTools' local DevToolsMenuItemCaption = '&Dev Tools' local miDevTools local _require = require function findLuaModules(entryPointName) local foundModules = { } local loader local modPath require = function(name) package.loaded[name] = false for i, searcher in ipairs(package.searchers) do loader, modPath = searcher(name) if modPath then if modPath:match('init.lua$') then foundModules[name..'.init'] = modPath else foundModules[name] = modPath end break end end return _require(name) end require(entryPointName) require = _require return foundModules end registerLuaFunctionHighlight('findLuaModules') function packLuaModules(entryPointName, removeIfFound) local packedLuaModules = { } local foundModules = findLuaModules(entryPointName) for name, modPath in pairs(foundModules) do local tfName = name..'.lua' local tableFile = findTableFile(tfName) if tableFile and removeIfFound then tableFile.delete() tableFile = nil end if not tableFile then tableFile = createTableFile(tfName, modPath) packedLuaModules[tfName] = modPath end end return packedLuaModules end registerLuaFunctionHighlight('packLuaModules') function repackLuaModules(entryPointName) return packLuaModules(entryPointName, true) end registerLuaFunctionHighlight('repackLuaModules') function getTableFilesList() local tableMenuItemName = 'miTable' local tableAddFileMenuItemName = 'miAddFile' if not MainForm.Menu then return end local menuItems = MainForm.Menu.Items local miTable local tableFiles = { } for i = 0, menuItems.Count - 1 do if menuItems[i].Name == tableMenuItemName then miTable = menuItems[i] ---- If table menu is never opened, ---- then the table files are never added as menu items. miTable.doClick() end end local startCapture = false for i = 0, miTable.Count - 1 do if startCapture then table.insert(tableFiles, miTable[i].Caption) end if not startCapture and miTable[i].Name == tableAddFileMenuItemName then startCapture = true end end return tableFiles end registerLuaFunctionHighlight('getTableFilesList') function removeAllTableFiles() local deletedList = { } local fileList = getTableFilesList() for i = 1, #fileList do local name = fileList[i] local tableFile = findTableFile(name) if tableFile then tableFile.delete() table.insert(deletedList, name) end end return deletedList end registerLuaFunctionHighlight('removeAllTableFiles') function packTableFiles(folderPath, removeIfFound) ---- Names starting with "_" are hidden when packing files folderPath = folderPath or '' local fileList local tableFiles = { } if type(folderPath) == 'table' then fileList = folderPath else fileList = getFileList(folderPath) end if fileList then for i, fileName in ipairs(fileList) do if fileName:sub(1, 1) ~= '_' and not fileName:lower():match('.lua$') and not fileName:lower():match('.ct$') then local tableFileName = fileName:match('^[(%w:\\)].*\\(.-%..-)$') or fileName if tableFileName then local tableFile = findTableFile(tableFileName) if tableFile and removeIfFound then tableFile.delete() tableFile = nil end if not tableFile then createTableFile(tableFileName, fileName) table.insert(tableFiles, tableFileName) end end end end end if type(folderPath) == 'string' then folderList = getDirectoryList(folderPath) if folderList then for i, path in ipairs(folderList) do local folderName = path if folderPath ~= '' then folderName = path:sub(#folderPath + 2, #path) end if folderName:sub(1, 1) ~= '_' then local tbl = packTableFiles(path, removeIfFound) for _, v in ipairs(tbl) do table.insert(tableFiles, v) end end end end end return tableFiles end registerLuaFunctionHighlight('packTableFiles') function repackTableFiles(folderPath, removeAll) if removeAll then removeAllTableFiles() end return packTableFiles(folderPath, true) end registerLuaFunctionHighlight('repackTableFiles') local function setupForm() local settings = getSettings('TableDevToolsTableFilesForm') local padding = 5 local btnHeight = 40 local form = createForm(false) form.Caption = 'Table File Packer' form.Width = tonumber(settings['FormWidth']) or 550 form.Height = tonumber(settings['FormHeight']) or 500 form.Top = tonumber(settings['FormTop']) or 10 form.Left = tonumber(settings['FormLeft']) or 10 form.PopupMode = 'pmNone' -- form.BorderStyle = 'bsSizeable' local list = createListBox(form) list.Width = 300 list.Height = form.Height - padding * 2 list.Top = padding list.Left = padding list.Anchors = '[akTop,akBottom,akLeft]' ---- local btnWidth = form.Width - (list.Width + padding * 3) local pos = padding ---- local btnListFiles = createButton(form) btnListFiles.Caption = 'List Files' btnListFiles.Width = btnWidth btnListFiles.Height = btnHeight btnListFiles.Top = pos btnListFiles.Left = list.Width + padding * 2 btnListFiles.OnClick = function(sender) list.clear() local fileList = getTableFilesList() local stringsList = list.getItems() for i, name in ipairs(fileList) do stringsList.add(name) end end pos = pos + btnHeight ---- local btnRemoveFiles = createButton(form) btnRemoveFiles.Caption = 'Remove All Table Files' btnRemoveFiles.Width = btnWidth btnRemoveFiles.Height = btnHeight btnRemoveFiles.Top = pos btnRemoveFiles.Left = list.Width + padding * 2 btnRemoveFiles.OnClick = function(sender) list.clear() removeAllTableFiles() local fileList = getTableFilesList() local stringsList = list.getItems() for i, name in ipairs(fileList) do stringsList.add(name) end end pos = pos + btnHeight ---- local lblLocalFolder = createLabel(form) lblLocalFolder.Caption = 'Table File\'s Local Folder' lblLocalFolder.Width = btnWidth lblLocalFolder.Top = pos lblLocalFolder.Left = list.Width + padding * 2 pos = pos + lblLocalFolder.Height ---- local edtLocalFolder = createEdit(form) edtLocalFolder.Width = btnWidth edtLocalFolder.Top = pos edtLocalFolder.Left = list.Width + padding * 2 pos = pos + edtLocalFolder.Height ---- local btnRepack = createButton(form) btnRepack.Caption = 'Repack Table Files' btnRepack.Width = btnWidth btnRepack.Height = btnHeight btnRepack.Top = pos btnRepack.Left = list.Width + padding * 2 btnRepack.OnClick = function(sender) list.clear() repackTableFiles(edtLocalFolder.Text) local fileList = getTableFilesList() local stringsList = list.getItems() for i, name in ipairs(fileList) do stringsList.add(name) end end pos = pos + btnHeight ---- local lblEntryPoint = createLabel(form) lblEntryPoint.Caption = 'Lua Module\'s Entry Point' lblEntryPoint.Width = btnWidth lblEntryPoint.Top = pos lblEntryPoint.Left = list.Width + padding * 2 pos = pos + lblEntryPoint.Height ---- local edtEntryPoint = createEdit(form) edtEntryPoint.Width = btnWidth edtEntryPoint.Top = pos edtEntryPoint.Left = list.Width + padding * 2 pos = pos + edtEntryPoint.Height ---- local btnRepackMosules = createButton(form) btnRepackMosules.Caption = 'Repack Lua Modules' btnRepackMosules.Width = btnWidth btnRepackMosules.Height = btnHeight btnRepackMosules.Top = pos btnRepackMosules.Left = list.Width + padding * 2 btnRepackMosules.OnClick = function(sender) list.clear() repackLuaModules(edtEntryPoint.Text) local fileList = getTableFilesList() local stringsList = list.getItems() for i, name in ipairs(fileList) do stringsList.add(name) end end pos = pos + btnHeight ---- form.registerCloseCallback(function(form) settings['FormWidth'] = form.Width settings['FormHeight'] = form.Height settings['FormTop'] = form.Top settings['FormLeft'] = form.Left return caFree end) return form end local form = setupForm() local function getMainFormMenuItem() if MainForm.Menu == nil then return end local menuItems = MainForm.Menu.Items local mi = nil for i = 0, menuItems.Count - 1 do if menuItems[i].Name == DevToolsMenuItemName then mi = menuItems[i] mi.visible = true end end if mi == nil then mi = createMenuItem(MainForm) mi.Name = DevToolsMenuItemName mi.Caption = DevToolsMenuItemCaption MainForm.Menu.Items.insert(5, mi) end return mi end local function addMenuItem(caption, onClick) local newItem = createMenuItem(miDevTools) miDevTools.add(newItem) newItem.Caption = caption newItem.OnClick = onClick return newItem end local function loadMenuDevTools() miDevTools = getMainFormMenuItem() if miDevTools.Count > 0 then addMenuItem('-') end addMenuItem(translate('Open Table File Packer'), form.show) end loadMenuDevTools()