safari-workspaces/trash/safari.js

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
}