Ver la Versión Completa : Notas al pie
javitonino
06/08/2008, 18:08
Después de encontrarme con unos pocos libros con notas al pie que me apetecía leer, me puse a buscar una solución al problema de que no se muestren en los lectores (por lo menos yo no encuntro manera en un hanlin). Así que me hice un programita en python que coge todas las notas al pie, y las pone donde iría la marca en el texto principal, formateadas en cursiva y entre corchetes.
Ahora mismo es una guarrería (hay que tocar código para ajustar el programa a cada libro a convertir) pero si a alguien el interesa podría hacer que fuera usable. La entrada y la salida sería odt (OpenOffice), pero es relativamente fácil convertir a/desde rtf o doc (incluso desde pdf, a partir de la versión 3.0 de openoffice (aún en beta)).
Pues eso, si a alguien le interesa, que lo comente.
Pendergast
06/08/2008, 18:29
Yo ya me había resignado a no leer los pies de página. Si haces un programa que haga lo que has dicho, me parece una idea genial y cuenta con mi linux mint si necesitas pruebas.
saludos
surquizu
07/08/2008, 00:08
Yo estoy leyendo un libro en lfr (sony reader) con pies de página. Aparecen con un * resaltado. Es un hiperenlace que al darle al enter del lector te envía directamente a l´última página donde estan todos los pies de pagina agrupados. De nuevo con enter vuelves al texto que leias.
Este libro creo que lo hice yo mismo con el bookdesigner sin tener en cuenta nada especial, por lo que se hicieron los pies de pagina de forma automatica.
javitonino
14/08/2008, 03:22
Bueno, pues aquí va. Se necesita python y pyxml que se pueden encontrar en los repositorios de tu distribución o:
- python: http://www.python.org/download/
- pyxml: http://sourceforge.net/project/showfiles.php?group_id=6473
La verdad es que es bastante lento (15s una novela normalita) para lo que hace debido a las librerías de xml que utilizo, pero bueno, ya lo arreglaré si me aburro.
Para usarlo, en una consola escribir ."/footnote.py FICHERO.odt". La ejecución queda tal que así:
$ ./footnote.py FICHERO.odt
Abriendo fichero ODT... OK
Leyendo fichero XML... OK
Transformando fichero XML... OK (19 notas al pie convertidas)
Escribiendo fichero XML... OK
Grabando fichero ODT... OK
El código lo pongo aquí, ya que no me deja poner adjuntos. Tan sólo hay que copypastear y guardar con extensión py.
#!/usr/bin/python
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...",
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
nota = StringIO()
nodoCuerpo = n.getElementsByTagName("text:note-body")[0]
nodoP = nodoCuerpo.getElementsByTagName("text:p")[0]
nuevo = doc.createElement("text:span")
nuevo.appendChild(doc.createTextNode("["))
for s in nodoP.childNodes:
nuevo.appendChild(s.cloneNode(nuevo))
nuevo.appendChild(doc.createTextNode("]"))
n._get_parentNode().replaceChild(nuevo,n)
print "OK (" + str(i) + " notas al pie 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"
A ver si alguien lo prueba y me dice si le funciona.
Edit: Yo no he conseguido hacer lo que comenta surquizu en el Hanlin. En ningún formato de los que he probado me ha salido nada. En algún libro si me ha salido el texto de la nota al final de la página A4 (unas 3 páginas más adelante en el lector), pero sólo en los que no viene bien hecho la nota al pie (está puesta con un * a mano, en vez de con la función de notas al pie del procesador de textos).
Si alguien consiguiera hacerlo de la otra manera sería bastante mejor, pero de momento la chapuza de programa sirve.
Pendergast
14/08/2008, 08:59
Hola, he creado el archivo .py y lo tengo que ejecutar con python, de este modo:
"python foofnote.py libro.odt" con sudo y sin sudo
y me sale esto:
-----------------------------------
Traceback (most recent call last):
File "footnote.py", line 4, in <module>
from xml.dom.ext.reader.Sax2 import Reader
ImportError: No module named ext.reader.Sax2
-----------------------------------
No tengo instalado el reader aquí, lo tengo en otro ordenador con windows. Aquí tengo linux. ¿es por eso?
Saludos, y ánimo por el buen trabajo.
javitonino
14/08/2008, 11:25
Hola, he creado el archivo .py y lo tengo que ejecutar con python, de este modo:
"python foofnote.py libro.odt" con sudo y sin sudo
No hace falta el sudo para nada, aunque tampoco hace ningún daño.
y me sale esto:
-----------------------------------
Traceback (most recent call last):
File "footnote.py", line 4, in <module>
from xml.dom.ext.reader.Sax2 import Reader
ImportError: No module named ext.reader.Sax2
-----------------------------------
Eso es porque te falta un módulo, en concreto pyxml. Seguro que está en los repositorios, prueba por pyxml o python-xml. Si no lo encuentras, siempre puedes probar a instalar inkscape (un editor svg), que lo tiene como dependencia.
No tengo instalado el reader aquí, lo tengo en otro ordenador con windows. Aquí tengo linux. ¿es por eso?
El script lo hice y probé en linux. Debería funcionar en Windows también, pero no tengo dónde probarlo.
Saludos, y ánimo por el buen trabajo.
Gracias :)
Pendergast
14/08/2008, 17:08
Pues efectivamente, no tenía instalado el python-xml. Lo he instalado junto con el inkscape por si acaso, y me da exactamente el mismo error.
Siento no ser de más ayuda, soy novato en linux
saludos
javitonino
14/08/2008, 20:34
Edit, Antes de nada aseguraté de que es el mismo error (la parte de xml.dom.ext.reader.Sax2)
¿Puedes probar a instalar el paquete python-4suite y python-4suite-xml (o similares)? Gracias
Edit, Si no funciona y tienes tiempo puedes intentar la instalación manual del python-xml (que es el paquete que hace falta para el error del Sax2, en teoría ninguno más):
1- Bajar http://sourceforge.net/project/downloading.php?group_id=6473&filename=PyXML-0.8.4.tar.gz
2- Descomprimir
3- Ejecutar "./setup.py install"
Pendergast
14/08/2008, 22:36
Sip, el error era el mismo.
Solucionado gracias a tus indicaciones. Me instalé el python-4suite junto con su amigo y seguía fallando.
Entonces instalé el python-xml manualmente y ha funcionado.
Vale, el programa funciona. ^:)^
Lo malo es que no me ha leído ningún pie de página. Mira:
----------------------------------
Abriendo fichero ODT... OK
Leyendo fichero XML... OK
Transformando fichero XML... OK (0 notas al pie convertidas)
Escribiendo fichero XML... OK
Grabando fichero ODT... OK
---------------------------------
Y las tiene, te lo aseguro, si quieres te paso el fichero, por si quieres comprobarlo tú. Mejor, te indico dónde conseguirlo. Está aquí
http://vagos.wamba.com/showthread.php?t=446390&highlight=brooks
El primero, que está en doc. Lo he pasado a odt y entonces le he aplicado tu programa, pero me dice que no hay pies de página. En la página 4 tienes el primero, por si quieres comprobarlo.
Saludos
javitonino
15/08/2008, 13:04
Vale, es que son notas al final del documento, no al final de página (que son los que tenía yo para probar). Supongo que los guardará de forma ligeramente diferente, y que se podrá arreglar fácilmente. Esta tarde me pongo con ello.
javitonino
15/08/2008, 18:15
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.
#!/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,n odoCambiar)
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"
Pendergast
16/08/2008, 11:36
Perfecto!!!
Ha funcionado perfectamente, ya tengo los pies de página insertados en el texto entre paréntesis.
Gran trabajo.
Muchas gracias
Powered by vBulletin® Version 4.1.10 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved.