Capítulo 12. Recorriendo las tarjetas

Con el objetivo de exportar el contenido del primer tutorial de MetaCard a un fichero para facilitar la traducción de su contenido a otro idioma o el estudio sobre papel de los tutoriales, se ha propuesto un ejercicio de creación de una pila dedicada exclusivamente a recorrer los components de una pila dada para ir accediendo a los contenidos de la misma.

Se nos ha pedido que se describa el proceso y que se escriba el código correspondiente a un único control que realice el proceso manteniendo el formato (para lo cual se utilizará la propiedad htmlText) del texto de los controles "Title" e "Instructions".

Como punto de partida se nos ha impuesto una simple pila como la mostrada en la Figura 12-1 para que sirva como contenedor de tota la lógica y que ofrezca un único botón para realizar la tarea.

Figura 12-1. No se espera un lujo de detalles en la interfaz, así que se propone una muy austera para acometer la tarea presente.

Importante: En principio, no tenemos permisos para modificar la pila del tutorial, aunque prometo que se puede hacer y lo haremos, pero será un poco más adelante. Así que tendrá que crear una pila donde situar los objetos y el código que desarrollemos.

Figura 12-2. Ejemplo de inclusión de los controles que permiten reescribir el tutorial: el título i el principio de los contenidos de esta tarjetas ya están traduciodos.

En segundo lugar, tengo mis dudas respecto a si habrá leído los textos que he recomendado mientras exaltaba las posibilidades de MetaCard. Así que si Vd. reune todo el texto en una variable, yo le contaré cómo lo lleva a un fichero con una sóla instrucción.

Vamos a resolver el problema de forma incremental. Para ello vamos a proponer un planteamiento descendente: un esbozo o aproximación que divida el problema general en otros menores. De esta manera, reformularemos el enunciado en una forma que nos permita ir resolviendo etapas de modo que, al final del recorrido, tengamos una posible solución:

  1. Así, a primera vista y delante del tutorial en ejecución, parece que habrá que visitar todas las tarjetas de la pila. Habrá que buscar un ejemplo de código que nos permita recorrerlas.

  2. Acumulando los contenidos de los campos de texto indicados a una variable, después podrá copiarlos de allí a un fichero. Aunque sea volcando esta en un campo de texto y, a golpe de ratón, seleccionando el texto y copiándolo en otra aplicación.

  3. Aunque se ha nombrado la propiedad a utilizar puede que no la conozca será interesante preguntar por ella en la ayuda en línea. Además le llevará a la propiedad text y puede servir para confirmar cómo se hace

  4. A la vista de lo expuesto, parece suficiente con disponer de una pila nueva, un botón para situar el codigo y un campo de texto donde dejar los resultados. Dejo a la elección del lector escoger los nombres para estos controles. Si no sabe cómo crearlos, le aconsejo que revise antes el tutorial que estamos a punto de hackear.

Veamos qué se puede hacer al respecto de los puntos expuestos, en el orden inverso, puesto que la magnitud de las tareas parece más sencillo:

  1. En una primera aproximación deberá recordar cómo se accede a los contenidos de un campo de texto. Por ejemplo situándose en la primera tarjeta del tutorial indicado y viendo con el "Control Browser" que existen esos dos campos en todas las tarjetas y que lo que desea recuperar es únicamente su cotenido textual, lo que se puede leer en cada una de las tarjetas. Desde la "Message Box" puede probar con el código siguiente

    put the text of field "Title
                           
  2. Así, a bote pronto, puede que no sepa cómo recorrer las tarjetas, pero recuerde que en el segundo de los tutoriales movía un objeto por entre los puntos de un gráfico que había ocultado. De alguna forma similar puede que encuentre una referencia o ejemplo al caso que nos ocupa. Si lo repasa, verá que allí se hacía un recorrido con un bucle repeat y un contador inicializado a "the number of lines in pathpotins". Pero en este caso no tenemos líneas sino tarjetas y no pertenecen a una variable, sino a la pila. Vaya, mala suerte. Pero en fin, ya que estamos aquí, por si acaso probemos. Lo haremos desde la "Menu Bar" y así si no funciona no habremos perdido mucho tiempo. Así que veamos cómo anda de inglés y pregunte por cuáántas tarjetas tiene la pila:

    put the number of cards of this stack
                          

    Como he propuesto al principio, si está trabajando en un pila auxiliar habrá de indicar a qué pila se refiere, de no ser así ese código le indicará el número de tarjetas de la pila actual, seguramente, aquella en la que está desarrollando el código; que habrá sido la última en estar activa antes de ir a la "Message Box". Esto puede resolverlo indicando su nombre:

    put the number of cards of stack "Application Tutorial"
                          

    Puesto que ha funcionado, tenemos resuelto el tema de recorrer la pila:

    on mouseUp
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the text of field "Title" && \
                field "Instructions" of stack "Application Tutorial"
        end repeat  
    end mouseUp
                          
  3. Casi lo hemos conseguido, ha aparecido texto, pero en la "Message Box". Habrá que guardarlo en una variable (yo la llamaré varAux). Estas se pueden declarar sobre la marcha, en casos sencillos y consultando la ayuda de la orden put verá que se redirecciona a una variable si se le indica, si no (por defecto) se envia el resultado de su ejecución a la omnipresente "Message Box":

    on mouseUp
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the text of field "Title" of stack "Application Tutorial" into varAux
          put field "Instructions" of stack "Application Tutorial" into varAux
        end repeat  
    end mouseUp
                           

    Ah, perdón lo olvidaba, así no se ve lo que contiene la variable. Yo había prometido decirle cómo lo envía a un fichero. Bueno pues, vamos allá aprovechando para incializar la variable que es una buena costrumbre.

    on mouseUp
        put the short name of stack "Application Tutorial" into varAux
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the text of field "Title" of stack "Application Tutorial" into varAux
          put field "Instructions" of stack "Application Tutorial" into varAux
        end repeat  
      put varAux into URL("file:tmp.txt")
    end mouseUp
                               

    En el directorio de trabajo (el directorio actual) aquel donde está guardando la pila, que no dudo que lo ha hecho ya. Encontrará un fichero tmp.txt que puede ver con cualquier editor de texto e incluso con las órdenes de su sistema operativo en un terminal o en la pantalla.

  4. Casi lo hemos conseguido, ha aparecido texto, pero poco y parece que son las instrucciones de un única tarjeta. ¿Qué ha sucedido? Pues me temo que ha funcionado correctamente, sólo que al no indicar otra cosa, se busca en la tarjeta por defecto (la que esté visible) y siempre ha sido la misa. Habrá de indicar el "nombre" completo de los objetos, haciendo referencia a la tarjeta a la que se refiere:

    on mouseUp
        put the short name of stack "Application Tutorial" into varAux
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the text of field "Title" of card i of stack "Application Tutorial" after varAux
          put field "Instructions" of card i of stack "Application Tutorial" after varAux
        end repeat  
      put varAux into URL("file:tmp.txt")
    end mouseUp
                           
  5. Esto ya está, permítame que lo decore un poco para que se lea más fácilmente. Sólo son dos toques de maquillaje, nada demasiado transcendente, excepto que nos gustan las cosas bien acabadas y si hay tiempo no lo vamos a dejar sin hacer, ¿verdad?.

    on mouseUp
        put the short name of stack "Application Tutorial" & return into varAux
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the text of field "Title" of card i of stack "Application Tutorial" &\
                  return after varAux
          put the text of field "Instructions" of card i of stack "Application Tutorial" &\
                  return  after varAux
        end repeat  
    end mouseUp
                            

    Ah, perdón lo olvidaba. El enunciado decía el htmlText, bueno ... Tranquilo, esto será rápido.

    on mouseUp
        put the short name of stack "Application Tutorial" & return into varAux
        repeat with i = 1 to the number of cards of stack "Application Tutorial"
          put the htmlText of field "Title" of card i of stack "Application Tutorial" & return after varAux
          put the htmlText field "Instructions" of card i of stack "Application Tutorial" & return  after varAux
        end repeat  
      put varAux into URL("file:tmp.html")
    end mouseUp
                            

    En el mismo directorio donde ha ido salvando periódicamente la pila construida encontrará un fichero tmp.html que puede abrir con su navegador habitual. El código HTML es mejorable, pero esa es otra historia ...

Conclusiones

Puesto que no hay restricciones, ni imposiciones al respecto podemos fijar cosas como el nombre de la pila o del fichero a tratar. En el código se impone pues el valor que indica cada uno de estos factores. De hecho tiene una restricción importante y es que la pila del tutorial ya debe estar abierta.

Pero claro podríamos dotar este código de más flexibilidad y en la la sección de nombre Pilas (stack) y subpilas en Capítulo 4 se comentan detalles que pueden servir para ello respecto a la elección de la pila y en la la sección de nombre Cajas de diálogo predefinidas en Capítulo 5 se pueden encontrar los ejemplos de código que emplean las cajas de diálogo estándares para implementar esta opción..

Este ejercicio nos ha permitido, entre otras cosas, obtener una versión HTML para poner en la Web la ayuda de MetaCard , así como otra en PDF para poder consultarla y aprender mientras "viaja en el tren". De todas formas, veremos una nueva implementación de este planteamiento para llevar a la Web estos tutoriales en el Capítulo 16.