Generer en liste over åpne Safari-faner med AppleScript

Enten du er en blogger som arbeider med en roundup eller en student som gjør noen undersøkelser, har du sannsynligvis kommet inn i behovet for å lage en liste over nettsteder basert på dine åpne Safari-faner. La oss lære å skrive en AppleScript som håndterer denne prosessen for oss.


En prøve av hva skriptet skal utføre basert på de åpne kategoriene i Safari.

Hva vi skal lære

Skriptet som vi skal skrive er faktisk ganske enkelt, så hvis du bare begynner med AppleScript, er dette det perfekte prosjektet for å kutte tennene på.

Hvorvidt du faktisk trenger et verktøy som vil opprette en liste over Safari-faner, er irrelevant. Det viktigste her er å lære av hvordan vi nærmer oss denne oppgaven.

Det viktigste her er å lære av hvordan vi nærmer oss denne oppgaven.

Vi kommer til å treffe på en rekke AppleScript-konstruksjoner som er avgjørende for reisen din til å bli en automatisering pro: variabler, "gjenta med" sløyfer, jobbe med strenge, flykte tegn og mye mer.


Trinn 1. Opprett en algoritme

Det første du vil gjøre når du arbeider med et hvilket som helst programmeringsprosjekt, er å se om du kan skisse en algoritme. Det ordet høres ganske skremmende ut, men egentlig er det bare en fin måte å si at vi må trene på trinnene i det vi skal gjøre.

Det er bare en fin måte å si at vi må utarbeide trinnene i det vi skal gjøre.

For å skape en algoritme for prosjektet vårt, må vi ha en grunnleggende forståelse to ting: vårt endelige mål og trinnene som er nødvendige for å nå det. Sistnevnte del er litt vanskelig fordi det krever noen spesifikk kunnskap om hvordan man nærmer seg problemet fra et programmeringsperspektiv, noe som kan være intuitivt avhengig av hvordan hjernen din fungerer.

Målet

La oss først analysere vårt mål, hva vil vi oppnå? Sluttresultatet som jeg vil skyte for, er et TextEdit-dokument som inneholder en liste over de åpne kategoriene i Safari. Hver fane skal formateres som en HTML-kobling med tittelen på fanen som er satt til lenketeksten, slik som denne:

 Fane tittel her

Prosessen

Med dette målet i tankene kan vi begynne å skisse ut algoritmen ved å tenke gjennom prosesser som må skje for oss for å oppnå dette målet. På dette punktet, ikke bekymre deg for perfeksjon. Vi vil mentalt avgrense denne prosessen når vi kommer over utfordringer i kodingsprosessen, dette er bare for å hjelpe oss med å få en følelse av hvordan vårt skript vil se ut.

  1. Telle antall Safari-vinduer
  2. Telle antall faner i hvert vindu
  3. Lag en loop som går gjennom hver fane i hvert vindu
  4. Ta tak i navnet på den nåværende kategorien
  5. Ta tak i nettadressen til den nåværende kategorien
  6. Lagre fanenavn, URL og annen ønsket tekst i en variabel
  7. Åpne TextEdit
  8. Opprett et nytt dokument
  9. Sett teksten til det nye dokumentet til variabelen som inneholder vår streng av informasjon

Trinn 2. Opprett en Safari Tell Block

Nå som vi har vår grunnleggende oversikt over trinnene vi skal kreve, er det på tide å hoppe inn i kodingen. De første trinnene i vår algoritme handlet alle sammen med Safari, så det første vi må gjøre i skriptet vårt, er å lage en fortellingsblokk for Safari.

[Apple]
fortell søknad "Safari"
slutt tell
[/ Apple]

Fortell blokker er hvordan vi målretter mot hvem / hva det er det vi snakker med i vårt skript, i dette tilfellet er det programmet Safari.

Tips: Ikke glem å lukke fortell blokker med "slutt tell", vil skriptet kaste en feil uten dette.


Trinn 3. Opprett innledende variabler

En av de første tingene jeg liker å gjøre i et skript, er å lage noen variabler som jeg vet at jeg trenger. Dette hjelper til med å sette scenen for resten av skriptet og holder tingene organisert.

På dette punktet vet jeg at jeg må sette opp tre forskjellige variabler: en for vindutellingen, en for tabeltellingen og en for den resulterende dokumentteksten.

Tabelltallvariabelen må oppdateres når vi sykler gjennom vinduene, så det må være nestet i en løkke, men de andre vi kan ta vare på nå.

[Apple]
fortell søknad "Safari"

--variabler
sett windowCount til antall vinduer
sett docText til ""

slutt tell
[/ Apple]

Angi vindutallet

Etter kommentaren oppretter den første linjen med kode en variabel kalt "windowCount". Legg merke til at dette er veldig beskrivende, ikke noe generisk som "myVariable". Prøv alltid å navngi variablene dine noe nyttig, slik at lesbarheten av dine skript fortsatt er høy.

AppleScript kommandoer er ofte svært nær vanlig engelsk, noe som gjør det til et veldig enkelt språk for nybegynnere å plukke opp raskt.

Syntaxen for å telle vinduene er super grei: sett (variabel) til antall vinduer. AppleScript kommandoer er ofte svært nær vanlig engelsk, noe som gjør det til et veldig enkelt språk for nybegynnere å plukke opp raskt.

DocText Variable

Den merkelige delen om koden ovenfor er at jeg har opprettet en tom strengvariabel, hvorfor skulle jeg gjøre dette? Årsaken vil bli klarere senere, men i utgangspunktet vil vår gjentakelse gå gjennom og legge til noe her hver gang, og vi trengte bare et sted å starte. Du kan ikke legge til noe i en variabel som ikke eksisterer!


Trinn 4. Første Gjenta Blokk

For å trekke ut målet vårt, trenger vi to gjentatte blokker. Logikken bak dette er enklere å vikle deg rundt hvis du jobber fra innsiden ut.

Logikken bak dette er enklere å vikle deg rundt hvis du jobber fra innsiden ut.

Vårt mål er å ta tak i tittelen og nettadressen fra en fane, og gjenta det for hver fane (gjenta blokk). Trikset er at det kan være mer enn ett åpent vindu, så vi må gjenta prosessen for hvert vindu (gjenta blokk).

Igjen, denne tankeprosessen er inne ute til hvordan vi trenger å jobbe, så vi starter med "hver vindues" gjentakelsesblokk.

[Apple]
fortell søknad "Safari"

--variabler
sett windowCount til antall vinduer
sett docText til ""

--Gjenta for hvert vindu
gjenta med x fra 1 til windowCount
sett tabCount til antall faner i vindu x
slutt gjenta
slutt tell
[/ Apple]

Gjenta med

En enkel gjentakingsblokk kan si noe som "gjenta 5 ganger", men vi har gjort noe litt mer komplisert her. Konstruksjonen "gjenta med" lar oss sette opp en forsettlig generisk variabel (x) som øker hver gang repeteringsblokken kjøres.

For at dette skal fungere, må vi fortelle skriptet start- og stopppunktet for x som det sykler gjennom dets iterasjoner. Hva jeg har gjort, blir fortalt av AppleScript å starte x ved 1, deretter øke den til den treffer en verdi som tilsvarer antall åpne vinduer, uttrykt som variabelen vi satt opp før.

Jeg brukte denne konstruksjonen fordi den gjør vår gjentak blokk ekstremt allsidig.

Jeg brukte denne konstruksjonen fordi den gjør vår gjentak blokk ekstremt allsidig. Hvis skriptet teller fire vinduer, vil gjentakningsblokken kjøres fire ganger, hvis det teller femti, vil blokken løpe femti ganger.

Telling av fanene

Deretter gjentok jeg i utgangspunktet prosessen vi brukte før vinduet teller for å angi en variabel til antall faner i det nåværende vinduet.

For å trekke dette av skjønt, måtte jeg trekke inn x-variabelen. Husk at denne variabelen vil øke hver gang repeteringsblokken kjøres. Så for første gang, teller vi antall faner i vindu ett, andre gang gjennom, teller vi antall faner i vindu to, osv..


Trinn 5. Second Repeat Block

Nå som vi har en gjentakingsblokk opprettet som vil gå gjennom hvert vindu, må vi sette inn en annen gjentak blokk inne i det for å se på hver fane. De to sammen vil kunne slå ut hver fane i hvert vindu.

Mens vi er her, vil vi også sette opp noen variabler for neste trinn.

[Apple]
fortell søknad "Safari"

--variabler
sett windowCount til antall vinduer
sett docText til ""

--Gjenta for hvert vindu
gjenta med x fra 1 til windowCount
sett tabCount til antall faner i vindu x

--Gjenta for hvert fane i nåværende vindu
gjenta med y fra 1 til tabCount
--Få fanenavn og nettadresse
sett tabName for å navngi kategorien y i vinduet x
sett taburl til URL til fanen y i vinduet x
slutt gjenta

slutt gjenta
slutt tell
[/ Apple]

Gjenta for hvert fane i nåværende vindu

Som du kan se, bruker denne gjentakelsesblokken lignende syntax til det vi så før. Vi har allerede talt antall tabber i forrige trinn, så vi stiller gjentakelseblokken til å gå fra 1 til tabCount, ved hjelp av generisk økende variabel y.

Grab Tab Name & URL

For å fullføre dette trinnet, startet vi to variabler. Syntaxen til disse er nesten identiske, bare en griper navnet på den nåværende kategorien og den andre tar URLen. Jeg fant den spesifikke syntaksen for disse kommandoene i Safari AppleScript-ordboken.

Legg merke til at, for å hente navnet og nettadressen til den nåværende kategorien, bruker vi bare x- og y-variablene som øker hver gang repeteringsblokken kjøres. Så første gang vi tar tak i navnet og nettadressen til fanen ett av vindu ett, deretter faner to av vindu ett, så kan du kanskje klikke ett av vindu to, etc.


Trinn 6. Fyll docText String

Husk at tom docText-variabel som vi opprettet før? Nå skal vi fylle opp den teksten vi ønsker for hver oppføring i vår liste. Hver gang repeteringsblokken kjører, blir tittelen og nettadressen til den nåværende kategorien lagt til variabelen ved hjelp av HTML-formatering som vi skisserte over.

Koden for dette er den mest kompliserte syntaksen som vi har kommet over så langt, ta en titt nedenfor og så vil jeg gå gjennom hvordan alt fungerer.

[Apple]
fortell søknad "Safari"

--variabler
sett windowCount til antall vinduer
sett docText til ""

--Gjenta for hvert vindu
gjenta med x fra 1 til windowCount
sett tabCount til antall faner i vindu x

--Gjenta for hvert fane i nåværende vindu
gjenta med y fra 1 til tabCount

--Få fanenavn og nettadresse
sett tabName for å navngi kategorien y i vinduet x
sett taburl til URL til fanen y i vinduet x

sett docText til docText & ¬
"tabURL &" \ ">" & ¬
tabName & ¬
"" Og ¬
linefeed som streng
slutt gjenta

slutt gjenta
slutt tell
[/ Apple]

sammenkjeding

Det første du trenger å vite her er at sammenkoblingen (å sette ting sammen) i AppleScript håndteres via ampersand. I eksemplet ovenfor vil jeg legge til en rekke forskjellige ting til variabelen hver gang, så jeg bruker ampersand til å koble alle brikkene sammen.

Legge til variabelen

Legg merke til at jeg setter docText-variabelen til "docText & ..." en haug med andre ting. Hvorfor skulle jeg sette en variabel til seg selv? Hva dette gjør er å fortelle AppleScript at jeg vil sette docText-variabelen til alt som allerede er lagret, pluss noen andre ting.

På slutten inneholder denne variabelen hele innholdet i det som skal settes inn i vårt TextEdit-dokument.

På denne måten, hver gang repeteringsblokken kjøres igjen, legger jeg til denne variabelen og lar den vokse i stedet for å erstatte innholdet. På slutten inneholder denne variabelen hele innholdet i det som skal settes inn i vårt TextEdit-dokument.

Line Breaks og Linefeeds

Det er to forskjellige former for linjeskift i koden ovenfor. Den første er en serie overfladiske linjeskift som jeg satt inn i koden min i et forsøk på å gjøre det litt mer lesbart. Jeg ville gjøre det klart at flere forskjellige stykker blir lagt til variabelen enkeltvis.

Symbolet "¬" kan skrives i AppleScript med Tilvalg + Return og indikerer at linjeskiftet bare er et visuelt og ikke skal påvirke hvordan koden kjøres.

I virkeligheten er alt dette en enkelt linje med kode, som jeg normalt skriver som følger:

[Apple]
sett docText til docText & "" & tabName & "" & linefeed som streng
[/ Apple]

Legg merke til i slutten av denne linjen med kode er ordet "linefeed". I motsetning til overfladiske linjeskift over, representerer dette noe jeg egentlig vil ha til variabelen. På slutten av hvert ordrelinje legger jeg inn en linjepost slik at neste listepost vil begynne på en ny linje.

Strings & Escaped Tegn

Den rare tingen om HTML-teksten som vi prøver å sette inn, er at den inneholder anførselstegn, som faktisk brukes av AppleScript for å indikere begynnelsen og slutten av en streng som sådan:

[Apple]
sett myString til "Ladle rat rotten hut"
[/ Apple]

Her startet vi en variabel og fylte den med litt tekst. Teksten er omgitt av sitater og forteller AppleScript at variabelen er av typen streng.

Så hvis AppleScript bruker anførselstegn til å omgir strenge, hvordan lagrer vi anførselstegn som en del av en streng? Svaret er å "unnslippe" sitatkarakterene med en tilbakeslag som:

[Apple]
sett myString til "/" Ladle rat rotten hut / ""
[/ Apple]

I det første eksemplet var innholdet av variabelen som følger: Ladle rotte rotte hytte (lagret uten anførselstegn). I det andre eksemplet inneholdt variabelen faktisk et sett med sitater: "Ladle rat rotten hut".

Sette alt sammen

Gitt all informasjonen vi nettopp har lært, er de enkelte brikkene som blir satt inn i vår variabel og sitter fast sammen.

  • tabURL
  • ">
  • tABNAME
  • linjeskift

Når alle disse elementene er satt sammen og skriptet gjentas for hver fane i hvert vindu, bør vi ha en liste som er formatert akkurat som målet vi satte oss i begynnelsen.

 Tab Ett Tittel Her Tab To Tittel Her Tab Tre Tittel Her

Trinn 7. Lag tekstdokumentet

Nå som vi har all denne informasjonen lagret i en praktisk variabel, er det på tide å gjøre noe med det. I vårt tilfelle ønsker vi å kaste den inn i et tekstdokument.

For å gjøre dette, opprett en ny fortellingsblokk for TextEdit slik:

[Apple]
fortell søknad "Safari"

--variabler
sett windowCount til antall vinduer
sett docText til ""

--Gjenta for hvert vindu
gjenta med x fra 1 til windowCount
sett tabcount til antall faner i vindu x

--Gjenta for hvert fane i nåværende vindu
gjenta med y fra 1 til tabcount

--Få fanenavn og nettadresse
sett tabName for å navngi kategorien y i vinduet x
sett taburl til URL til fanen y i vinduet x

sett docText til docText & "" & tabName & "" & linefeed som streng
slutt gjenta

slutt gjenta
slutt tell

--Skriv dokumenttekst
fortell programmet "TextEdit"
aktivere
Lag nytt dokument
sett teksten til frontdokumentet til docText
slutt tell
[/ Apple]

Inne i TextEdit fortell blokk Jeg har gjort tre ting: først, jeg fortalte at programmet skulle "aktivere", som bare bringer det til forgrunnen slik at du kan se fruktene av arbeidet ditt.

Deretter fortalte jeg TextEdit om å lage et nytt dokument. Til slutt endte jeg skriptet ved å sette teksten til det nye dokumentet til variabelen som inneholder listen over lenker.


Prøv det

Med det er vårt skript ferdig! Hvis du har holdt på dette lenge, gratulerer, har du allerede skrevet mer AppleScript enn det store flertallet av Mac-brukere og kan betrakte deg som et elite-medlem av Mac nerd-fellesskapet.

For å prøve ut skriptet, må du kontrollere at du har Safari åpent med flere faner og flere vinduer satt til ulike nettsteder. Når du har denne konfigurasjonen, kan du bare trykke på avspillingsknappen i AppleScript for å se det magiske skje.

Tips: Prøv å lagre en versjon som et program slik at du raskt kan kjøre det når du trenger det.


Feilsøking

Uunngåelig vil mange av dere nå dette punktet og treffe en feil. Noe gikk galt, men hva? Svaret blir oftest noe så enkelt som en skrivefeil. Er du sikker på at du skrev inn skriptet nøyaktig som det vises ovenfor? AppleScript prøver vanligvis å peke på det spesifikke problemet for deg, følger det med råd og skriver den problematiske linjen på nytt.

AppleScript prøver vanligvis å peke på det spesifikke problemet for deg, følger det med råd og skriver den problematiske linjen på nytt.

Dessverre er det helt mulig at du har skrevet alt riktig og fortsatt mottar en feil. Kanskje det er et problem med din versjon av Safari, eller kanskje ikke skriptet liker nettsidene du valgte av en eller annen ukjent grunn. Prøv å endre ting og se om du kan finne frem til problemet.

Feilhåndtering er et ganske dypt tema som jeg vil dekke i dybden i en fremtidig artikkel, for nå ta en titt på vår artikkel om avanserte AppleScript-teknikker for mer informasjon om hvordan du kan endre skriptet for å ta bestemte handlinger når en feil blir kastet.

Konklusjon

Jeg gikk deg gjennom hele prosessen med å skrive en AppleScript for å generere en liste over lenker fra dine åpne faner i Safari. Dette burde spare deg for mange problemer på de store forskningsprosjektene.

Forhåpentligvis underveis lærte du mange flotte ting om AppleScript og hvordan du nærmer deg automatisering av enkle, men repeterende oppgaver. Hvis du har noen spørsmål, vær så snill å legge igjen en kommentar nedenfor eller trykk oss på Twitter.