Apuntes mientras aprendo sobre software y computadoras.

programación

Macro para contar palabras bajo cada cabecera en LibreOffice Writer

En este apunte rápido voy a revisar cómo crear un código para contar las palabras contenidas bajo cada cabecera de un documento en LibreOffice Writer.

Este apunte es parte de una serie más grande de textos, buscando herramientas al escribir proyectos largos como: guiones, novelas, ensayos universitarios y ese tipo de cosas.

Eso nos lleva directamente a…

La idea:

Digamos que tenemos que escribir un proyecto con un total de 20.000 palabras. Escribir todas esas palabras es difícil, en especial cuando lo comparamos con escribir solamente 1.000 palabras.

Entonces decidimos dividir el texto en 20 secciones, para que se vuelva más fácil de completar. Esto es solamente un ejemplo, pueden ser más o menos partes. Lo que se mantiene cierto es que dividir el texto general en pequeñas secciones se vuelve más manejable de resolver.

El asunto es que creamos diferentes títulos, cabeceras o “headings” (H1, H2…) y podemos navegar entre esos headings. Pero en un principio no podemos saber cuantas palabras agregamos luego al empezar a escribir en cada uno.

Este macro que comparto a continuación, escrito en LibreOffice Basic, nos va a ayudar exactamente a eso.

La idea es tener un código que revise todo el texto y encuentre las cabeceras. Luego tiene que informarnos del nombre de la cabecera y su cantidad de palabras. Al final tiene que decirnos la cantidad total de palabras, aunque eso ya lo conocemos del contador dentro del documento.

El código:

Sub ContarPalabrasHeadings()
    Dim doc As Object
    Dim cursor As Object
    Dim para As Object
    Dim wordCount As Long
    Dim totalWordCount As Long
    Dim headingFound As Boolean
    Dim result As String

    doc = ThisComponent
    text = doc.getText()
    cursor = text.createEnumeration()

    headingFound = False
    result = ""
    wordCount = 0
    totalWordCount = 0

    While cursor.hasMoreElements()
        para = cursor.nextElement()

        If Left(para.ParaStyleName, 7) = "Heading" Then
            If headingFound Then
                ' Crea un string para reflejar el número de palabras entre cabeceras
                result = result & headingText & ": " & wordCount & " palabras" & Chr(10)
            End If
            
            headingText = para.getString()
            headingFound = True
            wordCount = 0
        Else
            If headingFound Then
                ' Contar el número de palabras entre cabeceras
                trimmedText = Trim(para.getString())
				wordsArray = Split(trimmedText, " ")
                wordCount = wordCount + UBound(wordsArray) + 1
                totalWordCount = totalWordCount + UBound(wordsArray)
            End If
        End If
    Wend

    ' Actualiza la variable result con el número de palabras
    If headingFound Then
        result = result & headingText & ": " & wordCount & " palabras" & Chr(10)
    End If

    If result = "" Then
        MsgBox "No se encontraron cabeceras en el documento"
    Else
        MsgBox result & Chr(10) & "Total de palabras: " & totalWordCount
    End If

End Sub

Posibles mejoras:

Se me ocurren en este momento dos mejoras que se le pueden agregar al programa:

1- Una forma de contar las palabras debajo de cada heading de forma más precisa. En la forma que se encuentra implementado, encontré que a veces el conteo por secciones puede tener algunas palabras de más o de menos con el conteo total. Nada exagerado de todas maneras, el programa sirve para conseguir una buena idea general de cuanto llevamos avanzado.

2- Se puede modificar el programa para que también nos informe que tipo de cabecera es cada una, H1, H2…

Pero el programa cumple con lo que promete sin necesidad de esas mejoras.

Conclusión:

Espero que este apunte te ayude a encontrar una forma de contar palabras bajo cada cabecera en un documento para Libreoffice Writer.

Si encontrás algún error en el material, por favor avisame para que pueda corregirlo.

La seguimos en el próximo apunte.

Leave a Reply