Caso de estudio: una revisión de los tutoriales básicos

De cara a proporcionar un mejor entendimiento de las características de funcionamiento de MetaCard y a la vista de cantidad de elementos ya vistos, se incluye en este apartado un breve planteamiento a modo de repaso de lo visto hasta el momento. El tema a resolver es construir un mecanismo que permita la publicación en Web de los tutoriales básicos vistos en la la sección de nombre Tutorial sobre aplicaciones en Capítulo 1 y la la sección de nombre Tutorial sobre presentaciones en Capítulo 1: se define una posible estructuración de los contenidos de los tutoriales de "Aplicación" y "Presentación" encaminados a facilitar la traducción de los contenidos expuestos en un idioma diferente del original.

No se pretende realizar modificaciones a gran escala en los contenidos de los tutoriales. Sino, centrándonos en los dos primeros para los que existe un interfaz común y así no alejarnos del objetivo de este punto, ofrecer un modo cómodo y flexible de elaboración del texto que muestran para que sea sencillo tener los tutoriales en diferentes formatos.

La primera aproximación servirá para explorar el mecanismo, después hablaremos de cómo hacer esta exportación más atractiva visualmente y, quizás, puede que hasta más eficiente.

Por lo expuesto hasta ahora, el lector ya sabe que una pila, cualquiera de los dos tutoriales, es un conjunto de tarjetas apiladas una sobre otra, de las cuales soló se ve la primera (en ese orden de disposición. Cada una de estas tarjetas contendrá un número de elementos que, en el caso que nos ocupa, es conocido de antemano. Lo que sin duda facilitará el proceso. Deberemos, pues, recorrelas para obtener de cada objeto el texto que contiene y mostralo o guardarlo en un fichero.

La Figura 5-19 muestra el código correspondiente a un botón (que puede permanecer oculto) para este cometido. El resultado de su ejecución se podrá examinar en la "Menu Bar".

Figura 5-19. Recorrido de la pila "Application Tutorial".

on mouseUp
    put the short name of this stack & return
    repeat with i = 1 to the number of cards of this stack
      put the text of field "Title" of card i & return
      put field "Instructions" of card i & return 
    end repeat  
end mouseUp
            

Para que se pueda utilizar con posterioridad el texto extraído, podemos sugerir al usuario que escoja un archivo y guardar en este todo el texto. Aunque existe la opción tradicional abrir un fichero, escribir en él y cerrarlo; y siguiendo el lema de uno de los artífices de esta herramienta ("There is an easy, you know") aquí se propone un método mucho más directo, que se muestra en Figura 5-20.

Figura 5-20. Volcado a un fichero.

on mouseUp
    put empty into contingutFitxer
    put the short name of this stack & return after contingutFitxer
    repeat with i = 1 to the number of cards of this stack
      put the text of field "Title" of card i & return &\
          field "Instructions" of card i & return after contingutFitxer
    end repeat  
    ask file "Tria el fitxer on guardar el contingut del tutorial ..." with "tutorialApp.txt"
    if  it is not "Cancel" and it is not empty
     then
      put contingutFitxer into url ("file:" & it)
    end if
end mouseUp
            

Para cerrar este tema y aprovechando que el contenido de los campos de texto está formateado con elementos propios del lenguaje HTML que utilizan las páginas Web, es posible realizar unos cambios mínimos permitan obtener el resultado directamente en una página HTML. Esto se muestra en la Figura 5-21, donde por simplicidad del código se han obviado los detalles relativos a la correcta construcción del código HTML generado: esto es, etiquetas como HTML, HEAD, BODY, H1, etc.

Figura 5-21. Formateado en HTML del contenido de la pila.

on mouseUp
    put empty into contingutFitxer
    put the short name of this stack & return after contingutFitxer
    repeat with i = 1 to the number of cards of this stack
      put the text of field "Title" of card i & return &\
          the htmlText of field "Instructions" of card i & return after contingutFitxer
    end repeat  
    ask file "Tria el fitxer on guardar el contingut del tutorial ..." with "tutorialApp.txt"
    if  it is not "Cancel" and it is not empty
     then
      put contingutFitxer into url ("file:" & it)
    end if
end mouseUp
            

Sobre este mecanismo básico, se pueden introducir sencillas modificaciones para, por ejemplo, crear una página de índices o un código HTML más límpio. Cuestiones estas totalmente deseables para publicar los contenidos que nos ocupan.

De hecho, este mismo mecanismo con algunos retoques se puede utilizar para obtener la ayuda de MetaCard en formato HTML o un listado completo de todo el código de los objetos que componen una pila.

Como ejercicio se plantea la cuestión de facilitar modificaciones del texo a gran escala. Se refiere a ofrecer un modo cómodo y flexible de elaboración del texto que muestran, para que sea sencillo tener los tutoriales en diferentes idiomas. El mismo mecanismo también debería permitir la ampliación y actualización de los mismos.

Sugerencia: El siguiente código es una aproximación muy básica, pero operativa y ampliable que se propone como primer paso de cara a resolver el planteamiento anterior. Es el código de un par de botones que se pueden añadir a las pilas que implementan los tutoriales (pero no se debe olvidar que podría ser llevado a otras aplicaciones con un modelo repetitivo de interfaz con los cambios pertinentes), de manera que uno guarda el contenido presente del texto en la aplicación.

La parte importante de este código es que reune en un sólo fichero todo el texto (incluyendo las etiquetas que dan formato al mismo en MetaCard) permitiendo su edición en cualquier editor ASCII. La convención utilizada para separar contenidos en este fichero es una de las más simples: utilizar una cadena de texto que no aparezca en el original y utilizarla como marcador, por lo que todo el fichero es una secuencia repetitiva de:

  • Una línea con el título de una tarjeta.

  • N líneas con las instrucciones de cada paso del tutorial

  • Una línea de "fin de tarjeta" que contiene la secuencia "###"

El planteamiento se ha procurado que contenga elementos abiertos para su posterior ampliación o adaptación a otras situaciones y que permita la experimentación en el caso presente.

#button "guardarContinguts"
on mouseUp
  ask file "Tria el fitxer on guardar el contingut del tutorial ..." with "tutorialApp.html"
  if  it is not "Cancel" and it is not empty
  then
    put  empty into url ("file:" & it)
    repeat with i = 1 to the number of cards of this stack
      put the htmlText of field "Title" of card i & return after url ("file:" & it)
      put the htmlText of field "Instructions" of card i & return &\
"###" & return  after url ("file:" & it)
    end repeat
  end if
  
end mouseUp
             

El otro permite recuperar el contenido de un fichero de disco, seguramente de aquel donde se han realizado los cambios. A modo de correspondencia con el modo de almacenamiento descrito en la lista anterior, se puede utiliar el siguiente para leer e interpretar ese fichero.

#button "recuperarContinguts"
on mouseUp
  answer file "Tria el fitxer on guardar el contingut del tutorial ..." \
                 with "tutorialApp.html"
  if  it is not "Cancel" and it is not empty
  then
    put url ("file:" & it) into contingutFitxer
    put 1 into posicioLinea
    
    repeat with i = 1 to the number of cards of this stack
      set the htmlText of field "Title" of card i  to  line posicioLinea of contingutFitxer
      put (posicioLinea + 1) into desdeLinea
      put lineOffset( "###", contingutFitxer, desdeLinea) into posicioLinea
      put (desdeLinea + posicioLinea + 1) into posicioLinea
      set the htmlText of field "Instructions" of card i  to  line desdeLinea to (posicioLinea - 2) of contingutFitxer
    end repeat
    
  end if
end mouseUp
             

Pruébelo si no está convencido de haberlo entendido: abra en modo de edición la pila del primer tutorial, cree un par de botones y situe en ellos los dos fragmentos de código anterior.