diff --git a/START.applescript b/START.applescript index 3318e18..1f606bd 100644 --- a/START.applescript +++ b/START.applescript @@ -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//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