289 lines
7.0 KiB
JavaScript
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){
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
|
|
} |