var systemEvents = Application("System Events") var os = Library("os") var workspacesDir = os.env("HOME") + "/.safari-workspaces" function getNames() { var items = systemEvents.aliases.byName(workspacesDir).diskItems; var selectedItems = []; for (var i = 0; i < items.length; i++) { var item = items[i]; if (item.class() != "folder" && item.visible()) { selectedItems.push(item.name().substring(0, item.name().length - 5)); } } return selectedItems; } function chooseFromList(title) { if(!title){ title = "Choose Workspace" } var app = Application.currentApplication() app.includeStandardAdditions = true app.activate() var choices = getNames() var choice = app.chooseFromList(choices, { withPrompt: title, defaultItems: choices[0], buttons: ["Cancel", "OK"], defaultButton: "OK" }) // if(!choice){ // choice = "" // } return choice } function getSafariWindowTitles() { var app = Application('Safari') var titles = [] var windows = app.windows() for (var k = 0; k < windows.length; k++) { var url = app.windows.at(k).currentTab.url() var name = app.windows.at(k).currentTab.name() var id = app.windows.at(k).id() titles.push(name) } return titles } function safariWindowWithTitle(title) { var app = Application('Safari') var windows = app.windows() for (var k = 0; k < windows.length; k++) { var name = app.windows.at(k).currentTab.name() if(name == title){ var id = app.windows.at(k).id() return id } } return -1 } function chooseFromSafariWindows() { var app = Application.currentApplication() app.includeStandardAdditions = true app.activate() var choices = getSafariWindowTitles() var choice = app.chooseFromList(choices, { withPrompt: "Choose Window:", defaultItems: choices[0] }) return choice } function saveProperties(workspaceName, workspaceProps) { var path = workspacesDir + "/" + workspaceName + ".json" var result = os.writeJson(path, workspaceProps) var success = result[0] return success } function readProperties(workspaceName) { var result = os.readJson(workspacesDir + "/" + workspaceName + ".json") if(result[0]){ return result[1] } return {error: "workspace not found"} } function addTab(id, url){ var app = Application("Safari") var tab = app.Tab() tab.url = url var win = app.windows.byId(id) win.tabs.push(tab) } function allWindows(){ var app = Application("Safari") var windows = [] for(var i = 0; i < app.windows().length; i++){ windows.push(app.windows.at(i).id()) } return windows.sort(function(a, b){return a-b}) } function newWindow(url){ var app = Application("Safari") app.activate() if(url){ app.Document({url: url}).make() }else{ app.Document().make() } var windows = allWindows() return windows[windows.length - 1] } function addNewWindowTo(workspaceName) { var workspaceProps = readProperties(workspaceName) var winID = newWindow() var workspaceWindow = {id: winID, tabs: []} workspaceProps["Safari"].push(workspaceWindow) saveProperties(workspaceName, workspaceProps) } function shouldIgnoreUrl(url) { var urls = [ "https://gl.intermodi.cc", "https://news.ycombinator.com", "https://git.iris-cloud.de", "https://web.threema.ch", "https://kdw.intermodi.cc", "http://euangoddard.github.io/clipboard2markdown/", "safari-resource:/ErrorPage.html" ] for (var i = 0; i < urls.length; i++) { if(url.startsWith(urls[i])){ return true } } return false } function openWindows(workspaceName) { var workspaceProps = readProperties(workspaceName) var app = Application("Safari") for (var i = 0; i < workspaceProps["Safari"].length; i++) { var workspaceWindow = workspaceProps["Safari"][i] var windowExists = false for(var j = 0; j < app.windows().length; j++){ var openWindow = app.windows.at(j) if(openWindow.id() == workspaceWindow.id){ windowExists = true } } if(!windowExists){ var firstTab = workspaceWindow.tabs[0] var newWindowID = newWindow(firstTab) // console.log("new window created", newWindowID) workspaceWindow.id = newWindowID for (var k = 1; k < workspaceWindow.tabs.length; k++) { // console.log(workspaceWindow.tabs[k]) var url = workspaceWindow.tabs[k] if(!shouldIgnoreUrl(url)){ addTab(newWindowID, workspaceWindow.tabs[k]) } } }else{ console.log("window exists", workspaceWindow.id) } saveProperties(workspaceName, workspaceProps) } } function saveWindows(workspaceName, workspaceProps) { var app = Application("Safari") for(var i = 0; i < app.windows().length; i++){ var openWindow = app.windows.at(i) // console.log("Safari window", openWindow.id()) for (var j = 0; j < workspaceProps["Safari"].length; j++) { var workspaceWindow = workspaceProps["Safari"][j] if(openWindow.id() == workspaceWindow.id){ workspaceWindow.tabs = [] for (var k = 0; k < app.windows.at(i).tabs.length; k++) { var url = openWindow.tabs.at(k).url() if(url){ if(!shouldIgnoreUrl(url)){ workspaceWindow.tabs.push(url) } } } } } } log(workspaceProps) saveProperties(workspaceName, workspaceProps) } function log(obj) { console.log(JSON.stringify(obj, null, 2)) } function addWindowToWorkspace(id, workspaceName) { var app = Application("Safari") var openWindow = app.windows.byId(id) var workspaceProps = readProperties(workspaceName) var workspaceWindow = {id: id, tabs: []} for (var k = 0; k < openWindow.tabs.length; k++) { var url = openWindow.tabs.at(k).url() if(url){ if(!shouldIgnoreUrl(url)){ workspaceWindow.tabs.push(url) } } } workspaceProps["Safari"].push(workspaceWindow) saveWindows(workspaceName, workspaceProps) } // todo: choose from list for window to remove from workspace function closeWindows(workspaceName) { var app = Application("Safari") var workspaceProps = readProperties(workspaceName) saveWindows(workspaceName, workspaceProps) var windowsToRemove = [] for (var i = 0; i < workspaceProps["Safari"].length; i++) { var workspaceWindow = workspaceProps["Safari"][i] try{ app.close(app.windows.byId(workspaceWindow.id)) }catch(err){ // fenster die vorher manuell geschlossen wurden // werden aus der liste an fenstern entfernt // windowsToRemove.push(workspaceProps["Safari"][i].id) } } // for (var i = 0; i < workspaceProps["Safari"].length; i++) { // var workspaceWindow = workspaceProps["Safari"][i] // for (var j = 0; j < windowsToRemove.length; j++) { // if(workspaceWindow.id == windowsToRemove[j]){ // try{ // workspaceProps["Safari"].splice([i], 1) // }catch(err){ // } // } // } // } }