#!/usr/bin/env osascript -l JavaScript var sys = Library("system") var app = Application('Safari') var workspace function setWorkspace(w){ workspace = w sys.setWorkspace(w) } function create(url){ app.Document().make().url = url delay(1) return sys.windowID("Safari", -1) } /** @desc Get list of workspace-related windows from file. If there are stored windows that do not exist, they will be removed. @param {String} appName @returns {Array} List of objects in the form {id:2445, } */ function workspaceWindows() { var result = sys.retrieve("Safari") var success = result[0] var wlist = result[1] if(!success){ return [] } return wlist } // var url = "https://news.ycombinator.com/" // var name = "HN" // var id = safari.create(url) // console.log("id", id) // if(id != -1){ // var workspaceWindow = {id:id, url:url, name:name } // wlist.push(workspaceWindow) // if(store(appName, wlist)[0]){ // return true // } // } function addWorkspaceWindow(){ var wlist = workspaceWindows() var name = "HN" var url = "https://news.ycombinator.com/" var id = create(url) if(id != -1){ var workspaceWindow = {id:id, tabs:[{url:url, name:name}] } wlist.push(workspaceWindow) if(sys.store("Safari", wlist)[0]){ return true } } return false } function deleteWorkspaceWindow() { list() var index = parseInt(sys.prompt("The window at which index would you delete?", -1)) if (index < 0){ return false } var wlist = workspaceWindows() console.log("list", wlist.length, "index", index) if(wlist.length > index){ var win = wlist[index] var id = win["id"] console.log("win", JSON.stringify(win)) if(sys.windowExistWithId("Safari", id)){ app.close(app.windows.byId(id)) } wlist.splice(index, 1) sys.store("Safari", wlist) }else{ console.log("out of range") } } /** @desc Print list of all open Terminal windows. **/ function list() { var wlist = workspaceWindows() for (var i = 0; i < wlist.length; i++) { var id = wlist[i]["id"] var running = sys.windowExistWithId("Safari", id) var winName = "" var tabCount = wlist[i]["tabs"].length var win = null if(running){ win = app.windows.byId(id) winName = win.name() tabCount = win.tabs.length + 1 } console.log(i, id, "tabs", tabCount, "running", running , winName) } } function addTab(id, url){ var tab = app.Tab() tab.url = url var win = app.windows.byId(id) win.tabs.push(tab) } function open(){ var wlist = workspaceWindows() var changed = false // define new window if none are there if(wlist.length == 0){ var win var url = arguments[0] if(arguments.length > 0){ win = {id:0, tabs:[{name:"", url:url}]} }else{ win = {id:0, tabs:[{name:"HN", url:"http://news.ycombinator.com"}]} } wlist.push(win) changed = true } // create windows for (var i = 0; i < wlist.length; i++) { var win = wlist[i] var id = win.id if(!sys.windowExistWithId("Safari", id)){ var tabs = wlist[i]["tabs"] var windowID = create(tabs[0]["url"]) wlist[i]["id"] = windowID // update window id in file changed = true for (var j = 1; j < tabs.length; j++) { if(tabs[j]["url"] != null){ addTab(windowID, tabs[j]["url"]) } } } } if(changed){ sys.store("Safari", wlist) } return true } function save(wlist){ if(wlist.length == 0) return false for (var i = 0; i < wlist.length; i++) { var win = wlist[i] var id = win.id if(sys.windowExistWithId("Safari", id)){ var tabs = tabsInWindowWithId(id) if(tabs.length > 0){ wlist[i]["tabs"] = tabs } } } return sys.store("Safari", wlist)[0] } function close(){ var wlist = workspaceWindows() if(wlist.length == 0) return false if(!save(wlist)){ console.log("safari window save error") } for (var i = 0; i < wlist.length; i++) { try{ // var win = wlist[i] // var id = win.id // console.log("close", JSON.stringify(wlist[i])) app.close(app.windows.byId(wlist[i]["id"])) }catch(err){} } return true } /** @returns {Array} List of objects in the form {url:url, name:name} */ function tabsInWindowWithId(id){ var urls = [] if(!sys.windowExistWithId("Safari", id)){ return urls } var win = app.windows.byId(id) for (var i = 0; i < win.tabs.length; i++) { var url = win.tabs.at(i).url() var name = win.tabs.at(i).name() urls.push({name:name, url:url}) } return urls }