Uso de estilos para generar automáticamente el código a partir de un documento de write

Estoy tratando de utilizar Libreoffice para programar utilizando ‘Literate programming’. Para ello cada vez que inicio un proyecto de programación abro un fichero de writer en el que voy tecleando, primero los requisitos, referencias y luego el proceso de programación. Este fichero me sirve tanto de documentación del código como para generar el código en python. Para ello utilizo un pequeño programa en Python, crearCodigo.py que crea los ficheros de código *.py desde este fichero de libreoffice:

  • Busca párrafos con el estilo de nombre ‘código’
  • La primera línea indica el fichero que hay que crear. las posteriores, el contenido del fichero.
  • Crea el fichero *.py indicado en esa sección de estilo ‘código’
  • Va añadiendo las líneas a dicho fichero
  • Si se nombra el mismo fichero posteriormente añade las líneas a continuación de las anteriores.

Sin embargo hay un problema que podría ser un bug de libreoffice:

SI escribo el código como estilo “cuerpo de texto” y después cambio el estilo a ‘código’ el programa crearCodigo.py va bien. Sin embargo, si añado nuevas líneas en el medio de los párrafos con dicho estilo, a pesar de que libreoffice las muestra como estilo ‘código’ el programa crearCodigo.py las ve como párrafos normales. Para que funcione tengo que aplicar otro estilo y después el estilo ‘código’.

Utilizo la librería odfpy.
El fichero crearCodigo.py es el siguiente:

from odf.opendocument import load
from odf import text, teletype
import sys

control_ficheros = dict()

def escribir(fichero, linea):
    with open(fichero,"a", encoding='utf-8') as file:
        file.writelines(linea)
        file.writelines('\n')
    return True

def crear(fichero):
    with open(fichero,"w", encoding='utf-8') as file:
        file.writelines('# Creado automáticamente desde ' + fichero_origen)
        file.writelines('\n')
    return True

def nuevo(fichero):
    if control_ficheros.get(fichero, 0)>0:
        return False
    else:
        return True
    
def preparar(linea):
    linea = linea.replace('\t', '    ')
    linea = linea.replace('‘', u"'")
    linea = linea.replace('’', u"'")
    return linea

if (len(sys.argv)<2):
    print('No has indicado qué fichero contiene el proyecto')
    exit()
else:
    fichero_origen = sys.argv[1]

# fichero_origen = 'file.odt'
doc = load(fichero_origen)

print('--- BUSCANDO CÓDIGO')

for paragraph in doc.getElementsByType(text.P):
    if paragraph.getAttribute('stylename') == 'código':
        lista = str(paragraph)
        if lista.startswith('Fichero'):
            fichero = lista.split(':')[1].strip()
            if nuevo(fichero):
                crear(fichero)
                print('nuevo fichero: ', fichero)
                control_ficheros.update({fichero: 1})
            else:
                print('fichero', fichero, 'ya existe. Añado líneas')
        else:
            linea = teletype.extractText(paragraph)
            linea = preparar(linea)
            escribir(fichero, linea)

Entiendo que si se escriben líneas en un documento de writer entre las que tienen el estilo ‘código’ dichas líneas no solo deberían visualmente coincidir con el formato de dicho estilo, sino que también interiormente deberían marcar su nombre de estilo al estilo ‘código’ y no dejarlas con el nombre de estilo de párrafos normales.

¿Has considerado que no sea un problema de Writer, si no de la librería que estas usando?

¿Has probado alguna de las siguientes opciones antes de generar el código Py?

  • Cerrar el documento y abrirlo de nuevo
  • o Guardar el documento y después Menú > Archivo > Recargar
  • o Menú > Actualizar > Actualizar todo