Générer une liste d'onglets Open Safari avec AppleScript

Que vous soyez un blogueur travaillant sur une rafle ou un étudiant effectuant des recherches, vous avez probablement déjà eu besoin de créer une liste de sites Web sur la base des onglets Safari actuellement ouverts. Apprenons à écrire un AppleScript qui gèrera ce processus pour nous.


Un exemple de ce que le script devrait générer en fonction des onglets ouverts dans Safari.

Ce que nous allons apprendre

Le script que nous allons écrire est en fait assez simple, donc si vous débutez avec AppleScript, c'est le projet idéal pour vous couper les dents.

Que vous ayez ou non besoin d'un outil permettant de créer une liste d'onglets Safari est sans importance. La chose importante ici est d'apprendre de la façon dont nous abordons cette tâche.

La chose importante ici est d'apprendre de la façon dont nous abordons cette tâche.

Nous allons aborder un certain nombre de constructions AppleScript qui sont essentielles pour devenir un professionnel de l’automatisation: des boucles à variables, des boucles "répéter avec", des chaînes, des caractères d'échappement et bien plus encore..


Étape 1. Créer un algorithme

La première chose que vous voulez faire lorsque vous travaillez avec un projet de programmation est de voir si vous pouvez dessiner un algorithme. Ce mot semble assez intimidant, mais c’est vraiment une façon élégante de dire que nous devons déterminer les étapes de ce que nous allons faire..

C'est juste une façon élégante de dire que nous devons déterminer les étapes de ce que nous allons faire..

Pour créer un algorithme pour notre projet, nous devons avoir une compréhension de base de deux choses: notre objectif ultime et les étapes nécessaires pour l'atteindre. La dernière partie est un peu délicate car elle nécessite des connaissances spécifiques sur la manière d’aborder le problème du point de vue de la programmation, ce qui peut être intuitif ou non, en fonction du fonctionnement de votre cerveau..

Le but

Analysons d'abord notre objectif, que voulons-nous accomplir? Le résultat final que je souhaite utiliser est un document TextEdit contenant une liste des onglets ouverts dans Safari. Chaque onglet doit être formaté en tant que lien HTML avec le titre de l'onglet défini sur le texte du lien, comme suit:

 Titre de l'onglet ici

Le processus

Avec cet objectif en tête, nous pouvons commencer à esquisser notre algorithme en réfléchissant aux processus à suivre pour que nous puissions atteindre cet objectif. À ce stade, ne vous inquiétez pas de la perfection. Nous affinons mentalement ce processus au fur et à mesure que nous rencontrons des difficultés dans le processus de codage. Notre objectif est simplement de nous aider à avoir une idée de ce à quoi notre script ressemblera..

  1. Compter le nombre de fenêtres Safari
  2. Compter le nombre d'onglets dans chaque fenêtre
  3. Créez une boucle qui passe par chaque onglet de chaque fenêtre
  4. Prenez le nom de l'onglet en cours
  5. Saisissez l'URL de l'onglet en cours
  6. Enregistrer le nom de l'onglet, l'URL et tout autre texte souhaité dans une variable
  7. Ouvrez TextEdit
  8. Créer un nouveau document
  9. Définissez le texte du nouveau document sur la variable contenant notre chaîne d'informations.

Étape 2. Créez un bloc Safari Tell

Maintenant que nous avons défini les grandes lignes des étapes à suivre, il est temps de passer rapidement au codage. Les premières étapes de notre algorithme ayant toutes trait à Safari, la première chose à faire dans notre script est de créer un bloc tell pour Safari..

[applescript]
dire à l'application "Safari"
fin dire
[/ applescript]

Les blocs Tell indiquent comment nous ciblons qui / quoi nous parlons dans notre script, dans ce cas, c'est l'application Safari.

Pointe: N'oubliez pas de fermer vos blocs tell avec "end tell", votre script affichera une erreur sans cela.


Étape 3. Créer les variables initiales

L'une des premières choses que j'aime faire dans un script est de créer les variables dont je sais qu'il me faudra. Cela aide à préparer le terrain pour le reste du script et à garder les choses organisées.

À ce stade, je sais que je devrai configurer trois variables différentes: une pour le nombre de fenêtres, une pour le nombre de tabulations et une pour le texte du document résultant..

La variable de nombre d'onglets doit être mise à jour au fur et à mesure que nous parcourons les fenêtres, elle devra donc être imbriquée dans une boucle, mais nous pouvons nous en occuper pour les autres.

[applescript]
dire à l'application "Safari"

--Variables
définir windowCount au nombre de fenêtres
définir docText sur ""

fin dire
[/ applescript]

Définir le nombre de fenêtres

Après le commentaire, la première ligne de code crée une variable appelée "windowCount". Notez que c'est très descriptif, pas quelque chose de générique comme "myVariable". Essayez toujours de nommer vos variables avec quelque chose d'utile pour que la lisibilité de vos scripts reste élevée.

Les commandes AppleScript sont souvent très proches de l'anglais courant, ce qui en fait un langage très facile à apprendre pour les débutants.

La syntaxe pour compter les fenêtres est très simple: définissez (variable) sur le nombre de fenêtres. Les commandes AppleScript sont souvent très proches de l'anglais courant, ce qui en fait un langage très facile à apprendre pour les débutants.

La variable docText

La partie étrange sur le code ci-dessus est que j'ai créé une variable de chaîne vide, pourquoi devrais-je le faire? La raison sera plus claire plus tard, mais au fond notre répétition suivra et ajoutera quelque chose à cela à chaque fois et nous aurions simplement besoin d'un endroit pour commencer. Vous ne pouvez pas ajouter quelque chose à une variable qui n'existe pas!


Étape 4. Première répétition du bloc

Pour atteindre notre objectif, nous aurons besoin de deux blocs répétés. La logique derrière ceci est plus facile à comprendre si vous travaillez de l'intérieur.

La logique derrière ceci est plus facile à comprendre si vous travaillez de l'intérieur.

Notre objectif est de récupérer le titre et l'URL d'un onglet, puis de le répéter pour chaque onglet (bloc répété). L'astuce est cependant qu'il peut y avoir plus d'une fenêtre ouverte, nous devons donc répéter ce processus pour chaque fenêtre (répétition de bloc).

Encore une fois, ce processus de pensée est au cœur de la façon dont nous devons travailler, nous allons donc commencer par le bloc de répétition "toutes les fenêtres".

[applescript]
dire à l'application "Safari"

--Variables
définir windowCount au nombre de fenêtres
définir docText sur ""

--Répéter pour toutes les fenêtres
répéter avec x de 1 à windowCount
définit tabCount sur le nombre d'onglets dans la fenêtre x
fin de répéter
fin dire
[/ applescript]

Répéter avec

Un simple bloc de répétition peut dire quelque chose comme "répéter 5 fois", mais nous avons fait quelque chose d'un peu plus compliqué ici. La construction "repeat with" nous permet de configurer une variable volontairement générique (x) qui sera incrémentée chaque fois que le bloc de répétition est exécuté.

Pour que cela fonctionne, nous devons indiquer à notre script le point de départ et d'arrêt de x au fur et à mesure qu'il parcourt ses itérations. Ce que j'ai fait, c'est dire à AppleScript de démarrer x à 1, puis de l'augmenter jusqu'à atteindre une valeur égale au nombre de fenêtres ouvertes, exprimée sous la forme de la variable que nous avons définie auparavant..

J'ai utilisé cette construction car elle rend notre bloc de répétition extrêmement polyvalent.

J'ai utilisé cette construction parce qu'elle rend notre bloc de répétition extrêmement polyvalent. Si le script compte quatre fenêtres, le bloc de répétition sera exécuté quatre fois. S'il en compte cinquante, le bloc sera exécuté cinquante fois..

Compter les onglets

Ensuite, j'ai essentiellement répété le processus que nous avons utilisé auparavant pour le nombre de fenêtres pour définir une variable sur le nombre d'onglets dans la fenêtre actuelle..

Pour retirer ceci cependant, je devais intégrer la variable x. Rappelez-vous que cette variable augmentera chaque fois que le bloc de répétition est exécuté. Ainsi, la première fois, nous compterons le nombre d'onglets dans la première fenêtre, la deuxième fois, nous compterons le nombre d'onglets dans la deuxième fenêtre, etc..


Étape 5. Deuxième bloc de répétition

Maintenant que nous avons mis en place un bloc de répétition qui parcourt chaque fenêtre, nous devons insérer un autre bloc de répétition à l'intérieur de celui-ci pour examiner chaque onglet. Les deux ensemble pourront assommer chaque onglet de chaque fenêtre.

Pendant que nous sommes ici, nous allons également définir des variables pour la prochaine étape..

[applescript]
dire à l'application "Safari"

--Variables
définir windowCount au nombre de fenêtres
définir docText sur ""

--Répéter pour toutes les fenêtres
répéter avec x de 1 à windowCount
définit tabCount sur le nombre d'onglets dans la fenêtre x

--Répéter pour chaque onglet de la fenêtre en cours
répéter avec y de 1 à tabCount
--Obtenir le nom de l'onglet et l'URL
définir tabName au nom de l'onglet y de la fenêtre x
définir tabURL sur l'URL de l'onglet y de la fenêtre x
fin de répéter

fin de répéter
fin dire
[/ applescript]

Répéter pour chaque onglet de la fenêtre en cours

Comme vous pouvez le constater, ce bloc de répétition utilise une syntaxe similaire à celle décrite précédemment. Nous avons déjà compté le nombre de tabulations à l’étape précédente, nous avons donc défini le bloc de répétition de 1 à tabCount, en utilisant la variable générique d’incrémentation y..

Nom de l'onglet et adresse URL

Pour terminer cette étape, nous avons initié deux variables. La syntaxe de ceux-ci est presque identique, un seul saisit le nom de l'onglet actuel et l'autre saisit l'URL. J'ai trouvé la syntaxe spécifique à ces commandes dans le dictionnaire Safari AppleScript.

Notez que, pour saisir le nom et l'URL de l'onglet en cours, nous utilisons simplement les variables x et y qui s'incrémentent chaque fois que le bloc de répétition est exécuté. Ainsi, la première fois que nous saisissons le nom et l’URL de l’onglet 1 de la première fenêtre, puis de l’onglet 2 de la première fenêtre, puis éventuellement de l’onglet 1 de la deuxième fenêtre, etc..


Étape 6. Remplissez la chaîne docText

Vous souvenez-vous de la variable docText vide que nous avons créée auparavant? Maintenant, nous allons le remplir avec le texte que nous voulons pour chaque entrée de notre liste. Chaque fois que le bloc de répétition est exécuté, le titre et l'URL de l'onglet en cours sont ajoutés à la variable à l'aide du formatage HTML décrit ci-dessus..

Le code pour ceci est la syntaxe la plus compliquée que nous ayons rencontrée jusqu'à présent, regardez ci-dessous et ensuite je vous expliquerai comment tout cela fonctionne..

[applescript]
dire à l'application "Safari"

--Variables
définir windowCount au nombre de fenêtres
définir docText sur ""

--Répéter pour toutes les fenêtres
répéter avec x de 1 à windowCount
définit tabCount sur le nombre d'onglets dans la fenêtre x

--Répéter pour chaque onglet de la fenêtre en cours
répéter avec y de 1 à tabCount

--Obtenir le nom de l'onglet et l'URL
définir tabName au nom de l'onglet y de la fenêtre x
définir tabURL sur l'URL de l'onglet y de la fenêtre x

définir docText sur docText & ¬
"tabURL &" \ ">" & ¬
tabName & ¬
"" & ¬
saut de ligne sous forme de chaîne
fin de répéter

fin de répéter
fin dire
[/ applescript]

Enchaînement

La première chose que vous devez savoir ici est que la concaténation (assemblage d'éléments) dans AppleScript est gérée via l'esperluette. Dans l'exemple ci-dessus, je veux ajouter un tas de choses différentes à la variable à chaque fois, donc j'utilise l'esperluette pour connecter toutes les pièces ensemble..

Ajout à la variable

Notez que j'ai défini la variable docText sur "docText &…", un tas d'autres choses. Pourquoi devrais-je définir une variable sur elle-même? Cela indique à AppleScript que je souhaite définir la variable docText sur tout ce qui est déjà stocké, ainsi que sur d'autres éléments..

À la fin, cette variable contiendra l'intégralité du contenu de ce qui sera inséré dans notre document TextEdit..

Ainsi, chaque fois que le bloc de répétition est exécuté à nouveau, j'ajoute à cette variable et la laisse grandir plutôt que de remplacer son contenu. À la fin, cette variable contiendra l'intégralité du contenu de ce qui sera inséré dans notre document TextEdit..

Sauts de ligne et sauts de ligne

Il existe deux formes différentes de sauts de ligne dans le code ci-dessus. Le premier est une série de sauts de ligne superficiels que j'ai insérés dans mon code pour tenter de le rendre un peu plus lisible. Je voulais préciser que plusieurs pièces différentes sont ajoutées à la variable individuellement.

Le symbole "¬" peut être saisi dans AppleScript avec Option + Retour et indique que le saut de ligne est simplement visuel et ne doit pas être pris en compte dans la façon dont le code est exécuté.

En réalité, tout cela n’est qu’une seule ligne de code, que j’écrirais normalement comme suit:

[applescript]
définir docText sur docText & "" & tabName & "" & linefeed as string
[/ applescript]

Avis près de la fin de cette ligne de code est le mot "linefeed". Contrairement aux sauts de ligne superficiels ci-dessus, cela représente quelque chose que je veux réellement ajouter à la variable. À la fin de chaque élément de campagne, j'insère un saut de ligne afin que le prochain élément de la liste commence sur une nouvelle ligne..

Cordes et personnages échappés

La chose étrange à propos du texte HTML que nous essayons d’insérer est qu’il contient des guillemets, qui sont en réalité utilisés par AppleScript pour indiquer le début et la fin d’une chaîne, comme ceci:

[applescript]
réglez myString sur "Louche de cabane pourrie de rat"
[/ applescript]

Ici, nous avons lancé une variable et l'avons remplie de texte. Le texte est entouré de guillemets et indique à AppleScript que la variable est de type chaîne.

Ainsi, si AppleScript utilise des guillemets pour entourer des chaînes, comment stockons-nous les guillemets dans une chaîne? La réponse consiste à "échapper" aux caractères de citation avec une barre oblique inverse de la manière suivante:

[applescript]
réglez myString sur "/" Louche pourris / "
[/ applescript]

Dans le premier exemple, le contenu de la variable était le suivant: Louche de cabane pourrie de rat (stockée sans guillemets). Dans le deuxième exemple, la variable contenait en fait un ensemble de guillemets: "Louche de rat pourri".

Mettre tous ensemble

Compte tenu de toutes les informations que nous venons d’apprendre, voici les éléments individuels qui sont insérés dans notre variable et collés ensemble..

  • tabURL
  • ">
  • tabName
  • saut de ligne

Lorsque tous ces éléments sont rassemblés et que le script est répété pour chaque onglet de chaque fenêtre, nous devrions avoir une liste formatée exactement comme pour l'objectif que nous avons défini au début..

 Onglet Un titre ici Onglet Deux titre ici Onglet Trois titre ici

Étape 7. Créez le document texte

Maintenant que toutes ces informations sont stockées dans une variable pratique, il est temps de faire quelque chose avec. Dans notre cas, nous voulons le jeter dans un document texte.

Pour ce faire, créez un nouveau bloc tell pour TextEdit, comme suit:

[applescript]
dire à l'application "Safari"

--Variables
définir windowCount au nombre de fenêtres
définir docText sur ""

--Répéter pour toutes les fenêtres
répéter avec x de 1 à windowCount
définit tabcount sur le nombre d'onglets dans la fenêtre x

--Répéter pour chaque onglet de la fenêtre en cours
répéter avec y de 1 à tabcount

--Obtenir le nom de l'onglet et l'URL
définir tabName au nom de l'onglet y de la fenêtre x
définir tabURL sur l'URL de l'onglet y de la fenêtre x

définir docText sur docText & "" & tabName & "" & linefeed as string
fin de répéter

fin de répéter
fin dire

--Écrire le texte du document
dire à l'application "TextEdit"
Activer
faire un nouveau document
définir le texte du document avant sur docText
fin dire
[/ applescript]

À l'intérieur du bloc TextEdit, j'ai fait trois choses: premièrement, j'ai dit à l'application de "l'activer", ce qui la met tout simplement au premier plan pour que vous puissiez voir les fruits de votre travail.

Ensuite, j'ai demandé à TextEdit de créer un nouveau document. Enfin, j'ai terminé le script en définissant le texte du nouveau document sur la variable qui contient notre liste de liens..


Essaye le

Avec ça, notre script est terminé! Si vous avez tenu longtemps, félicitations, vous avez déjà écrit plus d'AppleScript que la grande majorité des utilisateurs de Mac et vous pouvez vous considérer comme un membre élite de la communauté Mac nerd..

Pour essayer le script, assurez-vous que Safari est ouvert avec plusieurs onglets et plusieurs fenêtres configurés pour différents sites Web. Une fois cette configuration configurée, appuyez simplement sur le bouton de lecture dans AppleScript pour voir la magie se dérouler..

Pointe: Essayez de sauvegarder une version en tant qu’application afin de pouvoir l’exécuter rapidement à tout moment..


Dépannage

Inévitablement, vous serez nombreux à atteindre ce point et à commettre une erreur. Quelque chose a mal tourné, mais quoi? Le plus souvent, la réponse sera quelque chose d'aussi simple qu'une faute de frappe. Êtes-vous sûr d'avoir entré le script exactement tel qu'il apparaît ci-dessus? AppleScript essaie généralement de vous signaler le problème spécifique, de suivre ses conseils et de retaper la ligne problématique..

AppleScript essaie généralement de vous signaler le problème spécifique, de suivre ses conseils et de retaper la ligne problématique..

Malheureusement, il est tout à fait possible que vous ayez tout entré correctement et que vous receviez toujours une erreur. Il se peut que votre version de Safari pose un problème ou que le script n’apprécie pas les pages Web que vous avez choisies pour une raison inconnue. Essayez de changer les choses et voyez si vous pouvez identifier le problème.

La gestion des erreurs est un sujet assez approfondi que je traiterai dans un prochain article. Pour l'instant, jetez un coup d'œil à notre article sur Techniques AppleScript avancées pour plus d'informations sur la façon de modifier le script pour qu'il prenne des mesures spécifiques en cas d'erreur..

Conclusion

Je viens de vous expliquer le processus complet d'écriture d'un script AppleScript afin de générer une liste de liens à partir de vos onglets ouverts dans Safari. Cela devrait vous éviter beaucoup de problèmes sur ces grands projets de recherche.

J'espère que vous aurez appris beaucoup de choses intéressantes sur AppleScript et sur la façon de procéder pour automatiser des tâches simples mais répétitives. Si vous avez des questions, n'hésitez pas à laisser un commentaire ci-dessous ou à nous contacter sur Twitter.