START.applescript aktualisiert

Aktualisiert auf Version 1.5
Doppelte Pfadwurzel eliminiert.
Funktionalität unverändert, verweist auf aktualisierte _belegversand*-Scripts.
Alle Pfade von Version 1.4 unverändert übernommen!
This commit is contained in:
2026-10-12 20:27:28 +00:00
parent 897e541b3b
commit 3fee1372e0
+55 -127
View File
@@ -1,5 +1,5 @@
(*
START.scpt - Version 1.4
START.scpt - Version 1.5
Rolle dieses Scripts
--------------------
Dieses Script ist der sichtbare Einstiegspunkt für Anwender:innen.
@@ -20,44 +20,53 @@ START.scpt ist bewusst klein gehalten.
Die eigentliche Fachlogik liegt in:
- _belegversand_setup.scpt
- _belegversand.scpt
Version 1.5:
-----------
- Fix: Pfade zu Helpers/scripts werden zentral in helperScriptPath()
gebaut. Vorher überschrieb showWelcomeDialogIfNeeded() die Property
basePath mit einem absoluten Pfad – danach entstand beim Start des
Setup-Scripts ein doppelter Home-Pfad (/Users/x//Users/x/Library/...).
Aufgefallen ist das erst, seit das Setup SHOW_README=true schreibt.
- basePath jetzt ohne führenden Schrägstrich, wie in den anderen Scripts
- doppelten Kommentarblock entfernt
*)
-- Name des Setup-Scripts, das im Unterordner "Helpers/scripts" liegt.
-- Dieses Script wird von START.scpt immer am Ende aufgerufen.
property setupScriptName : "_belegversand_setup.scpt"
-- Name des Scripts mit dem Text für den Willkommensdialog.
property aboutScriptName : "_text_about.scpt"
-- Name der DEVONthink-Gruppe, in der Konfigurationsdateien liegen.
property configGroupName : "_config"
-- Name der eigentlichen Konfigurationsdatei in DEVONthink.
property configRecordName : "belegversand.conf"
property appVersion : "1.4"
property basePath : "/Library/Application Scripts/com.devon-technologies.think/Menu/Belegversand"
property appVersion : "1.5"
-- Relativ zum Home-Ordner. Wird NIE zur Laufzeit verändert.
property basePath : "Library/Application Scripts/com.devon-technologies.think/Menu/Belegversand"
property windowTitle : "Belegversand, Vers. " & appVersion
(*
helperScriptPath(scriptFileName)
--------------------------------
Liefert den absoluten Pfad eines Scripts in Helpers/scripts, z. B.
/Users/<name>/Library/Application Scripts/.../Belegversand/Helpers/scripts/_belegversand_setup.scpt
Einzige Stelle, an der dieser Pfad zusammengebaut wird.
*)
on helperScriptPath(scriptFileName)
-- POSIX path of (path to home folder) endet bereits mit "/"
return (POSIX path of (path to home folder)) & basePath & "/Helpers/scripts/" & scriptFileName
end helperScriptPath
(*
runSiblingScript(scriptFileName)
--------------------------------
Lädt und startet ein weiteres AppleScript aus dem Unterordner "Helpers/scripts".
Parameter:
- scriptFileName : Dateiname des aufzurufenden Scripts, z. B.
"_belegversand_setup.scpt"
Ablauf:
- absolute Basis-Path setzen
- daran den Unterordner "Helpers/scripts" und den Dateinamen anhängen
- prüfen, ob die Scriptdatei existiert
- Script laden
- Script ausführen
Fehlerbehandlung:
- wenn die Datei nicht gefunden wird -> Hinweisdialog
- wenn das Laden oder Starten fehlschlägt -> Hinweisdialog mit Fehlermeldung
Wichtig:
--------
Der absolute Pfad ist invariant und unabhängig vom Speicherort dieses Scripts.
*)
on runSiblingScript(scriptFileName)
-- Absolute Basis-Path (Home + fest Installation)
set expandedPath to (do shell script "echo ~") & "/" & basePath
set targetPath to expandedPath & "/Helpers/scripts/" & scriptFileName
set targetPath to my helperScriptPath(scriptFileName)
try
set targetAlias to POSIX file targetPath as alias
@@ -73,23 +82,14 @@ on runSiblingScript(scriptFileName)
display dialog "Hinweis: Konnte Script nicht starten:" & return & scriptFileName & return & return & errMsg buttons {"OK"} default button "OK"
end try
end runSiblingScript
(*
recordText(theRecord)
---------------------
Liest den Textinhalt eines DEVONthink-Records.
Verwendung in START.scpt:
-------------------------
Hier wird dieser Handler genutzt, um den Inhalt der Datei
"_config/belegversand.conf" als Text einzulesen.
Ablauf:
- zunächst plain text versuchen
- wenn das fehlschlägt, auf content ausweichen
- wenn beides fehlschlägt, leeren String zurückgeben
Hinweis:
--------
Die Konvertierung erscheint hier als "rich text", weil AppleScript/Script Editor
solche Stellen beim Kompilieren teilweise selbstständig umschreiben kann.
Der funktionale Zweck ist hier aber: Textinhalt lesbar zurückgeben.
*)
on recordText(theRecord)
tell application id "DNtp"
@@ -108,20 +108,12 @@ on recordText(theRecord)
end try
end tell
end recordText
(*
findChildByName(parentRecord, childName)
----------------------------------------
Sucht innerhalb einer DEVONthink-Gruppe ein direktes Kind mit bestimmtem Namen.
Parameter:
- parentRecord : die Gruppe, in der gesucht werden soll
- childName : Name des gesuchten direkten Kinds
Rückgabe:
- den gefundenen DEVONthink-Record
- oder missing value, wenn nichts passt
Verwendung in START.scpt:
-------------------------
- _config-Gruppe unter der DB-Wurzel suchen
- belegversand.conf innerhalb von _config suchen
Rückgabe: den gefundenen Record oder missing value.
*)
on findChildByName(parentRecord, childName)
tell application id "DNtp"
@@ -135,25 +127,13 @@ on findChildByName(parentRecord, childName)
end tell
return missing value
end findChildByName
(*
getTopParentGroup(theRecord)
----------------------------
Ermittelt die oberste Gruppe einer DEVONthink-Hierarchie ausgehend von einem Record.
Ablauf:
- starte mit dem aktuell übergebenen Record
- frage wiederholt nach dessen Eltern
- solange es noch einen Parent gibt, gehe eine Ebene nach oben
- sobald kein Parent mehr vorhanden ist, ist die Wurzel erreicht
Verwendung in START.scpt:
-------------------------
START.scpt kennt die gewünschte Datenbank nicht direkt.
Darum nimmt es irgendein ausgewähltes Objekt in DEVONthink
und geht davon über die Parent-Kette bis zur obersten Gruppe hoch.
Dort wird dann _config gesucht.
Vorteil:
--------
Das Script ist dadurch nicht an einen festen Datenbanknamen gebunden,
sondern arbeitet relativ zur aktuellen Auswahl.
START.scpt kennt die gewünschte Datenbank nicht direkt, sondern geht von
der aktuellen Auswahl über die Parent-Kette bis zur Wurzel hoch.
*)
on getTopParentGroup(theRecord)
tell application id "DNtp"
@@ -170,21 +150,12 @@ on getTopParentGroup(theRecord)
end repeat
end tell
end getTopParentGroup
(*
configValue(configText, keyName)
--------------------------------
Liest aus einem einfachen key=value-Konfigurationstext den Wert zu einem bestimmten Schlüssel.
Parameter:
- configText : kompletter Textinhalt der Konfigurationsdatei
- keyName : gesuchter Schlüssel, z. B. "SHOW_README"
Rückgabe:
- Textwert des gefundenen Schlüssels
- oder missing value, wenn kein passender Eintrag existiert
Funktionsweise:
---------------
- zeilenweise durch die Konfiguration gehen
- prüfen, ob eine Zeile mit "KEY=" beginnt
- den Teil rechts vom "=" zurückgeben
Liest aus einem key=value-Konfigurationstext den Wert zu einem Schlüssel.
Rückgabe: Textwert oder missing value.
*)
on configValue(configText, keyName)
set keyPrefix to keyName & "="
@@ -201,24 +172,13 @@ on configValue(configText, keyName)
end repeat
return missing value
end configValue
(*
findConfigInCurrentDB()
-----------------------
Sucht die Konfigurationsdatei belegversand.conf relativ zur aktuellen DEVONthink-Auswahl.
Ablauf:
1. aktuelle Auswahl holen
2. falls nichts ausgewählt ist -> missing value
3. von der Auswahl zur DB-Wurzel hochgehen
4. dort die Gruppe _config suchen
5. darin die Datei belegversand.conf suchen
Rückgabe:
- den gefundenen Config-Record
- oder missing value, wenn keine passende Konfiguration existiert
Wichtig:
--------
Es wird absichtlich nicht global in allen Datenbanken gesucht,
sondern immer nur relativ zur aktuellen Auswahl.
So bleibt das Verhalten bei mehreren Datenbanken stabil und nachvollziehbar.
Sucht belegversand.conf relativ zur aktuellen DEVONthink-Auswahl
(DB-Wurzel → _config → belegversand.conf).
Bewusst nicht global in allen Datenbanken.
*)
on findConfigInCurrentDB()
tell application id "DNtp"
@@ -239,61 +199,38 @@ end findConfigInCurrentDB
showWelcomeDialogIfNeeded()
---------------------------
Zeigt den Willkommensdialog beim Start an, falls konfiguriert (SHOW_README=true).
Ablauf:
1. Config-Datei relativ zur aktuellen Auswahl suchen
2. Wert SHOW_README auslesen
3. falls SHOW_README=true -> Dialog mit "Nicht mehr anzeigen"-Option anzeigen
4. falls User "Diesen Dialog nicht mehr anzeigen" wählt:
-> SHOW_README auf false in der Config zurückschreiben
Wichtig:
--------
4. falls gewählt: SHOW_README=false in die Config zurückschreiben
Der Dialog-Text wird aus Helpers/scripts/_text_about.scpt geladen.
So wird verhindert, dass buildAboutText() doppelt definiert ist.
*)
(*
showWelcomeDialogIfNeeded()
---------------------------
Zeigt den Willkommensdialog beim Start an, falls konfiguriert (SHOW_README=true).
Ablauf:
1. Config-Datei relativ zur aktuellen Auswahl suchen
2. Wert SHOW_README auslesen
3. falls SHOW_README=true -> Dialog mit "Nicht mehr anzeigen"-Option anzeigen
4. falls User "Diesen Dialog nicht mehr anzeigen" wählt:
-> SHOW_README auf false in der Config zurückschreiben
Wichtig:
--------
Der Dialog-Text wird aus Helpers/scripts/_text_about.scpt geladen.
So wird verhindert, dass buildAboutText() doppelt definiert ist.
*)
on showWelcomeDialogIfNeeded()
set configRecord to my findConfigInCurrentDB()
if configRecord is missing value then return
set cfgText to my recordText(configRecord)
set showReadmeVal to my configValue(cfgText, "SHOW_README")
if showReadmeVal is missing value then return
set showReadmeLower to do shell script "printf %s " & quoted form of showReadmeVal & " | tr '[:upper:]' '[:lower:]'"
if showReadmeLower is not "true" then return
set basePath to (do shell script "echo ~") & "/Library/Application Scripts/com.devon-technologies.think/Menu/Belegversand"
set textScript to basePath & "/Helpers/scripts/_text_about.scpt"
set textScriptPath to my helperScriptPath(aboutScriptName)
try
set loadedScript to load script (POSIX file textScript as alias)
set loadedScript to load script (POSIX file textScriptPath as alias)
run loadedScript
tell loadedScript
set msgText to buildAboutText()
end tell
on error errMsg
display dialog "Fehler beim Laden des About-Textes:" & return & errMsg buttons {"OK"}
display dialog "Fehler beim Laden des About-Textes:" & return & textScriptPath & return & return & errMsg buttons {"OK"}
return
end try
set choice to button returned of (display dialog msgText buttons {"Diesen Dialog nicht mehr anzeigen", "Weiter"} default button "Weiter")
set choice to button returned of (display dialog msgText buttons {"Diesen Dialog nicht mehr anzeigen", "Weiter"} default button "Weiter" with title windowTitle)
if choice is "Diesen Dialog nicht mehr anzeigen" then
set newCfgText to ""
repeat with oneLine in paragraphs of cfgText
@@ -304,7 +241,7 @@ on showWelcomeDialogIfNeeded()
set newCfgText to newCfgText & lineText & return
end if
end repeat
tell application id "DNtp"
try
set plain text of configRecord to newCfgText
@@ -315,21 +252,12 @@ on showWelcomeDialogIfNeeded()
end if
end showWelcomeDialogIfNeeded
(*
run
---
Haupteinstiegspunkt des START-Scripts.
Ablauf:
1. optionalen Startdialog anzeigen
2. Setup-Script starten
Wichtig:
--------
START.scpt delegiert die eigentliche Entscheidung an das Setup-Script.
Dort wird geprüft:
- existiert schon eine gültige Konfiguration?
-> dann Hauptscript starten
- oder muss erst eingerichtet werden?
2. Setup-Script starten (entscheidet: Versand oder Einrichtung)
*)
on run
with timeout of 3600 seconds