Pashua ajoute un brin d’interface à AppleScript

Nicolas Furno |

AppleScript est un langage très simple imaginé par Apple pour scripter son système d’exploitation et les applications associées. Avec sa syntaxe très proche de l’anglais, c’est un langage parfait pour débuter, mais il permet aussi d’aller très loin, notamment parce qu’il peut lancer des commandes Shell. L’un de ses gros défauts toutefois, c’est qu’il est incapable d’offrir un moyen simple d’interagir avec l’utilisateur.

Par défaut, vous n’aurez que des boîtes de dialogue simplistes pour demander à l’utilisateur une confirmation ou une information. Pour créer une interface plus complexe, il faut passer par un développement en bonne et due forme en Objective-C, ce qui n’est pas évident pour les débutants. Pashua est une application qui permet de réaliser des boîtes de dialogue complètes sans avoir à utiliser un outil ou un langage compliqués.

Voici à quoi ressemble une interface créée par Pashua. Ici, on a utilisé des champs de texte, des listes de sélection, une case à cocher et un calendrier, mais les possibilités sont beaucoup plus larges encore. Cliquer pour agrandir
Voici à quoi ressemble une interface créée par Pashua. Ici, on a utilisé des champs de texte, des listes de sélection, une case à cocher et un calendrier, mais les possibilités sont beaucoup plus larges encore. Cliquer pour agrandir

Pashua est un outil gratuit (les dons sont acceptés) qui fonctionne à partir de Snow Leopard et encore très bien avec macOS Sierra. Il ne permet pas de créer n’importe quelle interface, mais des boîtes de dialogue enrichies où l’utilisateur peut saisir plusieurs informations. Du texte, des cases à cocher, des listes défilantes, la sélection d’un fichier, la saisie d’un mot de passe ou encore une date : vous pouvez constituer des fenêtres assez complètes sans connaissance particulière.

Pour « coder » ces boîtes de dialogue améliorées, Pashua propose une syntaxe très légère. Chaque champ et chaque bouton est associé à un identifiant unique et à une série de paramètres pour définir son comportement et son aspect. Par exemple, voici comment définir un champ de texte que l’utilisateur peut modifier :

txf.type = textfield
txf.label = Un champ de texte
txf.default = Texte par défaut dans le champ
txf.width = 270
txf.tooltip = Explications concernant le champ de texte.

Voici ce que cela donne :

Pashua permet aussi de réaliser des boîtes de dialogue extrêmement simples.
Pashua permet aussi de réaliser des boîtes de dialogue extrêmement simples.

Créer des interfaces avec Pashua est facile, en revanche distribuer des scripts qui utilisent cette app l’est beaucoup moins. Il y a plusieurs méthodes pour y arriver, le plus propre étant d’intégrer l’app dans un Paquet de scripts, le format qui permet de fournir un seul fichier qui contient en fait le script et des ressources annexes. Le problème, c’est que vous alourdirez chaque script avec des ressources redondantes. Par ailleurs, la distribution n’est pas autorisée pour les projets commerciaux.

Si vous utilisez les scripts uniquement pour votre usage personnel, le plus simple est de placer Pashua.app dans le dossier des applications et le fichier Pashua.scpt fourni avec l’app dans le dossier des scripts. Ensuite, vous appellerez ce script depuis les vôtres en suivant la méthode détaillée à cette adresse. Si tout va bien, vous pouvez maintenant définir les interfaces dans vos scripts et Pashua se chargera du reste.

Cette mise en place est un petit peu complexe, certes, mais elle offre beaucoup de souplesse. Vous pouvez afficher plusieurs interfaces et surtout, vous pourrez récupérer toutes les valeurs saisies par l’utilisateur grâce à Pashua. Elles sont renvoyées sous la forme d’un enregistrement (records) où chaque valeur saisie dans l’interface est associée à son identifiant. Pour reprendre notre exemple précédent, voici comment on récupère le texte saisi dans le script pour l’associer à une variable :

set leTexteSaisi to txf of theResults

Pashua ne se limite pas à l’AppleScript toutefois et vous pourrez également l’utiliser pour des scripts ou des apps en Python, en Perl, en PHP ou encore en Ruby. Même un script Bash, lancé depuis le terminal, peut offrir une interface plus complète en l’utilisant. Les explications précises pour chaque langage sont disponibles à cette adresse, avec des exemples complets à chaque fois.

Cette solution n’est pas aussi élégante qu’une interface native créée en Objective-C ou en Swift, mais elle est nettement plus simple à mettre en œuvre. Et avec un effort somme toute minimal, on obtient un résultat propre et plus ergonomique que les séries de boîtes de dialogue qu’il faut créer en AppleScript pur. À vous de voir si vos projets sont suffisamment complexes pour leur ajouter une interface avec Pashua.

Comment masquer Pashua ?

Pashua étant une app, elle apparaît par défaut dans le dock de macOS à chaque fois qu’elle s’affiche. Pour une intégration plus discrète, vous pouvez toutefois exploiter l’une des fonctions de base du système qui consiste à rendre invisible n’importe quelle app.

Effectuez un clic secondaire sur l’app, affichez le contenu du paquet puis dans le dossier Contents, ouvrez le fichier Infos.plist avec un éditeur de code. Trouvez la ligne <key>LSUIElement</key> et remplacez <false/> par <true/> à la ligne suivante. L’app restera alors toujours invisible, au moins jusqu’à la prochaine mise à jour.

Cliquer pour agrandir
Cliquer pour agrandir
avatar cv21 | 

Je ne suis pas l'auteur des scripts mais ici les "programmes" mêlant AppleScript/Pashua/commandes Shell/commandes FFMpeg fonctionnent à merveille depuis 3/4 ans. Pas de soucis lors des mises à jour d'Os, cet ensemble étant relativement indépendant.

Effectivement, ce n'est pas aussi rapide qu'un programme compilé en Objectiv-C mais ça marche super bien. Manipulation de fichiers textes, xml, fichiers, commandes curl, il est possible d'avancer progressivement.

Le plus dur étant la prise en main au démarrage pour comprendre comment articuler le tout, bravo MacG pour cette présentation !

Ajout : je précise que l'auteur des scripts n'avait aucune notion informatique même basique, boucles, variables et avec un peu de persévérance il y est arrivé. Ok, c'est un exemple, la persévérance doit y être pour beaucoup mais la simplicité du couple AppleScript/Pashua aussi. Les quelques "fenêtres" en plus apportées par Pashua permettent d'envisager des interfaces un brin plus complètes et l'air de rien c'est bien pratique.

avatar Nicolas Furno | 

@cv21

D'ailleurs, j'ai oublié les remerciements de rigueur dans l'article.

Merci pour les compliments en tout cas.

avatar C1rc3@0rc | 

Je sais pas quand la premiere version de Pashua est sortie, mais c'est un venerable soft qui rend bien service, surtout depuis qu'Apple a laissé tomber (ou n'a meme jamais realisé) l'idee d'avoir un outil pour l'interface des scripts. Faut aussi dire que Pashua ne se limite pas au verbeux et inneficace AppleScript mais peut s'utiliser avec la majorité, a commencer le Bash et Python.

Apple avait d'ailleurs eu la bonne idee a un moment de supporter Python et Ruby comme alternatives a Apple Script et faciliter l'integration graphique avec Xcode. Semble que comme beaucoup de bonnes idees de l'Apple du passé ce soit resté dans le passé...

Il faut aussi saluer la persévérance des auteurs de Pashua, parce qu'il reste un des rares a avoir survécu. Pendant un bon moment j'utilisai Smile, mais c'était plus orienté science et plus lourd.

avatar ovea | 

« il faut passer par un développement en bonne et due forme en Objective-C »

Pardon, mais ce n'est pas possible en Swift ?

avatar Nicolas Furno | 

@ovea

Sauf erreur de ma part, non. En tout cas, pas en utilisant le bridge entre les deux langages fourni par Apple.

avatar alitaliano | 

Merci pour cet article intéressant, je ne connaissais pas et ça me sera sûrement utile pour mes scripts de plus en plus complexes.

avatar byte_order | 

A noter que Pashua est utilisable pas uniquement depuis AppleScript, y'a le support dispo aussi pour des scripts écris en Bash, Python, Perl, PHP, Javascript , Ruby et en pratique tout langage permettant de passer des paramètres et d'exécuter un programme externe et de récupérer le flux de sortie.

avatar Boumy | 

Comment Apple a-t-elle pu prétendre un jour faire de ce langage (et d'Automator) un jeu d'enfant ? Je sais, ce ne sont pas les termes exacts. On a vu Applescript annoncé sur les pages d'accueil des sites Apple au même titre que le dernier Mac ou la dernière révolution pommée. A l'époque où QuicKeys m'a rendu d'énormes services, je me disais: cool on ira encore plus loin avec AppleScript… Pas madame et monsieur toulemonde en tous cas. Alors bien sûr Apple affiche aujourd'hui Swift sur ses pages d'accueil ça ne veut pas dire que la famille Toulemonde est concernée directement. D'ailleurs, la famille toulemonde commence à faire ch(beeeep) à vouloir tout, tout cuit (je n'ai pas dit: Toutou cuit). Donc, en attendant, je me suis rabattu sur KeyboardMaster, na ! :D Ouaf!

avatar BeePotato | 

@ Boumy : « On a vu Applescript annoncé sur les pages d'accueil des sites Apple »

C’était à quelle occasion ? J’avoue que je ne me rappelle plus.

Parce qu’au moment du lancement d’AppleScript, je ne suis pas sûr qu’Apple avait déjà un site web (ce qui est sûr, c’est que moi je n’avais pas de navigateur pour aller le vérifier). ;-)

avatar BeePotato | 

« Pour créer une interface plus complexe, il faut passer par un développement en bonne et due forme en Objective-C »

Non.
On peut, avec Xcode, développer une application en AppleScript. Pas besoin d’Objective C.

Cependant, ça reste un peu ardu pour les débutants parce qu’il faut apprendre comment créer une interface avec AppKit et Interface Builder. M’enfin, il n’y a tout de même pas besoin de creuser bien loin pour arriver à réaliser le genre d’interface qui est présenté ici, et ça ouvre la possibilité de faire bien plus que ça.
Une solution à garder à l’esprit, donc.

Mais bien sûr, ça n’enlève rien au mérite de Pashua, qui propose une solution sans doute plus facile à maîtriser pour faire des applications plus simples, tout en étant utilisable avec d’autres langages.

CONNEXION UTILISATEUR