Haupt Sonstiges Schlechtes AppleScript: Subroutinen und Dateipfade
Sonstiges

Schlechtes AppleScript: Subroutinen und Dateipfade

Wie man Tablets 03.04.2014 21:30 Uhr PDT

Als ich programmieren lernte, hatten Programme Zeilennummern. Du würdest |_+_| . eingeben oder |_+_| und das würde den Fluss Ihres Programms steuern. Als ich zum ersten Mal eine Programmiersprache sah, die keine Zeilennummern hatte – ich glaube, es war Pascal – konnte ich sie nicht verstehen.

Nun, wir sind weit gekommen. Ich kann |_+_| . nicht eingeben mehr, aber Subroutinen können unglaublich wertvoll sein, um sogar schlechte AppleScripts zu vereinfachen.

Viele meiner Kollegen und ich schreiben unsere Artikel für Tablets im BBEdit-Texteditor von Bare Bones Software unter Verwendung der von John Gruber erfundenen Klartext-Auszeichnungssprache Markdown. Das Schöne an der Arbeit im Web ist, dass man sich nicht auf eine einzelne App oder auch nur einen Stil standardisieren muss – am Ende zählt nur, dass wir unsere Story im HTML-Format in unser webbasiertes Posting-Tool einfügen.

Also habe ich ein AppleScript geschrieben, das das, was ich in BBEdit geschrieben habe – sogar diesen Artikel – in etwas umwandelt, das in dieses System eingefügt werden kann. Ja, ich könnte einfach Grubers originales Markdown-Perl-Skript verwenden, aber ich muss noch eine ganze Reihe anderer Änderungen vornehmen, um eine Geschichte zu machen Tablets- bereit. Und ein paar wiederverwendbare Unterprogramme haben mein Leben viel einfacher gemacht.

GOTO 10

Diese Routine, |_+_|, ist einfach – es handelt sich im Grunde um einen einzeiligen BBEdit-Befehl –, aber sie spart viel Zeit. Wenn ich mit diesem Befehl alle Vorkommen von Katze in meinem BBEdit-Dokument durch Hund ersetzen möchte, muss ich schreiben:

imac bildschirm wird nach dem start schwarz

GOSUB 5000

Stattdessen schreibe ich einfach:

GOSUB 5000

Praktisch, oder? Die |_+_| Die Subroutine verwendet die Mustervergleichssyntax, die als |_+_| bekannt ist. Ich fand, dass gelegentlich die Symbole, die |_+_| verwendet eine Art Get im Weg, also habe ich eine zweite Subroutine erstellt, |_+_|, die nach wörtlichem Text sucht und kein grep verwendet. Mit diesen beiden Unterprogrammen kann ich viel machen.

Stilcheck

Einige der Dinge, die mein Skript macht, haben nichts mit der richtigen HTML-Formatierung zu tun. Sie haben mit meinem eigenen Gehirn zu tun, das einen Styleguide hat, der vom offiziellen IDG-Styleguide abweicht. Mein Skript behebt einige meiner häufigsten persönlichen Fehler:

on replaceme(theFind, theReplace) tell application 'BBEdit' replace theFind using theReplace searching in text of text window 1 options {search mode:grep, starting at top:true, wrap around:true, backwards:false, case sensitive:false, match words:false, extend selection:false} end tell end replaceme

Wir hatten auch eine Reihe von Autoren, die darauf bestanden, Tastenkombinationen mit einem Pluszeichen anstelle eines Bindestrichs zu schreiben, was unser Stil ist: d. Befehl-Umschalt-3 Anstatt von Befehl+Umschalt+3 . Zwei Pattern-Matching-Ersetzungen machen das schnell.

replaceme

Neben vielen anderen kleinen Stilproblemen gibt es auch einen großen Check, um sicherzustellen, dass die Hyperlinks im Dokument zu unserer Live Server, nicht der, den wir verwenden, um eine Vorschau von Geschichten anzuzeigen (die die Außenwelt nicht sehen kann):

tell application 'BBedit' to replace theFind using theReplace searching in text of text window 1 options {search mode:grep, starting at top:true, wrap around:true, backwards:false, case sensitive:false, match words:false, extend selection:false}

Ist meinem Skript der Speicherort bekannt?

Ich verteile dieses Skript an meine Redakteure mit BBEdits bbpaket -Format, das es mir ermöglicht, eine einzelne Datei zu senden, die ein Bündel von Skripten und anderen Dingen enthält. Ein Grund dafür ist, dass mein Skript zwei verschiedene Perl-Skripte verwendet, die von Gruber vertrieben werden: Markdown (das Markdown-formatierten Text in HTML umwandelt) und SmartyPants (das intelligente Anführungszeichen und andere ausgefallene Zeichen generiert).

Aber damit BBEdit diese Skripte ausführen kann, muss es wissen, wo sie sich auf der Festplatte meines Macs befinden. Das ist ganz einfach – sie befinden sich im Ordner Textfilter, der sich neben dem Ordner Skripte befindet, in dem sich mein Skript befindet. Das heißt, wenn ich herausfinden kann, wo mein Skript ist, kann ich auch herausfinden, wo diese anderen Skripte leben.

replaceme('cat', 'dog')

Boom! So einfach. Eine Zeile und wir sind fertig. Ich habe jetzt eine Variable namens thePath, die den Speicherort meines Skripts auf meiner Festplatte in einem Format wie diesem enthält: |_+_|.

Außer … ich möchte nicht, dass der Pfad bis zu meiner Datei reicht. Ich möchte den Pfad zu dem Ordner, der den Ordner enthält, in dem sich mein Skript befindet, da dies der übergeordnete Ordner dieses anderen Ordners ist, in dem sich die Skripte Markdown und SmartyPants befinden. Dazu muss ich die letzten beiden Elemente in diesem Pfad abschneiden. Hier ist wie:

replaceme

Ich benutze einen der ältesten Tricks im AppleScript-Buch, |_+_|. Es stellt sich heraus, dass AppleScript eine eingebaute Möglichkeit hat, Text in einzelne Elemente zu zerschneiden, die durch ein Zeichen begrenzt werden. Beispielsweise wird eine Liste von Wörtern durch das Leerzeichen getrennt, das sie trennt. Eine durch Kommas getrennte Datenzeile wie |_+_| wird durch das Komma abgegrenzt. Bei Dateipfaden werden sie durch einen Doppelpunkt getrennt.

Hier ist, was der obige Code macht:

grep

Speichert die aktuellen Trennzeichen von AppleScript in der Variablen |_+_|. Dies ist nur eine gute Hauswirtschaftspraxis; Wenn Sie mit den Trennzeichen von AppleScript herumalbern, können andere Teile Ihres Skripts ausflippen.

grep

Jetzt bestimmt der Doppelpunkt, wie mein Text abgegrenzt wird!

replacemeliteral

Dadurch wird meine Textvariable |_+_| in eine Variable umgewandelt, die eine Liste einzelner Elemente ist – die durch den Doppelpunkt getrennt sind. An dieser Stelle wird eine Zeichenfolge wie |_+_| würde eine Liste mit drei Elementen darin werden: |_+_|, |_+_| und |_+_|.

replacemeliteral('web site', 'website') replacemeliteral('e-mail', 'email') replacemeliteral('e-book', 'ebook') replacemeliteral('Ethernet', 'ethernet')

Die Grundsätze einer guten Haushaltsführung erfordern, dass Sie die Trennzeichen dort zurücksetzen, wo Sie sie verlassen haben.

replaceme('(Command|Control|Option|Shift)+(Command|Control|Option|Shift)+(.)', '1-2-3') replaceme('(Command|Control|Option|Shift)+(.)', '1-2')

Dies erzeugt eine neue Variable, |_+_|, die eine Teilmenge der Elemente in |_+_| enthält. Nämlich von Punkt 1 bis zu dem Punkt, der zwei vom Ende entfernt ist. Der Satz |_+_| ist eine sehr nützliche Konstruktion in AppleScript, da Sie damit rückwärts zählen können. In diesem Fall |_+_| ist die Gesamtzahl der Elemente in der Liste, und indem ich 2 von dieser Anzahl subtrahiere, schneide ich die letzten beiden Elemente in der Liste ab.

was ist besser macbook air oder macbook pro

Hier ist nun ein weiterer netter Trick:

replacemeliteral('preview-gate.www.idgesg.', 'www.')

Die Trennzeichen für Textelemente von AppleScript können auch zum Einfügen geändert werden Trennzeichen zwischen Elementen, wenn Sie eine Liste wieder in eine Zeichenfolge umwandeln. Wenn ich im obigen Beispiel die erste und die dritte Zeile weggelassen habe (und die Trennzeichen auf die AppleScript-Standardeinstellung belassen habe – was nichts ist), wird die Variable |_+_| würde in etwa so aussehen: |_+_|. Ich möchte einen durch Doppelpunkte getrennten Dateipfad wie den, den ich am Anfang erhalten habe! Also ändere ich wieder die Trennzeichen, setze dann die neue Variable und bekomme etwas formatiert wie |_+_|.

Jetzt, da ich den Namen des Ordners über dem Ordner kenne, in dem sich mein Skript befindet, kann ich die Pfade für die beiden Perl-Skripte erstellen, die ich brauche, die nebenan wohnen:

set thePath to (path to me as text)

Sobald ich diesen Pfad festgelegt habe, kann ich ihn verwenden, um BBEdit dazu zu bringen, dieses Skript mit einem einfachen Befehl in meinem Textdokument auszuführen:

Macintosh HD:Users:jsnell:Dropbox:Application Support:BBEdit:Packages:IDG.bbpackage:Contents:Scripts:CMS

Die einzige andere knifflige Sache im gesamten Skript ist, sicherzustellen, dass mein Skript auf einem funktioniert Kopieren der Geschichte, nicht das Original. In BBEdit erreiche ich das so:

set the oldDelims to AppleScript's text item delimiters set AppleScript's text item delimiters to ':' set thePathItems to text items of thePath set AppleScript's text item delimiters to the oldDelims set parsedPath to items 1 thru ((count of items of thePathItems) - 2) of thePathItems set AppleScript's text item delimiters to ':' set parentPath to parsedPath as string set AppleScript's text item delimiters to the oldDelims

Am Ende habe ich ein Skript, das Markdown in HTML umwandelt, den SmartyPants-Filter ausführt, um alle unsere Anführungszeichen zu unterrichten, und durch eine Reihe anderer Macken unseres Styleguides und Content-Management-Systems geht, um ein Dokument zu erstellen das ist zum Einfügen und Veröffentlichen geeignet.