AppleScript

AppleScript
Desarrollador(es)
Apple
https://developer.apple.com/applescript/ y https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide
Información general
Extensiones comunes .scpt, .scptd, .applescript
Apareció en 1993
Última versión estable 2.2.1
Sistema de tipos dinámico
Influido por HyperCard
Sistema operativo System 7, Mac OS 8, Mac OS 9 y Mac OS X
Licencia licencia privativa

Applescript es un lenguaje de programación desarrollado por Apple y diseñado para su ejecución bajo los sistemas Mac OS. Genéricamente, Applescript es la palabra usada para designar el entorno de Scripts de Mac OS, pensado para operar en paralelo a la GUI.

Historia

El proyecto Applescript fue una rama derivada del proyecto HyperCard. HyperCard contenía un lenguaje de programación basado en la lengua Inglesa llamado HyperTalk, que podía ser usado para incluir contenido lógico en un programa de HyperCard. Los ingenieros de Apple pensaron que podría diseñarse un lenguaje de scripts similar para ser usado con cualquier aplicación, y el proyecto Applescript ahí dio comienzo.

MacOS necesitó profundos cambios y mejoras para implementar Applescript. Muchos de estos cambios se publicaron con el lanzamiento del sistema 7, principalmente el concepto del Apple Event. Applescript compitió para atraer la atención de los desarrolladores con otras nuevas tecnologías que fueron lanzadas al mismo tiempo (Baloon help, Publish and Subscribe, etc.). Para algunas de las aplicaciones, Applescript fue la tecnología más difícil de implementar, requiriendo que se reescribieran grandes porciones de código de bajo nivel de las mismas, e incluso el propio marco de aplicación de Apple, MacApp, no soportó los Apple Events durante algún tiempo.

El lanzamiento fue en octubre de 1993 como parte del sistema 7.1.1 (La primera gran actualización del sistema 7). QuarkXPress (Versión 3.2) fue una de las primeras grandes aplicaciones que soportó Applescript, y como resultado, Applescript fue ampliamente adoptado en los segmentos de publicación del mercado de Apple. Aunque es discutible, la razón por la cual la plataforma Mac se mantuvo como líder de mercado tras la publicación de QuarkXPress y otras aplicaciones para la plataforma Microsoft Windows, fue que era la única que soportaba la automatización de flujos de trabajo complejos.

El paso hacia Mac OS X y su marco Cocoa ha significado una mejor implementación de Applescript. Las aplicaciones Cocoa ofrecen compatibilidad con Applescript de forma básica sin ningún esfuerzo por parte del desarrollador, y pueden alcanzar niveles profundos de compatibilidad con un poco de inversión de tiempo del desarrollador. AppleScript Studio, publicado con Mac OS X 10.2, permite a los usuarios programar aplicaciones enteras usando Applescript y objetos Cocoa.

Conceptos Básicos

Applescript fue concebido principalmente como un lenguaje de programación de scripts, ofreciendo a los usuarios una herramienta inteligente de control y permitiendo la comunicación entre diferentes aplicaciones.

Los sistemas anteriores al sistema 7 poseían un modelo rudimentario de Evento con el que se podían ejecutar un número fijado de eventos de bajo nivel, como "tecla pulsada" o "botón de mouse pulsado". Cada aplicación era responsable de la gestión y traducción a acciones de alto nivel que tuvieran algún sentido para el usuario, como "Ejecutar la opción de menú Pegar". En muchos casos, el mismo evento contenía tanto el concepto de acción (hacer clic) como las instrucciones para su ejecución (cuando se haga clic, ejecutar la opción Pegar).

La implementación de Applescript requirió al desarrollador la separación de la acción de la ejecución, un trabajo al que Apple se refirió como "Factoring". Los programadores fueron animados a escribir dos maneras distintas de manejo de los eventos, una para el manejo de eventos de bajo nivel (clics, pulsaciones de teclas, etc.) y otra para eventos de alto nivel (Apple Events).

Applescript en Mac OS X

En Mac OS X, Applescript es mucho más sencillo de implementar para los desarrolladores, particularmente para las aplicaciones desarrolladas en Cocoa. A diferencia de Mac OS donde los eventos son procesados por las aplicaciones, bajo Cocoa los eventos son transformados a una instrucción de alto nivel por el objeto NSApplication, y luego dirigido a un objetivo correcto. Esto significa que todas las aplicaciones de Cocoa llevan el "Factoring" hecho, el programador normalmente no escribe nada sobre el manejo del evento y solamente debe escribir cómo responderá la aplicación a los procesos que el evento solicite.

Otra importante ventaja es que los objetos Cocoa se nos presentan como estándares de manera que todos pueden acceder a ellos directamente. Bajo Cocoa, Applescript es mucho más "ligero"; el motor de scripts interpreta el script, traduce los nombres de objeto a su formato interno y luego los manda a la aplicación objetivo. los conceptos ttecnologics que son? son necesidad,clasificación ect.

La metáfora del "Lenguaje natural"

Mientras que los Apple events son una manera de enviar instrucciones a las aplicaciones, Applescript es un lenguaje específico para generar Apple events. Manteniendo la tradición de Mac OS de sencillez de uso, el lenguaje Applescript está diseñado basándose en la metáfora del "lenguaje natural", de la misma manera que GUI está apoyado en la metáfora de escritorio. Los programas de Applescript son generalmente leíbles y editables por cualquiera. Está basado en el lenguaje HyperTalk de HypeCard, y mejorado para que no solo pueda referirse al mundo de éste, sino que teóricamente puede referirse a cualquier documento. Para este fin, el equipo de Applescript introdujo el nuevo AppleEvent Object Model (Modelo de objetos AppleEvent o AEOM), el cual definía los objetos que cualquier aplicación conocía.

Generalmente AEOM definía un número determinado de objetos, como "documento" o "párrafo" y acciones que se podían hacer con ellos, como "cerrar" o "copiar". El sistema también definía las maneras de referirse a las propiedades de los objetos, de manera que se pudiera señalar al "tercer párrafo del documento 1", o al "color de la última palabra de la ventana activa". AEOM utiliza un diccionario para asociar los Apple Events a objetos comprensibles por las personas, permitiendo la traducción en ambos sentidos entre Applescript y los Apple Events. Para saber que elementos de una aplicación pueden ser objeto de scripts, se pueden consultar dichos diccionarios (en Xcode y el editor de scripts, por ejemplo).

Sintaxis

Hola Mundo

Resultado obtenido al ejecutar el programa.

El típico Hola Mundo se escribe en AppleScript con el siguiente código:

 display dialog "¡Hola mundo!"

El resultado obtenido al ejecutar el script es una nueva ventana como la que aparece en el margen.

Comentarios

Hay dos tipos de comentarios en AppleScript:

  • La sintaxis (* cuerpo del comentario *) permite escribir comentario en múltiples líneas.
  • El indicador -- sirve para escribir comentarios de una sola línea.
--Este comentario sólo puede ocupar una línea
#Este comentario sólo puede ocupar una línea
(* En cambio con este,
podemos usar múltiples líneas*)

Adicionalmente también podemos iniciar el script con la línea #!/usr/bin/osascript para poder ejecutar el archivo de texto como un ejecutable de Unix.

Variables y tipos de datos

Las variables no necesitan ser declaradas y no están fuertemente tipadas. Para asignar a una variable un valor determinado se pueden usar dos métodos:

 set nombreDeLaVariable to valorDeLaVariable
--o
copy valorDeLaVariable to nombreDeLaVariable

El nombre de las variables no es sensible a mayúsculas, por lo tanto mivariable y MiVariable son equivalentes. Los nombres de las variables pueden contener letras de la a a la z, excluyendo la ñ, números y el carácter _.

Los tipos básicos en AppleScript son:

  • Booleano
  • Número
  • Texto: Es una serie de caracteres Unicode
  • Registros: es un conjunto no ordenado de etiquetas con un valor asociado.
  • Lista: Es un conjunto ordenado de valores, no necesariamente del mismo tipo.

Ejemplos de estos tipos son:

--Booleanos:
set verdad to true
set falso to false

set numero to 10 --numero es de tipo Número

set texto to "Esto es un texto"

set lista to {valor1, valor2, valor3} --Los distintos valores están separados por comas

set registro to {etiqueta1 : valor1, etiqueta2 : valor2} -- La etiqueta es un identificador único que precede al valor

Los tipos de datos se pueden cambiar para ello se usa:

valorDeTipo1 as tipoFinal

El valor que devuelve esta expresión es la representación de tipo tipoFinal del valor valorDeTipo1. Por ejemplo:

2 as text -- devuelve "2"
true as text -- devuelve "true" 
"3.14" as number --devuelve 3.14

--También hay conversiones imposibles:
"texto" as number --Provoca un error

Funciones

Las declaraciones de funciones en AppleScript, llamadas handlers, pueden tener varias formas:

on nombreDeFuncion for parametric
    (*
    cuerpo de la función
    *)

    --si queremos que devuelva un valor:
    return resultado
end nombreDeFuncion

--Para llamar a la función se usa:
nombreDeFuncion for unaVariable

Se puede cambiar la palabra for por una de las siguientes : about, above, against, apart from, around, aside from, at, below, beneath, beside, between, by, for, from, instead of, into, on, onto, out of, over, since, thru (o through), under. Se pueden definer funciones con múltiples parámetros, usando para ello varias de las palabras listadas anteriormente, distintas para cada parámetro.

on fraccion for numerador over denominador
    return numerador / denominador
end fraccion

Las llamada a las funciones se puede hacer con los parámetros en distinto orden al declarado:

fraccion for 12 over 24
fraccion over 24 for 12
--Las dos llamadas son equivalentes y devuelven 0.5

Las funciones se pueden declarar también con parámetros posicionales:

on nombreDeFuncion(parametro1, parametro2)
    --cuerpo de la función
end nombreDeFuncion

Para que la función no necesite parámetros se escriben solamente los paréntesis, sin nombres entre ellos. También se pueden definir las funciones cambiando el on por to

Funciones especiales

Cuando se guarda un script como aplicación hay 4 funciones que se pueden declarar para que esta tenga ciertos comportamientos:

Run

Es la función que se llama automáticamente al ejecutar un script o al lanzar un script guardado como una aplicación. Se puede definir de dos maneras:

  1. Si en el script hay escritas varios comandos, sin que estos estén dentro de declaraciones de funciones o de objetos script, la función run está ya declarada implícitamente.
  2. Se puede definir explícitamente como una función cualquiera, aunque entonces no puede haber comandos fuera de declaraciones de funciones o de objetos script.:
on run args 
    --comandos a ejecutar
end run
El parámetro args es opcional y sirve para pasar parámetros al inicio, por ejemplo ejecutándolo desde la línea de comandos.

Open

El script recibe la orden de ejecutar la función open cuando el usuario arrastra archivos hasta el icono de la aplicación, pasándole como argumento una lista de alias a los archivos arrastrados.

on open nombresDeLosArchivos 
    --comandos a ejecutar
end open

Idle

Al guardar como aplicación se puede seleccionar la opción Dejar abierto. Esto hace que cada 30 segundos, por defecto, se mande a la aplicación la orden de ejecutar la función idle. El tiempo que pasa entre las llamadas a la función se puede cambiar con el valor que devuelve la función: tiene que ser un entero y representa el tiempo en segundos entre llamadas, para el valor por defecto se devuelve 0.

on idle
    --comandos a ejecutar
    return numeroDeSegundos
end idle

Quit

La función quit es llamada cuando la aplicación recibe la orden de cerrarse. Si durante la ejecución aparece el comando continue quit se sale de la aplicación, pero, si se encuentra un return o la función acaba antes de encontrarlo, no se cierra la aplicación.

on quit
    --comandos a ejecutar
    if condicion then 
        continue quit
    else
        return
    end if
end quit

En este caso solo se saldría de la aplicación si condicion es verdadero.

Estructuras

Condicionales

Al igual que en otros lenguajes de programación hay dos tipos de sentencias condicionales:

--Condicional simple:
if condicion then 
   --Sentencias a ejecutar
end if

--Condiciones compuestas:
if condicion1 then
    --Cuerpo de la primera condición
else if condicion2 then
    --Cuerpo de la segunda condición
else
    --Cuerpo que se ejecuta si no se cumplen la condiciones anteriores
end if

Bucles

Hay varios tipos de bucles:

  • Bucles que no evalúan una condición:
--Bucle infinito:
repeat
    --Sentencias a ejecutar
end repeat

--Bucle que se repite n veces:
repeat n times
    --Sentencias a ejecutar
end repeat
  • Bucles que evalúan una condición:
--Bucle que se repite mientras la condición sea verdadera
repeat while (condicion)
    --Sentencias a ejecutar
end repeat

--Bucle que se repite hasta que la condición pasa a ser verdadera
repeat until (condicion)
    --Sentencias a ejecutar
end repeat
  • Bucles que iteran con una variable
--La variable toma valores enteros desde uno inicial hasta el final
repeat with i from primerValor to valorFinal
    --Sentencias a ejecutar
end repeat

--La variable toma los valores de cada uno de los elementos de la lista
repeat with i in lista
    --Sentencias a ejecutar
end repeat

Bloque tell

El bloque tell tiene dos variantes:

--Forma simple
tell destino to accion_a_realizar

--Forma compuesta
tell destino
    --Sentencias a ejecutar
end tell

El bucle tell ejecuta las sentencias de acuerdo a las funciones y propiedades definidas en el objeto destino. Este último puede ser de tipo application, document o de tipo script, normalmente definido por el usuario, entre otros.

Por ejemplo se puede utilizar para abrir una nueva ventana del Finder:

tell application "Finder"
	make new Finder window
end tell

Tratamiento de errores

Cuando se produce un error durante la ejecución de un script se para el proceso. Para evitarlo y poder continuar con la ejecución se usa el siguiente código:

--Método simple:
try
    --Sentencias que pueden provocar errores
end try
--Método compuesto:
try
    --Sentencias que pueden provocar errores
on error descripcion number n
    --Sentencias a ejecutar si aparece un error
end try

Cuando aparece un error se pasa a error un texto que describe el error,descripción, y un número que identifica el tipo de error, n. Por ejemplo al ejecutar el código:

try
	"test" as boolean
on error descripcion number n
	display dialog descripcion
	display dialog n
end try

La descripción del error es "No es posible convertir "test" en tipo boolean." y el número de error es -1700

También se pueden usar sentencias para marcar un error, lo que para la ejecución del código a no ser que esté dentro de bloque try. La sintaxis es la siguiente:

error descripcionDelError number numeroDeError

Software

Software para editar AppleScript

  • Xcode: Permite editar scripts como archivos de texto y tiene una plantilla definida para crear aplicaciones escritas en AppleScript.[1]
  • Editor AppleScript: viene incluido en Mac OS X y permite editar script y guardarlos como aplicaciones independientes, script compilados o ficheros de texto. También permite ver las funciones y propiedades definidas en las aplicaciones que se pueden controlar mediante AppleScript.
  • Existen varios comandos para la Terminal de Mac OS X que permiten ejecutar scripts:
    • osascript ejecuta un script:[2]
      osascript rutaAlScript
      

      O una sentencia:
      osascript -e sentencia
      
    • osacompile compila un script creando un archivo con extensión «.scpt»:[3]
       osacompile rutaAlScript
      

Software controlable mediante AppleScript

La mayoría de aplicaciones desarrolladas por Apple pueden ser manejadas con AppleScript, por ejemplo:

  • Finder
  • iTunes
  • Xcode
  • Safari

Referencias

  1. «AppleScript en Xcode» (en inglés). Consultado el 8 de julio de 2012. 
  2. Apple Inc. «osascript(1) Mac OS X Manual Page» (en inglés). Consultado el 8 de julio de 2012. 
  3. Apple Inc. «osacompile(1) Mac OS X Manual Page» (en inglés). Consultado el 8 de julio de 2012. 

Bibliografía

Apple. «AppleScript Language Guide» (en inglés). Consultado el 6 de julio de 2012.