sábado, 16 de marzo de 2024

Procedimientos. Textos.

Uso de macros para automatizar la escritura (1)

La forma básica de automatizar la escritura de un texto es haciendo uso de la funcionalidad LO-Writer Grabar macro (Herramientas/Macros/Grabar macro). Word posee una funcionalidad similar, aunque es necesario habilitar el modo Programador. Como sabes, mediante Grabar macro es posible generar un código que recoge cada una de las pulsaciones del teclado (y algunas acciones con el ratón) y convertirlas en código (OOo Basic en Writer). Posteriormente podrás modificar ese código para darle las funcionalidades de las que carece, como la inclusión de variables propias y el uso de estructuras de iteración o bifurcación.



Efectivamente, Grabar macro se limita a crear un código estrictamente imperativo-lineal, carente de esos componentes tan importantes en cualquier lenguaje de programación. Es por ello que una macro (entendida como código resultante del uso de Grabar macro) es una solución muy limitada para basar en ella el proceso de automatización de la escritura de un texto, aunque puede ser la base del mismo, según vimos en otro momento.

Precisamente por ello, y también por ser el primer recurso de utilidad en ese proceso de automatización, es conveniente entender el código-macro de escritura, así como saber crear una macro simple de escritura como la que tienes a continuación (puedes acceder a este código de esta macro simple desde aquí)

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Text"
args1(0).Value = "Texto"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())

Sin entrar en detalles que ahora importa poco, tal y como vimos en otro momento también, lo fundamental de esta macro simple es su estructura, compuesta por una matriz de dos atributos y una instrucción de ejecución, por ese orden. Respecto a la primera nos interesa el segundo argumento (args1(0).Value = "Texto"), ya que podemos utilizarla para...

  • A partir de una macro simple que usamos a modo de plantilla, sustituir esa palabra por otra, por una frase o por un texto de la longitud que deseemos, simplemente con pegar ese contenido en sustitución del que originalmente tiene la macro-base.
  • Sustituir el texto por una variable, siempre de tipo string, que previamente declaramos dentro de la macro (2) y a la que asignamos un determinado contenido (una cadena de texto o una concatenación de cadenas de texto o la combinación de cadenas de texto y variables).
  • Podemos generar algún tipo de procedimiento de personalización del contenido sin necesidad de acceder al IDE, asignando, a su vez, esa variable a un objeto InputBox() o a recursos más complejos de interface, como un cuadro de diálogo. De este modo no será necesario "programar" el script cada vez que deseemos usarlo.
  • Y, como ya vimos, podemos utilizar la macro, reconvertida en subrutina, accediendo a ella desde un script que contendrá la variable de asignación de contenido antes indicada, la cual se utilizará como argumento en la llamada a la macro-subrutina. También es ese caso podemos emplear recursos de interface.
En resumen, que las posibilidades son variadas, debiendo optar por aquella que mejor se ajuste a nuestras necesidades.

Otras macros que nos serán de utilidad en el manejo del contenido de un texto, aunque no tanto en su automatización son las siguientes:

  • Seleccionar texto del documento (desde inicio del documento) (macro simple)

dispatcher.executeDispatch(document,".uno:EndOfDocumentSel", "", 0, Array())

El cursor se encuentra situado al inicio del documento y se desplaza hasta el final seleccionado todo el texto.

  • Seleccionar texto del documento (desde final del documento) (macro simple)

dispatcher.executeDispatch(document, ".uno:StartOfDocumentSel", "", 0, Array())

El cursor se encuentra situado al final del documento y se desplaza hasta el inicio seleccionado todo el texto. 

  • Seleccionar párrafo (desde el inicio del párrafo) (macro simple)

dispatcher.executeDispatch(document, ".uno:EndOfParaSel", "", 0, Array())

Posicionamos el cursor al inicio del párrafo.

  • Seleccionar párrafo (desde el fin del párrafo) (macro simple)
  • dispatcher.executeDispatch(document, ".uno:EndOfParaSel", "", 0, Array())

    Posicionamos el cursor al final del párrafo

    • Seleccionar línea
    dim args1(1) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "Count"
    args1(0).Value = 1
    args1(1).Name = "Select"
    args1(1).Value = true

    Desde el inicio (posición del cursor: inicio de la línea a seleccionar) (macro simple

    dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())

    Desde el final (posición del curso: línea inferior) (macro simple)

     dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args1())

    También podemos crear macros de formato, con lo que automatizamos el formateo del texto según nos interese, y sin tener que hacerlo "manualmente". Estas son algunas de la macros de este tipo:

    dim args1(4) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "CharFontName.StyleName"
    args1(0).Value = ""
    args1(1).Name = "CharFontName.Pitch"
    args1(1).Value = 2
    args1(2).Name = "CharFontName.CharSet"
    args1(2).Value = -1
    args1(3).Name = "CharFontName.Family"
    args1(3).Value = 5
    args1(4).Name = "CharFontName.FamilyName"
    args1(4).Value = "Verdana"
    dispatcher.executeDispatch(document, ".uno:CharFontName", "", 0, args1())

    dim args1(2) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "FontHeight.Height"
    args1(0).Value = 12
    args1(1).Name = "FontHeight.Prop"
    args1(1).Value = 100
    args1(2).Name = "FontHeight.Diff"
    args1(2).Value = 0
    dispatcher.executeDispatch(document, ".uno:FontHeight", "", 0, args1())

    dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "JustifyPara"
    args1(0).Value = true
    dispatcher.executeDispatch(document, ".uno:JustifyPara", "", 0, args1())

    Con este conjunto de macros simples, y otros que vayamos creando, dispondremos de un conjunto de herramientas que, transformadas en su caso, y/o empleadas desde script, nos permitirán realizar composiciones de texto de cierta complejidad y con el mínimo conocimiento del lenguaje OOo Basic. Grabar macro trabaja por nosotros.

    NOTAS 

    (1) Esta entrada se basa y sustituye a en dos entradas publicadas originalmente el día 16/10/2023, tituladas respectivamente Writer. Trabajo con textos y Writer. Formateo de texto.

    (2) En sentido estricto, si incluimos nuestra variable en el cuerpo de la macro, realmente la estamos convirtiendo en un script, ya que las macros generadas desde Grabar macro, no contienen variables de esa naturaleza, aunque admiten ser modificadas. En ese caso, personalmente prefiero considerarlas script, para no generar confusión entre unas y otros. De todas formas esto es mi opción, mientras que lo común es extender la denominación macro a todo segmento de código creado, de una u otra forma, sobre un documento (en este momento, un documento de texto, pero también sobre hojas de cálculo, presentaciones...

    No hay comentarios:

    Publicar un comentario

    Comenta esta entrada