safari-workspaces/workspace.js

289 lines
7.0 KiB
JavaScript

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){
// }
// }
// }
// }
}