Cómo crear nuestras propias funciones en AppleScript

Dentro de cualquier lenguaje de programación es necesario utilizar alguna característica del lenguaje que permita modularizar el código para que pueda ser reutilizado, sea más sencillo de leer y mantener y esté mejor estructurado dentro del fichero de código que lo contiene. En AppleScript esto se consigue utilizando funciones o subrutinas.

Una función o subrutina en un lenguaje de programación consiste en un bloque de código que puede ser ejecutado desde otras funciones o subrutinas. Es como un pequeño programa dentro de un programa más grande.

La ejecución de una función o subrutina puede ser modificada gracias a que podemos enviarle parámetros. Por ejemplo, imaginemos una función que calcula la suma de dos números cualesquiera. Los parámetros para dicha función serían esos dos números cualesquiera.

Las funciones o subrutinas pueden devolver un valor, por ejemplo el resultado de la suma de dos números.

Creación simple de una función o subrutina

Ya hemos visto la creación y uso de funciones y subrutinas con AppleScript en otros artículos pero ahora lo vamos a ver con más detalle.

Para crear una función o subrutina utilizamos el comando on seguido del nombre que queramos darle a nuestra subrutina. El nombre de toda subrutina en AppleScript debe acabar con los símbolos de abre y cierra paréntesis ( ) ya que entre estos paréntesis es donde irán, si son necesarios, los parámetros que pasaremos a la subrutina.

A continuación del nombre de la función deberemos ir a la siguiente línea para comenzar el bloque de código a ejecutar dentro de la subrutina y por último indicamos el fin de la subrutina con el comando end seguido del nombre de nuestra subrutina pero esta vez sin los paréntesis para parámetros.


on miFuncion()
say "Esta es mi función"
end miFuncion

Llamando a una función para ser ejecutada

Para ejecutar una función simplemente debemos llamarla con su nombre seguido de los parámetros que necesite encerrados entre paréntesis. Si no requiere ningún parámetro simplemente deberemos usar los paréntesis vacíos.

Veamos un ejemplo simple en el que desde el evento run de nuestro script llamamos a nuestra función saluda().


on saluda()
say "Hola a todos"
end saluda

on run
saluda()
end run

Pasando parámetros a nuestra función

Para pasar parámetros a una función simplemente debemos declararlos a la hora de definir nuestra función con el comando on colocando cada parámetro dentro de los paréntesis separados por el caracter coma (,).

Veamos un ejemplo muy simple de una función verbalizaSuma


on verbalizaSuma(num1, num2)
set resultado to num1 + num2
say resultado
end suma

Para poder ejecutar nuestra función deberemos llamarla indicando dos números como parámetros.

El ejemplo completo sería el siguiente:


on verbalizaSuma(num1, num2)
set resultado to num1 + num2
say resultado
end verbalizaSuma

on run
verbalizaSuma(32, 23)
end run

Devolviendo un resultado desde nuestra función

Uno de los objetivos más importantes de las subrutinas o funciones es la de calcular un resultado según los valores que se le hayan pasado como parámetros. Para ello la función nos tiene que devolver un resultado.

En AppleScript utilizamos el comando return para devolver un resultado. Hay que tener cuidado ya que cualquier código que esté después del comando return no se ejecutará. Veamos el siguiente ejemplo:


on resta(num1, num2)
return num1 - num2
say "Este mensaje nunca se leerá"
end resta

Reescribamos nuestro ejemplo de la suma para que en lugar de verbalizaSuma utilicemos una función más genérica la cual sólo calculará la suma de dos números. El ejemplo quedaría así:


on suma(num1, num2)
return num1 + num2
end suma

on run
say "El resultado de sumar 22 y 33 es " & suma(22, 33)
end run

Fijaos que la llamada a la función suma() se ha indicado como un valor más de la cadena de texto que se va a verbalizar. Esto se debe a que cualquier llamada a una función se resuelve antes que el código en el que se encuentra la llamada.

Modularizar es bueno

Gracias a la posibiilidad de crear nuestras propias subrutinas o funciones podemos crear nuestra propia librería de funciones para resolver tareas como por ejemplo saber si VoiceOver está en ejecución, enviar un correo electrónico con una sola línea de código, cambiar aspectos de la interfaz gráfica de forma más sencilla, etc. Estas subrutinas pueden ser almacenadas en un fichero de código a parte y sólo copiar y pegar en el fichero de script que estemos trabajando aquellas funciones que vayamos a utilizar. De esta forma nuestro código será más sencillo de leer y mantener.

Eventos de ejecución en aplicaciones creadas con AppleScript

En el artículo Convertir un AppleScript en una aplicación para MacOS aprendimos cómo convertir nuestro script de AppleScript en una aplicación. Esto, entre otras ventajas, nos permite poder ejecutar más rapidamente nuestro script. Pero además podremos acceder a ciertos eventos que se dan en las aplicaciones.

Evento run

El evento run se ejecuta al arrancar la aplicación. Ya hemos visto código que utiliza este evento ya que la función on run se da tanto en aplicaciones como scripts de AppleScript.

Este evento suele utilizarse para inicializar valores para variables, preparar o cargar los recursos necesarios para ejecutar correctamente la aplicación o mostrar la interfaz de bienvenida al usuario.

Evento quit

El evento quit se produce cuando la aplicación va a terminar de ejecutarse y antes de cerrarse dispara el evento quit y ejecuta el código que hayamos codificado para él.

Este evento sólo está disponible cuando convertimos nuestro script en aplicación. Por ejemplo, veamos el siguiente código:


on quit
display alert "Adios a todos!"
end quit

on run
display alert "Hola a todos!"
end run

Si ejecutamos el código en el editor de AppleScript sólo se mostrará el mensaje de saludo pero nunca la despedida. Para poder ver la despedida deberemos convertir nuestro script de AppleScript en una aplicación de MacOS y ejecutarla como una app más. Entonces veremos el mensaje de despedida tras el mensaje de saludo.

Evento idle

El evento idle nos permite ejecutar un código de script cada X segundos. Con esto podemos crear aplicaciones que repitan un script cada cierto tiempo.

Este evento sólo está disponible cuando convertimos nuestro script en aplicación.

Otro requisito de este evento es que requiere más tiempo de ejecución que una aplicación habitual de AppleScript por lo que es recomendable que cuando vayamos a exportar nuestro script para convertirlo en aplicación verifiquemos la casilla Permanecer abierto tras el gestor de ejecución asegurándonos que nuestra ventana de aplicación permanece abierta ejecutando el evento idle hasta que decidamos cerrar la ventana de la aplicación de forma manual.

Al codificar el evento idle debemos finalizar su codificación devolviendo un número que representará el número de segundos necesarios para volver a ejecutar el evento idle. Por ejemplo, el valor 60 se referirá a un minuto y el valor 3600 a una hora. Para devolver ese valor usamos el comando return que nos permite devolver un resultado cuando ejecutamos una función de AppleScript.

Veamos un ejemplo muy sencillo. Vamos a crear una aplicación que reproducirá un sonido cada minuto.


on idle
do shell script "afplay /System/Library/Sounds/Blow.aiff"
return 60
end idle

Ejemplo completo

Nuestro ejemplo deberá realizar las siguientes tareas:

  1. Saludar al inicio
  2. Reproducir un sonido cada 30 segundos
  3. Despedirse al cerrar la ventana de la aplicación

el código sería algo como lo siguiente:


on run
display alert "Hola a todos!"
end run

on quit
display alert "Adios a todos!"
end quit

on idle
do shell script "afplay /System/Library/Sounds/Blow.aiff"
return 30
end idle

Recuerda verificar la casilla Permanecer abierto tras el gestor de ejecución al exportar tu script para convertirlo en aplicación.

Cómo obtener texto del usuario con AppleScript

En anteriores artículos hemos visto diversas opciones para que el usuario pueda elegir qué debe suceder al utilizar uno de nuestros scripts. Pero a veces necesitamos que el usuario nos de información que no hemos podido predecir a la hora de crear nuestro script. Esta información debe ser introducida a través de un campo de texto el cual puede ser utilizado por el usuario para aportar cualquier información que necesite nuestro script y el usuario quiera ofrecer.

Hemos visto ya el comando de AppleScript display dialog. Este comando también nos permite configurarlo para que muestre un campo de texto al usuario. Su sintaxis sería la siguiente:


display dialog "Texto de la pregunta" default answer ""

Obteniendo la respuesta

Como viene siendo habitual para poder hacer algo con la información introducida o seleccionada por el usuario debemos almacenarla en una variable. Podemos hacerlo de la siguiente forma:


set dialogResult to display dialog "?Cual es tu nombre?" default answer ""
set theName to the text returned of (dialogResult)

Primero almacenamos el resultado de la pregunta en la variable dialogResult y luego obtenemos el texto de dialogResult almacenandolo en la variable theName.

Podemos hacer estas dos operaciones en un sólo paso aunque se dificulta la lectura del código de nuestro script. El ejemplo quedaría de la siguiente forma:


set theName to the text returned of (display dialog "?Cual es tu nombre?" default answer "")

Un pequeño ejemplo

Vamos a crear un pequeño script que nos pregunte nuestro nombre y nos muestre un saludo personalizado.


set dialogResult to display dialog "?Cual es tu nombre?" default answer ""
set theName to the text returned of (dialogResult)
set sayHelloText to "Hola " & theName
display alert sayHelloText

Cómo reaccionar a la selección de una lista de elementos en AppleScript

En un artículo anterior vimos cómo permitir al usuario seleccionar un elemento de una lista a través de un cuadro de diálogo. En este artículo veremos cómo reaccionar a la selección del usuario.

Partiremos de nuestro ejemplo de selección de un tipo de comida para pedir a domicilio:


choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} multiple selections allowed false empty selection allowed false

Almacenando el resultado

Para gestionar algunas respuestas es necesario que almacenemos los resultados en una variable. Este es el caso del comando choose from list.

En nuestro ejemplo almacenaremos el resultado en la variable resultadoDeDialogo.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

Reaccionando dependiendo del resultado

Para realizar una u otra operación dependiendo del valor de una variable debemos usar estructuras condicionales en AppleScript para poder codificar todas las posibles acciones que el usuario haga con el cuadro de diálogo.

En nuestro ejemplo el usuario puede realizar las siguientes operaciones:

  • Pulsar el botón de cancelar
  • Seleccionar un elemento y pulsar el botón de aceptar

Gracias a que hemos indicado en el comando choose from list que el usuario no puede seleccionar más de un valor y que el botón de aceptar sólo estará disponible si se ha seleccionado un valor de la lista no tenemos que preocuparnos por otras posibles respuestas por parte del usuario.

Cancelar como resultado

Si el usuario pulsa el botón de cancelar el resultado que obtendremos en la variable resultadoDeDialogo será false. Sabiendo esto podemos codificar qué hacer si el usuario pulsa el botón cancelar.

En nuestro ejemplo mostraremos un mensaje invitando al usuario que vuelva a ejecutar nuestra aplicación cuando tenga hambre.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

if resultadoDeDialogo = false then
display alert "Vuelve cuando tengas hambre"
end if

Una lista como resultado

Si el usuario pulsa el botón de aceptar el resultado obtenido será una lista de AppleScript con todos los valores seleccionados.

Si hubiesemos permitido al usuario pulsar el botón aceptar sin seleccionar nada obtendríamos como resultado una lista vacía.

Para nuestro ejemplo mostraremos un mensaje indicando que a nosotros nos apetece también ese tipo de comida excepto si es comida vegetariana ya que mostraremos otro mensaje.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

if resultadoDeDialogo = false then
display alert "Vuelve cuando tengas hambre"
else
set tipoComida to get text 1 of resultadoDeDialogo
if tipoComida = "Vegetariana" then
display alert "No me apetece mucho comida vegetariana ahora. Que aproveche."
else
set cadenaResultado to "A mi también me apetece comer comida " & tipoComida & ". Pide un poco para mi también, por favor."
display alert cadenaResultado
end if
end if

Con todo esto ya podemos crear scripts de AppleScript más complejos en los que el usuario puede controlar cómo reaccionará nuestro programa.

Talkback ahora será conocido como Android Accessibility Suite

La empresa Google ha decidido cambiar el nombre a su lector de pantallas para el sistema Android. En la última actualización de Talkback Google ha aprovechado y cambiado el nombre de este lector a Android Accessibility Suite.

Con este movimiento parece ser que la empresa quiere dejar claro que Talkback ha dejado de ser un sistema que comenzó como una aplicación para que personas pudiesen manejar el teléfono sin mirar a la pantalla y ser ya oficialmente un lector de pantallas que permite explorar una pantalla táctil mediante gestos y recibir la información bien mediante voz o braille.

Según la página de Android accessibility suite en la PlayStore este lector de pantallas incluye tres servicios:

  • Talkback: añade feedback de voz, vibración y sonido a tu dispositivo
  • Switch access: permite controlar tu dispositivo mediante gestos
  • Select to speak: permite seleccionar un contenido de la pantalla para ser leído mediante la voz de tu dispositivo

Aunque el nombre del paquete de software ha cambiado Google sigue conservando el nombre de Talkback para identificar el módulo principal del lector de pantalla así como las referencias al lector de pantallas en la documentación de soporte para Talkback

A nivel de uso este cambio de nombre no implica nada para el usuario de lector de pantallas para Android. Más bien resulta beneficioso ya que permite a fabricantes de dispositivos Android o cocineros de roms para Android incluir un único paquete con todo el soporte necesario para que un usuario ciego pueda tener acceso al sistema operativo Android instalando una única aplicación.

Puedes encontrar y descargar la aplicación en la página de Android accessibility suite en la PlayStore