Adjunto el código que ya funciona para ese libro y cualquiera que para las notas utilice enlaces a marcadores dentro del propio documento, siempre que esos marcadores se llamen "footnoteLO-QUE-SEA".
Los resultados de las pruebas siempre son bienvenidos, y si no funcionan porque el libro tiene los pies de página hechos de otro manera, mejor.
ACTUALIZADO: Ahora funciona mejor en el lector. En algún caso se veía bien en el PC pero no en el lector.
Código:
#!/usr/bin/python
#coding=UTF8
import sys
import zipfile
from xml.dom.ext.reader.Sax2 import Reader
from xml.dom.ext import Print
from StringIO import StringIO
import re
if (len(sys.argv) != 2):
print "Este programa acepta un argumento: fichero .odt a abrir"
exit()
try:
print "Abriendo fichero ODT...",
sys.stdout.flush()
zip = zipfile.ZipFile(sys.argv[1], "a")
data = zip.read("content.xml")
print "OK"
except:
print
print "Error al abrir el fichero"
exit()
print "Leyendo fichero XML...",
sys.stdout.flush()
doc = Reader().fromString(data)
print "OK"
print "Transformando fichero XML:"
print " 1ª pasada (notas al pie)...",
sys.stdout.flush()
i = 0
for n in doc.getElementsByTagName("text:note"):
if n.getAttributeNS("urn:oasis:names:tc:opendocument:xmlns:text:1.0","note-class") == "footnote":
i += 1
nodoCuerpo = n.getElementsByTagName("text:note-body")[0]
nodoP = nodoCuerpo.getElementsByTagName("text:p")[0]
nodoCambiar = n._get_parentNode()._get_parentNode()
nuevo = doc.createElement("text:span")
nuevo.appendChild(doc.createTextNode("["))
for s in nodoP.childNodes:
nuevo.appendChild(s.cloneNode(nuevo))
nuevo.appendChild(doc.createTextNode("]"))
nodoCambiar._get_parentNode().replaceChild(nuevo,nodoCambiar)
print "OK (" + str(i) + " notas convertidas)"
#Enlaces a marcadores de la forma #footnoteXX
print " 2ª pasada (enlaces)...",
sys.stdout.flush()
i = 0
bookmarks = doc.getElementsByTagName("text:bookmark")
bookmarks += doc.getElementsByTagName("text:bookmark-start")
for n in doc.getElementsByTagName("text:a"):
destino = n.getAttributeNS("http://www.w3.org/1999/xlink","href")[1:]
if destino.find("footnote") != -1 and destino.find("footnotelink") == -1:
numeroNota = destino[destino.find("footnote")+8:]
bk = [b for b in bookmarks if b.getAttributeNS("urn:oasis:names:tc:opendocument:xmlns:text:1.0","name") == destino]
if len(bk) != 1:
print
print "Error en el fichero, link aapunta a destino inexistente"
break;
#bk es el favorito de destino
bk = bk[0]
while (bk):
if bk.nodeType == 3:
#Nodo texto
padre = n._get_parentNode()
txt = bk.cloneNode(padre)
txt._set_data("[" + txt._get_data() + "]")
padre.replaceChild(txt,n)
i += 1
break;
else:
bk = bk._get_nextSibling()
print "OK (" + str(i) + " notas convertidas)"
print "Escribiendo fichero XML...",
sys.stdout.flush()
sdata = StringIO()
Print(doc, stream=sdata)
print "OK"
print "Grabando fichero ODT...",
sys.stdout.flush()
zip.writestr("content.xml", sdata.getvalue())
zip.close()
print "OK"