APPLESCRIPT (revisado el 21/03/2003)
¿Qué es "AppleScript"?
La descripción más rápida que se me ocurre, es "el lenguaje de programación que, en relación al esfuerzo que cuesta aprenderlo, es el más poderoso que existe para macintosh". Por supuesto, hay lenguajes mucho más potentes, como C++. Pero AppleScript es sencillísimo de aprender y es capaz, él solito, de manejar todas las rutinas de nuestro ordenador, de mandar órdenes a todos los programas para que actúen así o asá y, al fin, de solucionarnos la vida con el mínimo esfuerzo (que es de lo que se trata este lenguaje).

Yo empecé a trabajar en una editorial en el '99. Utilicé un mac por primera vez en mi vida. Allí se funcionaba fundamentalmente con Quark, y luego también Adobe Acrobat. Pronto me cansé de andar siempre haciendo lo mismo. Si, por ejemplo, me daban un texto desde Word y tenía que maquetarlo, me tiraba dos horas haciendo búsquedas y reemplazos para limpiar el texto, otras dos horas para aplicar los estilos, y así todo.
Ya no sé de qué manera me dí cuenta de que existía AppleScript. Creo que dí por casualidad con la página de Sal Soghoian, actualmente AppleScript Manager de Apple y uno de los más importantes applescripter de Quark que ha conocido la historia. Allí había algunos scripts que me servían para ahorrar algo de tiempo. Y, por lo poco que leí, parecía que podía hacerse cualquier cosa con el lenguaje en cuestión.
Mi paso más importante fue abrir el primer script (después de haberlo hecho correr, claro). Allí había unas simples palabrejas en inglés que parecían una descripción de lo que hacía el programa, más que el código en sí. Decía cosas del tipo «tell application "QuarkXPress"», «display dialog "Do you wish continue?..."».
Vamos, en resumen, que las cosas se hacen haciéndolas y que, aproximadamente el 90% de los script que uno hace funcionan sólo en su ordenador, porque son cosas que le solucionan a uno la vida. ¿Quién no ha hecho el típico script de ejemplo de vaciar la papelera o imprimir un documento?


Digamos que, por poner un ejemplo, el típico primer script importante del que está aprendiendo puede hacer cosas absolutamente personalizadas, como "dile al Outlook Express que me mire el correo. Si hay algún mensaje, notifícamelo, pero antes vacía la bandeja de entrada, archiva los mensajes antiguos, mira a ver si tengo algo en mi carpeta de documentos pendientes en el Escritorio, y haz lo que diga en ellos. Luego te vas a leer el documento llamado 'canciones.txt' que tengo en el Escritorio, y te las descargas con el Interarchy. Y luego, apaga el ordenador y vete a dormir.". Lo cual quiere decir que, si tenemos costumbre de hacer todas estas cosas antes de apagar, y nos llevan media hora, ahora ¡¡¡podemos darle a un botón e irnos a dormir media hora antes!!!
Parece que Apple va a seguir en la brecha con este lenguaje "casero", porque más que nunca se nota su presencia en la lista de correo, y cada vez facilita más el camino a los desarrolladores independientes de software para que hagan sus aplicaciones "escriptables". Por ejemplo, varias de las aplicaciones más importantes en el mundo de la edición, como Photoshop e Indesign, han sacado un plug-in especial para hacer sus aplicaciones altamente "escriptables". Macromedia hizo también lo propio en su día con Freehand y su Xtra de AppleScript; Quark ha seguido desarrollando la "escriptabilidad" de su producto (con menos que más fortuna, a juzgar por lo que se comenta sobre Quark 5)*, sacando incluso un menú de scripts; y así viene ocurriendo últimamente con productos muy poderosos, como el Outlook Express y el Entourage de Microchof, el BBEdit y el MailSmith de BareBones, y un larguísimo etcétera.

* Acaba de salir el pre-release de Quark 6, después de AÑOS de espera, la versión para Mac OS X. Como toda beta, es bastante inestable... Pero si funciona bien la versión final, puede ser impresionante, porque tiene un diccionario de casi 50 páginas!

Recuerdo que en mi antiguo trabajo había un viejo mac, que apenas si podía con el OS 8, y que estaba tirado en un rincón. Recuerdo que hice un par de scripts que servían sólo para imprimir documentos de manera automática, y recuerdo también que hubo una época en que yo producía el triple que cualquier empleado (aunque eso no subió mi sueldo, sino que me trajo malos rollos y envidias tontas).

Cómo funciona AppleScript: Apple Events
AppleScript es un lenguaje de script, como puedan serlo Perl o el mismo JavaScript. Así como los elementos de JavaScript son los elementos del navegador, o los de ActionScript los objetos de Flash, la peculiaridad de AppleScript reside en que sus objetos son "cualquier cosa que pertenezca al sistema": documentos, aplicaciones y sus contenidos, etc. En general, casi cualquier cosa que hacemos en el ordenador, se puede replicar con unas líneas de código: vaciar la papelera, escribir un mail, imprimir unos documentos... Todo (¡o casi!).



Dicho de una manera simple, las flechitas rojas de la figura son los "apple event". O sea, unos pequeños comandos que entienden las aplicaciones, que contienen instrucciones precisas acerca de "lo que yo quiero que haga". Los "apple event" es la manera que tienen los programas de relacionarse unos con otros, y AppleScript tiene total autoridad en este campo.
Según está definido en la tabla de Apple Events, cada uno de ellos consta de "class" (a qué tipo pertenecen) un de un "id", una identidad, representados ambos por cuatro letras. El "class" es el que suele agruparlos en "Suites" (o sea, grupillos), aunque sólo sea en teoría. Por ejemplo, los eventos de tipo "core" son aquéllos que podríamos llamar "estándar", como, por ejemplo en el "Finder"; «event coredelo» (delete, borrar) o «event corecnte» (count, contar).
Los cuatro eventos más básicos que acepta toda aplicación son run, open, print y quit (aevtoapp, aevtodoc, aevtpdoc, aevtquit), y éstos los manda directamente el Finder. O sea que, aunque una aplicación no sea "scriptable" (esto es, que no le podemos enviar eventos directamente), podemos pedirle al Finder que lo haga él.
Para resumir, cuando ejecutamos un script, éste es gestionado directamente por la extensión o componente "AppleScript", que ejecuta lo que dice el código.

Hay muchos eventos "escondidos", no definidos por nadie, que hacen cosas muy útiles y que, como diría Paul Bertkowitz, descubrir uno de ellos hace las delicias de cualquier applescripter. Más adelante veremos alguno de estos eventos "secretos".

Pero AppleScript no puede manipular todas las aplicaciones. Correcto. Así es. Para que una aplicación haga caso a AppleScript, tiene que ser "scriptable". La manera más rápida de saber si una aplicación lo es o no, es dejar caer su icono sobre el icono de un editor de scripts. Si es "scriptable", se abrirá de inmediato su "diccionario", que contiene los comandos que acepta, y que AppleScript puede emplear para comunicarse con ella.
Aún así, casi siempre hay una manera de manipular una aplicación, aun cuando ésta no sea escriptable. ¿Cómo? A través de simulaciones de teclado, o de manipular sus menús. En sistemas anteriores al OS X, existían varios "osaxen" o "adiciones de script" (veremos más adelante qué son) capaces de simular el tecleo. El clásico ejemplo de su uso era abrir el "SimpleText", simular la pulsación de Comando + N (nuevo documento), y luego la de "eres un kapullo", y luego la de Comando + S (guardar). También existía una herramienta magnífica, llamada "PreFab Player", que hacía lo mismo, y llegaba allí donde no llegaban los demás: menús, botones, pop-up, manejo de diálogos modales, etc.
En OS X tenemos, recién salido del horno, el nuevo experimento de Apple, llamado "UI Scripting". Básicamente, es lo mismo que era PreFab Player, a través de "System Events" (una aplicación que viene instalada por defecto), pero sólo es capaz de acceder a elementos de aplicaciones basadas en Cocoa (con Carbon no suele funcionar). Eso sí, lo hace muy bien (teniendo en cuenta que es una beta), y puede acceder a absolutamente todos los elementos de la visibles de la aplicación.
También tenemos Extra Suites, de Kanzu software, que puede simular tecleos, y más cosas interesantes.

En fin, una ventaja de AppleScript es que cuenta con muchas ayudas externas ;-)

La sintaxis de AppleScript es, por lo general, sencilla e intuitiva, aunque hay algunos programadores que lo hacen realmente difícil... Pero por lo común, son órdenes en inglés legible y con parámetros comprensibles. Por ejemplo:

read file "mi disco:mi carpeta:mi documento" from 1 to 20

Devolverá como resultado los primeros 20 caracteres contenidos en el documento "mi documento", contenido en la carpeta "mi carpeta" del disco "mi disco".
Esto mismo, traducido al castellano, sería algo así como:

lee el archivo "mi disco:mi carpeta:mi documento" desde 1 hasta 20

Sencillo, ¿no? ¡No hace falta un doctorado!

En cuanto al DOM (Document Object Model), como se llama en otros lenguajes, también suele ser sencillo. Por ejemplo, una aplicación contiene documentos, que contienen texto, que contienen palabras, que contienen letras. El clásico ejemplo para Mac OS X:

tell application "TextEdit"
   tell document 1
      tell paragraph 2
         get word 1
      end tell
   end tell
end tell

--> devuelve la primera palabra del segundo párrafo del primer documento: "naniero"

Aunque, más precisamente, diríamos que una aplicación contiene objetos con propiedades. Por ejemplo, podríamos haberle pedido a "TextEdit" que nos dijera el tamaño de letra de dicha palabra diciendo "size of word 1", y nos habría devuelto su tamaño, en forma de número real: 12.0. O podríamos preguntarle cuántas letras tiene con "count characters of word 1": 7.
En JavaScript, si hay por aquí algún javascripter, y para trasladar el ejemplo, podemos preguntar por el número de letras que hay en el campo de texto de un formulario:

document.forms[0].elements[0].value.length // --> 7

Y en un script de la shell, el tamaño en bytes de un documento:

wc -c /Users/yomismo/doc.sit
--> 43557 /Users/yomismo/doc.sit

Aunque ahora que lo pienso, éste último ejemplo no tiene nada que ver. ¿Qué se le va a hacer?

¿Qué vamos a explicar por estos lares?

- No es mi/nuestro trabajo profesional hacer introducciones a AppleScript.
- Por tanto, haré/mos lo que me/nos dé la gana, y pararé/mos cuando me/nos canse/mos.
(de ahora en adelante, hago demagogia y hablo en nombre de todo el que participe en esto, tomando el todo por el uno)
- Explicaré sólo aquéllo que más me interese. Intentaré entrar en algunos conceptos básicos, partiendo de la base de que esto está dirigido a gente que, como yo hace tiempo, nunca en su vida había programado nada en absoluto. No obstante, también hablaré de cosas más "complicadas" (procuraré hacer referencias a documentos que puedan clarificar los contenidos).
- Ahora mismo estoy trabajando en un OS 8.6 con AppleScript 1.3.7, lo cual quiere decir que habrá algunas cosas que queden obsoletas sin más tardar (en el momento de revisar este documento, ya estoy con un OS X 10.1.4, AppleScript 1.8.2b3).* Sin ir más lejos, las cosas parecen haberse descontrolado a partir del OS 9.2.2, donde ya no funcionan algunos comandos clásicos de toda la vida, como "open for access" o "list folder". Además, supongo que el OS X cambia muchos conceptos. También espero (cuando pueda descubrirlo por mí mismo) que AppleScript Studio dé un paso muy importante para los desarrolladores. No obstante, los conceptos básicos son los conceptos básicos, y eso es lo que más me importa ahora.
- Tampoco me explayaré en cosas que crea que están muy bien explicadas en otros sitios.
- También, emanando de la primera razón, y como extensión de la segunda, diré sin previo aviso, e indiscriminadamente, "culo", "polla", "koño", "joder", "cáspita", etc.

* Ejem, ahora es un OS 10.2.4, AS 1.9.1