225 lines
4.6 KiB
JavaScript
225 lines
4.6 KiB
JavaScript
#!/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
|
|
}
|