Curso Applescript: Delimitadores de texto, por Julifos

No se sabe muy bien por qué esta cosa tan simple dispone de un apartado para sí sola, pero bueno, ahí está porque es un concepto muy importante.

Primero la teoría

Un “text item delimiter” queda mejor definido en inglés macarrónico: texto ítem delimitador; o ítem de texto que delimita: el elemento que separa a un elemento de otro. En la escritura normal y corriente (olvidémonos por un momento de AppleScript), se puede decir que el “cacho de texto” más pequeño es un carácter. Por ejemplo, la letra “a”.

En este caso (y nos acercamos al concepto), el delimitador de texto que separa la una unidad de otra es, precisamente, la ausencia de cosas (o sea, que entre la “k” y la “a” de “kapullo” no hay nada). Esto se representa en AppleScript como un “single empty item list” o lista vacía de un sólo item de texto:

{“”}

Ese viene a ser el delimitador de texto universal que utiliza AppleScript y que suelen utilizar todas las aplicaciones. Por tanto, siendo el delimitador {“”}, ¿cuántos ítem de texto (unidades) tendría la palabra “kapullo”? Siete:

{“k”, “a”, “p”, “u”, “l”, “l”, “o”}

Cuando estamos pidiendo los “text items” de un texto cualquiera, se nos devuelve, como es lógico, una lista de los ítem de mínima longitud posible, teniendo en cuenta cuáles son los delimitadores de texto.

Como vemos, esto es muy parecido a la realidad, pero hay un problema muy gordo: nosotros decidimos cuáles son los delimitadores de texto. Ahora el concepto de palabra es subjetivo, porque el mismo “espacio en blanco” no tiene por qué separar “palabras”, ni una frase tiene por qué llevar al final un signo de puntuación. Eso lo decidimos nosotros.

set AppleScript’s text item delimiters to “ka”

set k to text items of “kapullo”

set AppleScript’s text item delimiters to {“”}

k

Si miramos el resultado, podemos ver una lista con los “cachos” de texto que tiene la “palabra” “kapullo” cuando el delimitador de texto no es {“”}, sino “ka”:

–> {“”, “pullo”}

El cacho número uno es “”. Y “” es la ausencia material de algo que existe metafísicamente: el delimitador de texto “ka”.

Cuando los delimitadores de texto eran {“”}, lógicamente no podía haber una existencia metafísica, puesto que no puede darse la ausencia de la ausencia. Y ya nos estamos poniendo tontos con el temita…

Esta chorrada adquiere sentido cuando notamos que la “ausencia” no denota la desaparición, sino más bien una presencia bien real.

Hemos visto que yo puedo “desensamblar” la palabra “kapullo” en siete cachos, con sólo pedírselo (o más bien, exigírselo) a AppleScript:

text items of “kapullo”

–> {“k”, “a”, “p”, “u”, “l”, “l”, “o”}

Y, como es lógico, puedo volver a “ensamblar” el texto:

{“k”, “a”, “p”; “u”, “l”, “l”, “o”} as text

–> “kapullo”

Ahora hemos de notar que los delimitadores siguen ahí, intactos, entre las “unidades mínimas” de texto. Y vamos a constatar que pasa lo mismo, sean cuales sean los delimitadores de texto:

set AppleScript’s text item delimiters to {“ka”}

set k to text items of “kapullo”

set k to k as text

set AppleScript’s text item delimiters to {“”}

k

–> “kapullo”

Pues sí. Aquí está más claro. Los delimitadores, de hecho, existen. Están ahí, aunque no los veamos. Al “desensamblar” el texto, “desaparecen” (cuando son “”, se convierten en …), y al volver a “ensamblarlo” siguen estando ahí.

Pues ya está la teoría. Una simple nota acerca de una cosa que puede no ser demasiado evidente. La declaración “AppleScript’s text item delimiters” (que vulgarmente se le dice TID) es una referencia a los delimitadores de texto que utiliza AppleScript, y es equivalente a la expresión “text item delimiters of AppleScript” y, cuando están fuera de un “tell block” (que no estamos dentro de otra aplicación), también se vale de decir “my text item delimiters”, siendo “my” el más profundo “yo”, AppleScript, “yo que me ejecuto y que me llamo AppleScript”. Es más, podría decirse “text item delimiters”, a secas.

Si quisiéramos modificar o manipular los delimitadores de texto de otra aplicación (que no son más que una “constante” modificable), sólo tendríamos que decirlo y no habría ningún problema.

tell application “BBEdit”

 set text item delimiters to “BBEdit”

end tell

Asimismo, y para terminar, hago notar que siempre que se manipulan los delimitadores de texto, para realizar alguna operación, una vez terminada ésta se suelen volver a dejar como estaban, para no dar problemas. Imaginemos, si no, qué pasaría si nuestros delimitadores fueran “H” y requiriésemos el nombre del disco de arranque, que se llama “HD”. Vamos, un desastre.

Y después, la práctica

¿Para qué sirven los malditos delimitadores? Pues para nada, o para mucho, según el caso que les hagamos. Ahora que lo acabamos de mencionar, voy a poner un ejemplillo que viene al caso. ¿Cómo podemos obtener el nombre del disco de arranque? Como es evidente, YO SÉ el nombre de MI DISCO, pero estoy desarrollando una aplicación para miles de millones de compradores de mi producto, y ellos esperan de mí que yo sepa cuál es el nombre de su disco de arranque.

Veamos diversas maneras de hacerlo:

set x to name of (info for (path to startup disk))

Esto es muy profesional. Sé que existe el comando info for, de las “adiciones estándar” y que de ahí puedo extraer el nombre. Y que hay otro comando, también de las “adiciones estándar”, que sirve para obtener un alias del disco de arranque.

Lo más probable es que el cliente se enfade y nos mande a tomar por el @#¢?, porque este método es lentísimo. No sé qué es lo que hace exactamente cuando requiere información, pero cuando se trata de un disco, debe de ponerse a contar el número de ítems que contiene, y todo ese tipo de cosas. Si el volumen es grande, puede tardar varios minutos en devolver la información (¿qué pasará cuanto todo el mundo tenga discos de 100 GB?).

Mejor vamos a pensar en otra cosa.

tell application “Finder”

 set x to name of first item

end tell

De pura chamba sabemos que el primer “item” es el disco de arranque. Nos hemos enterado en algún sitio o lo hemos copiado de otro applescripter. Da igual. En cualquier caso, devuelve el resultado, y lo hace muy rápido.

Y ahora, la última prueba:

set AppleScript’s text item delimiters to “:”

set x to text item 1 of (path to startup disk as text)

set AppleScript’s text item delimiters to {“”}

¡Uf! ¡Vaya! ¡Qué casualidad! Esto de los delimitadores de texto hace exactamente lo mismo, pero muchísimo más rápido, y sin tener que llamar al Finder.

Los delimitadores de texto se utilizan mucho para búsquedas y reemplazos. De hecho, casi única y exclusivamente para esto. Lo que acabamos de hacer es una búsqueda y reemplazo algo complicada, y hemos obtenido “todo aquello que haya antes de «dos puntos»”. Vamos a ver ahora el típico ejemplo:

set AppleScript’s text item delimiters to “ingenioso”

set x to text items of “Quiero decir algo ingenioso”

set AppleScript’s text item delimiters to “pero no sé qué”

set x to x as text

set AppleScript’s text item delimiters to {“”}

x

Esto devuelve, con tan sólo pensarlo un poco, la frase “Quiero decir algo pero no sé qué”, que tampoco es que sea demasiado ingeniosa, pero sirve para el ejemplo.

Y realmente lo único que hemos hecho ha sido reemplazar todas las ocurrencias de “ingenioso” con “pero no sé qué”. Vamos, que para manipular texto es fundamental controlar los malditos delimitadores y que, una vez controlados, las salidas que tiene son cada vez mayores.

Los restantes artículos sobe AppleScript se pueden encontrar en la categoría de Tutorial

0 0 votos
Article Rating
Subscribe
Notify of
0 Comments
Opiniones Inline
Ver todos los comentarios
0
Me encantaría saber tu opinión, por favor, deja un comentariox
()
x