Aide aux divers cours ou à votre activité - Bruno GADRAT
Pour laisser plus de temps au paysage et moins à l'informatique
Ici plus qu'ailleurs c'est indispensable
Le principe de base de l'utilisation d'AppleScript: s'adresser aux diverses applications de votre Mac et de leur demander de faire quelque chose de spécial qui contribue à l'ensemble de ce que vous voulez faire.
La principale difficulté est de le demander au bon logiciel. Quand
on appelle le finder ou Photoshop ou iTune il faut lui demander ce
qu'il sait faire avec les mots qu'il comprend sinon vous aurez droit à
un petit message d'erreur et beaucoup de frustration. Cette difficulté
est accrue par le fait que certains mots font partie du langage, donc commun à tous les scripts et d'autres font partie du langage de l'application.
Par exemple "display dialog" fait partie du langage de l'application
Display dialog fonctionne dans l'application de base du Mac (Sandard Additions)
display dialog ("bonjour")
Cela fonctionne aussi dans le Finder
tell application "Finder" to display dialog ("bonjour")
mais pas dans le sous programme du Mac qui traite les images (Image Events). tell application "Image Events" to display dialog ("bonjour")
Quand on traite des images, ce n'est pas le temps de bavarder.
La deuxième grande difficulté est de le dire correctement. En
particulier quand on fait référence à des fichiers.
Par exemple
set pourlacorbeille to (path to desktop folder as string) & "ajeter.txt"
place le chemin du fichier ajeter.txt dans la variable pourlacorbeille sous forme de chaîne de caractères. C'est
efficace pour affichier le nom du chemin
set pourlacorbeille to (path to desktop folder as string) & "ajeter.txt"
display dialog pourlacorbeille
ou pour déplacer le fichier ajeter.txt qui est sur le bureau vers la poubelle,
set pourlacorbeille to (path to desktop folder as string) & "ajeter.txt"
tell application "Finder" to move pourlacorbeille to trash
mais pas pour ouvrir le fichier ajeter.txt. Pour ouvrir le fichier par le finder, il faut que son chemin soit donné sous
forme d'alias (pointeur vers le fichier).
set pourlacorbeille to (path to desktop folder as string) & "ajeter.txt" as alias
tell application "Finder" to open pourlacorbeille
Donc l'essentiel est de faire attention et de ne pas se décourrager.
Savoir où trouver des bons exemples
Cette page est juste faite pour avoir une idée de comment écrire des petites actions à insérer dans vos scripts.
Accès aux scripts déjà dans votre machine par le Finder dans le dossier applications (ou application/utilitaires pour les systèmes 10.6)
Pour commencer à utiliser AppleScript, je vous recommande en
premier
lieu d'installer l'accès aux scripts dans votre barre des menus.
Applications/AppleScript/Install Script Menu
Le petit menu des scripts vous donne accès à de nombreux
scripts utiles
comme par exemple renomer tous les fichiers d'un dossier. Les scritps sont
placés dans le dossier Scripts de la bibliothèque générale de
l'ordinateur. Vous pourrez y accéder en fouillant dans le dossier Library de votre disque dur
ou par
Applications/AppleScript/Example Scripts
Vous pouvez placer les scripts n'importe où, mais il y a des
répertoires magiques pour tous les utilisateurs
Ordinateur/disque dur/Library/Script/
Ordinateur/disque dur/Library/Script/Folder Action Scripts/
ou seulement pour vous
Ordinateur/disque dur/Users/moi/Library/Script/
Ordinateur/disque dur/Users/moi/Library/Script/Folder Action Scripts/
Les scripts placés dans le dossier Scripts sont accessibles par le menu en haut de l'écran.
Les scripts placés dans le dossier Folder Action Scripts peuvent s'activer automatiquement à l'ouverture, la fermeture et l'ajout ou le retrait d'éléments d'un dossier. Il faudra rendre le dossier actif en faisant un clic droit dessus et en lui affectant l'action de dossier désirée. Par exemple faire tourner l'image sur la droite.
Une autre façon d'utiliser les scripts est de les enregistrer comme application. Cette application est nommée droplet quand elle agit avec les fichiers qu'on lui dépose dessus.
Maintenant que le menu est activé, lancez l'éditeur de script
/Basics/Open Script Editor . Vous pouvez copier dedans tous les bouts de code de cette page et les essayer.
display dialog ("bonjour")
Passez voir les références pour en savoir plus sur l'utilisation d'appleScript et de l'éditeur de scripts.
N'oubliez pas les notions élémentaires de la programmation. Au minimum vous devez savoir ce que c'est qu'une variable, un type de variable, une boucle, un test conditionnel, une fonction.
Voici une boucle avec condition de sortie
set laChaine to "une chaîne à couper.texte"
repeat with compteur from 1 to (count laChaine) if (item compteur of laChaine) is in {".", " ", "-"} then
end repeat set chaineCoupee to (items 1 thru (compteur - 1) of laChaine) as string
end if
exit repeat
display dialog chaineCoupee
Voici une fonction (routine)
set fichierchoisi to choose file
display dialog typeDeFichier(fichierchoisi)
-- la fonction
on typeDeFichier(fichierchoisi) tell application "Finder"
end typeDeFichier return kind of fichierchoisi
end tell
On trouve de tout sur le net mais quel plaisir de le faire soi-même
La très grande diversité des logiciels disponibles couvre pratiquement tous nos besoins mais quelques petits ajouts peuvent nous faciliter la vie.
Droplet pour ouvrir un fichier html avec Kompozer
Vous avez remarqué que certains logiciels comme Kompozer (éditeur
wysiwig de pages web gratuit (dont le développement à été arrêté en 2005)) n'ouvrent pas les fichiers qu'on dépose
dessus. Vous voulez peut-être simplement ouvrir plus rapidement vos
fichiers avec un autre logiciel. Par exemple, on voudra ouvrir un
fichier html avec un éditeur de texte comme SubEthaEdit pour structurer
le squelette de la page, on voudra l'ouvrir avec un éditeur wysiwig qui
garde le code propre comme Komposer pour écrire son contenu et on
voudra l'ouvrir avec un navigateur pour voir son aspect.
Ce petit bout de script est une droplet. Une application qui se déclanche quand on lui dépose
dessus des fichiers. Justement ceux que l'on veut ouvrir.
Pour faire la droplet:
Copier ce code dans l'éditeur de script,
enregistrez le comme application. Glissez les fichiers html sur votre
nouveau logiciel OuvreAvecKompozer.
on open (lesFichiers) -- En déposant les fichiers sur la droplet
activate
end open
tell application "KompoZer" repeat with leFichier in lesFichiers
end tell open leFichier
end repeat
Vous pouvez aussi utiliser cette version de OuvreAvecKompozer que l'on peut aussi lancer en cliquant dessus
Certains logiciels sont récalcitrant. Si vous remplacez Komposer par Adobe Photoshop CS il vous dira qu'il ne comprend pas open. En revanche Adobe Photoshop CS2 ne posera pas de problème. Si vous avez Adobe Photoshop CS et n'avez pas envie de changer de version, vous pouvez ouvrir les fichiers en remplaçant Kompozer par Adobe ImageReady CS. Le passage des images de ImageReady à photoshop est alors très simple.
Pour mettre au point vos droplet
Vous avez enregistré votre script comme application et maintenant il se lance à chaque fois que vous cliquez dessus. Dans votre dossier de développement des droplets vous aimerez certainement en avoir une droplet qui ouvre les autres droplets.
Voir plus haut comment faire une droplet.
on open (lesFichiers)
activate
end open
tell application "Script Editor" repeat with leFichier in lesFichiers
end tell open leFichier
end repeat
Donne le nom du dossier et des fichiers ajoutés
Les actions de dossier sont certainement la chose la plus pratique pour traiter un lot de fichiers juste en les posant dans un dossier.
Pour faire une action de dossier:
Copier ce code dans l'éditeur de script,
enregistrez le comme script dans le dossier Library/Scripts/Folder Action Scripts.
Clic droit sur le dossier qui doit réagir. Activez les actions de
dossier et joindre cette action de dossier. Le dossier est prêt à
recevoir vos fichiers.
on adding folder items to ceDossier after receiving itemsajoutes
set message to ("dossier: " & return & (ceDossier as string) & return & return & "Élements ajoutés: " & return)
end adding folder items to
repeat with leFichier in itemsajoutes set message to message & leFichier & return
end repeat
display dialog (message)
Vous pouvez aussi utiliser cette version
-- fonction de réaction du dossier
on adding folder items to ceDossier after receiving itemsajoutes traiteLesElements(ceDossier, itemsajoutes)
end adding folder items to
-- fonction qui traite ce qui est recu
on traiteLesElements(ceDossier, itemsajoutes) set message to ("dossier: " & return & (ceDossier as string) & return & return & "Élements ajoutés: " & return)
end traiteLesElements
repeat with leFichier in itemsajoutes set message to message & leFichier & return
end repeat
display dialog (message)
Donne le nom de la droplet et des fichiers ajoutés
Parfois on préfère que le logiciel soit indépendant du dossier mais on veut quand même utiliser le nom de ce sur quoi c'est déposé. Ce nom peut par exemple être le nom du projet dans lequel on veut ranger les fichiers ou bien le format ou la taille maximale des images que l'on veut réduire.
--fonction de droplet
on open (itemsajoutes) activate
end open
set ceDossier to nomduscript()
traiteLesElements(ceDossier, itemsajoutes)
--fonction qui donne le nom de la droplet
on nomduscript() tell application "Finder"
end nomduscript set the lesApp to name of every process whose file type is "APPL"
end tell
return last item of lesApp
--fonction qui traite ce qui est recu
on traiteLesElements(ceDossier, itemsajoutes) set message to ("dossier: " & return & (ceDossier as string) & return & return & "Élements ajoutés: " & return)
end traiteLesElements
repeat with leFichier in itemsajoutes set message to message & leFichier & return
end repeat
display dialog (message)
Pour lancer le script par le menu script ou par l'éditeur de script
Parfois on veut juste que les choses se fassent quand on lance le script. Ce script affiche le dossier et les fichiers sélectionnées. Sélectionnez les éléments dans le Finder et lancer le script. Comme il n'y a pas d'action de déposer sur un dossier ou sur une application, ce script cous demandera de choisir le dossier dans une fenètre de sélection.
Pour lancer par le menu Scripts:
Copier ce code dans l'éditeur de script,
enregistrez le comme script dans le dossier Library/Scripts/
-- au lancement
on run set itemsajoutes to selection of application "Finder"
end run
if (count of itemsajoutes) = 0 then display dialog ("Il faut sélectionner des éléments dans le finder avant de lancer ce script")
else tell application "Finder" to set ceDossier to choose folder with prompt "Choix du dossier d'arrivée" invisibles no multiple selections allowed no
end if
activate
traiteLesElements(ceDossier, itemsajoutes)
-- fonction qui traite ce qui est recu
on traiteLesElements(ceDossier, itemsajoutes) set message to (return & "dossier: " & return & (ceDossier as string) & return & return & "Élements ajoutés: " & return)
end traiteLesElements
repeat with leFichier in itemsajoutes set message to message & leFichier & return
end repeat
display dialog (message)
Parfois on veut pouvoir utiliser le script en le lançant par le menu script, en l'utilisant comme action de dossier et en l'utilisant comme droplet c'est possible. Regardez le code de onRunOnOpenOnAddingFolder
Des listes de listes comme tableau
Chaque application pilotable par Applescript possède un dictionnaire de mots autorisés que l'on peut découvrir par le menu Fichier/Ouvrir un dictionnaire mais il ne s'agit pas de cela. On va juste parler d'une table d'équivalences.
Dans AppleScript une liste est une suite d'éléments séparés par des virgules et mis entre deux accolades. Les éléments peuvent être eux-même des listes. Ce petit dictionnaire est une liste de listes contenant chacune un élément simple et une liste contenant un nombre variable d'équivalences à cet élément simple.
Essayez dans l'éditeur de Scripts:
Copier ce code dans l'éditeur de script,
essayez-le en changeant des éléments
set ceci to "February" -- vous pouvez essayer en vous souvenant que 2 et "2" ce n'est pas pareil
set cela to chercheDansLeDictionnaire(ceci) -- trouve la correspondance
set affiche to "" -- pour séparer les différentes réponses du résultat
repeat with i in cela set affiche to affiche & i & return
end repeat
display dialog "Il y a " & (count of cela) & " éléments correspondant à " & ceci & return & return & affiche -- le dictionnaire
on chercheDansLeDictionnaire(ceci) -- Écrit le début du dictionnaire
end chercheDansLeDictionnaire
set dictionnaire to {{1, {"un", "uno", "01", "premier"}}, {2, {"deux", "duo", "02"}}, {3, {"trois", "03"}}}
-- ajoute quelques éléments au dictionnaire
set dictionnaire to dictionnaire & {{"January", {"01", "jan", "janvier"}}, {"February", {"02", "fev", "fevrier"}}, {"March", {"03", "mar", "mars"}}}
set tailleDuDictionnaire to count of dictionnaire -- donne le nombre d'éléments du dictionnaire (le premier niveau des listes)
set renvoi to "---" -- pour savoir si on va trouver une réponse
repeat with i from 1 to tailleDuDictionnaire -- cherche dans le premier niveau des listes if item 1 of item i of dictionnaire = ceci then return item 2 of item i of dictionnaire -- si le premier élément du premier niveau correspond renvoi le deuxième élémentqui est une liste de correspondances
end repeat
if renvoi = "---" then return ceci -- retourne l'original s'il n'y a pas d'équivalence
Exemple avec le nom de l'extension
Un petit exemple très simple pour ranger les fichiers selon leur extension (ce qu'il y a après le point à la fin du nom du fichier).
tell application "Finder" -- travail à faire par le Finder
set dossierchoisi to choose folder with prompt "Quel dossier faut-il ranger ?" -- demande le dossier
end tell
set listeDesElements to list folder of dossierchoisi without invisibles -- fait la liste des éléments du dossier
repeat with lElement in listeDesElements -- pour chaque élément de la listeDesElements set elementDuDossier to item lElement of folder dossierchoisi as alias -- met en mémoire l'élément
end repeat
if kind of elementDuDossier is not in {"folder", "dossier"} then -- si ce n'est pas un dossier set nomExtension to name extension of elementDuDossier -- met en mémoire l'extension
end if
if nomExtension = "" then set nomExtension to "fichierSansExtension" -- pour ranger les inconnus
if not (exists folder nomExtension of dossierchoisi) then make new folder at dossierchoisi with properties {name:nomExtension} -- crée le sous-dossier s'il n'existe pas
move elementDuDossier to folder nomExtension of dossierchoisi -- déplace le fichier dans le sous-dossier
Pour aller au fond des choses
ExploreFichiersDossiersSousDossiers Droplet pour traiter les dossiers avec tout leur contenu d'un simple glisser déposer.
-- Applescript - Petits bouts de programmes utiles par B.Gadrat - 22 déc 2009
-- Permet d'accéder aux dossier et sous-dossier déposés sur cette droplet
-- Le script doit être enregistré comme application pour fonctionner comme droplet
-- Traitement des fichiers déposé sur cette Droplet. Développer cette fonction selon vos besoins
on traiteFichier(lElement) set CheminFichierChaine to lElement as string
end traiteFichier
display dialog ("Fichier: " & return & CheminFichierChaine) giving up after 1 -- affiche le nom du fichier
-- Traitement des dossiers
on traiteDossier(lElement) set CheminDossierChaine to lElement as string
end traiteDossier
display dialog ("Dossier: " & return & CheminDossierChaine) giving up after 1 -- affiche le nom du dossier
faisLalisteDesElements(CheminDossierChaine) -- pour explorer le contenu des sous-dossiers
-- fonction de déclanchement de la droplet
on open (LesElementsDeposes) activate
end open
separeDossiersFichiers(LesElementsDeposes) -- Sépare les dossiers des fichiers
-- fonction au lancement si on doubleclic sur la droplet ou si on l'éxécute par le menu script ou l'éditeur de script
on run set LesElementsDeposes to choose folder with prompt "Choisissez le dossier à explorer" without invisibles
end run
separeDossiersFichiers(LesElementsDeposes as list)
-- Separe les dossiers des fichiers
on separeDossiersFichiers(LesElementsASeparer) repeat with lElement in LesElementsASeparer -- Pour tous les éléments
end separeDossiersFichiers if kind of (info for lElement) is in {"Folder", "Dossier"} then -- si c'est un dossier
end repeat traiteDossier(lElement) -- Action pour le dossier important pour aller chercher son contenu
else traiteFichier(lElement) -- Action sur le fichier
end if
-- Fais la liste des éléments du dossier -- Garder intact pour l'exploration des sous-dossiers
on faisLalisteDesElements(CheminDossierChaine) tell application "Finder"
end faisLalisteDesElements set liste to every item of folder CheminDossierChaine -- liste tous les éléments du dossier
end tell
repeat with lElement in liste -- pour chaque élément if kind of (lElement as alias) is in {"Folder", "Dossier"} then -- si c'est un dossier
end repeat my traiteDossier(lElement as alias) -- Traite le dossier
else my traiteFichier(lElement as alias) -- Sinon traite le fichier
end if
Vous aussi vous avez plein de photos pas rangées ?
Vous aimez faire des photos mais vous n'avez pas le temps de bien les nommer par projet et par date, ce qui facilite le rangement et l'utilisation.
Je sais iphoto et d'autres logiciels font ça, mais vous n'aimez pas leur rangement obscur et vous n'avez pas le temps de vous en occuper. Juste le temps de brancher l'appareil photo qui ouvre transfert d'images et de lui dire le dossier portant le nom du projet dans lequel il doit les placer. Pour le reste, l'ordinateur peut bien s'en charger
Rangement-projet utilise le nom du dossier et d'autres informations sur le fichier pour renommer les fichiers et les ranger dans un sous-dossier dont le nom peut dépendre du projet (dossier englobant) ou du fichier. Regardez le code de rangement-projet pour l'adapter à vos besoins et ranger les choses à votre façon.
Transformer un AppleScript en HTML
L'éditeur de script d'Apple permet d'enregistrer des fichiers en format texte avec l'extension .applescript. Mais pour les présenter sur le web une mise en couleurs s'impose. À la main c'est un peut long. AppleScript2HTML-V2 permet de faire cette transformation rien qu'en glissant le script sur la droplet et place le fichier html résultant sur le bureau avec le même nom que le script. Soyez un peu patient. Ne jouez pas avec l'éditeur de script pendant la transformation.