mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
IGN:Update odfpy and make copying in rtf2xml a little nicer
This commit is contained in:
parent
d547891422
commit
3ca3d84384
@ -15,7 +15,8 @@
|
|||||||
# #
|
# #
|
||||||
# #
|
# #
|
||||||
#########################################################################
|
#########################################################################
|
||||||
import sys, os
|
import sys, os, shutil
|
||||||
|
|
||||||
class Copy:
|
class Copy:
|
||||||
"""Copy each changed file to a directory for debugging purposes"""
|
"""Copy each changed file to a directory for debugging purposes"""
|
||||||
__dir = ""
|
__dir = ""
|
||||||
@ -64,25 +65,7 @@ class Copy:
|
|||||||
of cp. Otherwise, use a safe python method.
|
of cp. Otherwise, use a safe python method.
|
||||||
"""
|
"""
|
||||||
write_file = os.path.join(Copy.__dir,new_file)
|
write_file = os.path.join(Copy.__dir,new_file)
|
||||||
platform = sys.platform
|
shutil.copyfile(file, write_file)
|
||||||
if platform[:5] == 'linux':
|
|
||||||
command = 'cp %(file)s %(write_file)s' % vars()
|
|
||||||
os.system(command)
|
|
||||||
else:
|
|
||||||
read_obj = open(file,'r')
|
|
||||||
write_obj = open(write_file, 'w')
|
|
||||||
line = "dummy"
|
|
||||||
while line:
|
|
||||||
line = read_obj.read(1000)
|
|
||||||
write_obj.write(line )
|
|
||||||
read_obj.close()
|
|
||||||
write_obj.close()
|
|
||||||
def rename(self, source, dest):
|
def rename(self, source, dest):
|
||||||
read_obj = open(source, 'r')
|
shutil.copyfile(source, dest)
|
||||||
write_obj = open(dest, 'w')
|
|
||||||
line = 1
|
|
||||||
while line:
|
|
||||||
line = read_obj.readline()
|
|
||||||
write_obj.write(line)
|
|
||||||
read_obj.close()
|
|
||||||
write_obj.close()
|
|
3927
src/odf/grammar.py
3927
src/odf/grammar.py
File diff suppressed because it is too large
Load Diff
@ -39,15 +39,3 @@ def Algorithm(**args):
|
|||||||
def KeyDerivation(**args):
|
def KeyDerivation(**args):
|
||||||
return Element(qname = (MANIFESTNS,'key-derivation'), **args)
|
return Element(qname = (MANIFESTNS,'key-derivation'), **args)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import cStringIO
|
|
||||||
xml=cStringIO.StringIO()
|
|
||||||
m = Manifest()
|
|
||||||
f = FileEntry(mediatype="text/xml", fullpath="content.xml")
|
|
||||||
m.addElement(f)
|
|
||||||
|
|
||||||
m.toXml(0,xml)
|
|
||||||
print xml.getvalue()
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#
|
#
|
||||||
# Contributor(s):
|
# Contributor(s):
|
||||||
#
|
#
|
||||||
TOOLSVERSION = u"ODFPY/0.8.1dev"
|
TOOLSVERSION = u"ODFPY/0.8.2dev"
|
||||||
|
|
||||||
ANIMNS = u"urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
|
ANIMNS = u"urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
|
||||||
DBNS = u"urn:oasis:names:tc:opendocument:xmlns:database:1.0"
|
DBNS = u"urn:oasis:names:tc:opendocument:xmlns:database:1.0"
|
||||||
@ -49,7 +49,7 @@ TABLENS = u"urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
|||||||
TEXTNS = u"urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
TEXTNS = u"urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||||
XFORMSNS = u"http://www.w3.org/2002/xforms"
|
XFORMSNS = u"http://www.w3.org/2002/xforms"
|
||||||
XLINKNS = u"http://www.w3.org/1999/xlink"
|
XLINKNS = u"http://www.w3.org/1999/xlink"
|
||||||
XMLNS = "http://www.w3.org/XML/1998/namespace"
|
XMLNS = u"http://www.w3.org/XML/1998/namespace"
|
||||||
|
|
||||||
|
|
||||||
nsdict = {
|
nsdict = {
|
||||||
|
@ -64,6 +64,12 @@ odmimetypes = {
|
|||||||
'application/vnd.oasis.opendocument.text-web': '.oth',
|
'application/vnd.oasis.opendocument.text-web': '.oth',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class OpaqueObject:
|
||||||
|
def __init__(self, filename, mediatype, content=None):
|
||||||
|
self.mediatype = mediatype
|
||||||
|
self.filename = filename
|
||||||
|
self.content = content
|
||||||
|
|
||||||
class OpenDocument:
|
class OpenDocument:
|
||||||
""" A class to hold the content of an OpenDocument document
|
""" A class to hold the content of an OpenDocument document
|
||||||
Use the xml method to write the XML
|
Use the xml method to write the XML
|
||||||
@ -76,6 +82,7 @@ class OpenDocument:
|
|||||||
def __init__(self, mimetype, add_generator=True):
|
def __init__(self, mimetype, add_generator=True):
|
||||||
self.mimetype = mimetype
|
self.mimetype = mimetype
|
||||||
self.childobjects = []
|
self.childobjects = []
|
||||||
|
self._extra = []
|
||||||
self.folder = "" # Always empty for toplevel documents
|
self.folder = "" # Always empty for toplevel documents
|
||||||
self.topnode = Document(mimetype=self.mimetype)
|
self.topnode = Document(mimetype=self.mimetype)
|
||||||
self.topnode.ownerDocument = self
|
self.topnode.ownerDocument = self
|
||||||
@ -303,12 +310,15 @@ class OpenDocument:
|
|||||||
else:
|
else:
|
||||||
self.thumbnail = filecontent
|
self.thumbnail = filecontent
|
||||||
|
|
||||||
def addObject(self, document):
|
def addObject(self, document, objectname=None):
|
||||||
""" Add an object. The object must be an OpenDocument class
|
""" Add an object. The object must be an OpenDocument class
|
||||||
The return value will be the folder in the zipfile the object is stored in
|
The return value will be the folder in the zipfile the object is stored in
|
||||||
"""
|
"""
|
||||||
self.childobjects.append(document)
|
self.childobjects.append(document)
|
||||||
document.folder = "%s/Object %d" % (self.folder, len(self.childobjects))
|
if objectname is None:
|
||||||
|
document.folder = "%s/Object %d" % (self.folder, len(self.childobjects))
|
||||||
|
else:
|
||||||
|
document.folder = objectname
|
||||||
return ".%s" % document.folder
|
return ".%s" % document.folder
|
||||||
|
|
||||||
def _savePictures(self, object, folder):
|
def _savePictures(self, object, folder):
|
||||||
@ -348,7 +358,7 @@ class OpenDocument:
|
|||||||
else:
|
else:
|
||||||
if addsuffix:
|
if addsuffix:
|
||||||
outputfile = outputfile + odmimetypes.get(self.mimetype,'.xxx')
|
outputfile = outputfile + odmimetypes.get(self.mimetype,'.xxx')
|
||||||
outputfp = zipfile.ZipFile(outputfile,"w")
|
outputfp = zipfile.ZipFile(outputfile, "w")
|
||||||
self._zipwrite(outputfp)
|
self._zipwrite(outputfp)
|
||||||
outputfp.close()
|
outputfp.close()
|
||||||
|
|
||||||
@ -382,6 +392,14 @@ class OpenDocument:
|
|||||||
zi.external_attr = UNIXPERMS
|
zi.external_attr = UNIXPERMS
|
||||||
self._z.writestr(zi, self.thumbnail)
|
self._z.writestr(zi, self.thumbnail)
|
||||||
|
|
||||||
|
# Write any extra files
|
||||||
|
for op in self._extra:
|
||||||
|
self.manifest.addElement(manifest.FileEntry(fullpath=op.filename, mediatype=op.mediatype))
|
||||||
|
zi = zipfile.ZipInfo(op.filename.encode('utf-8'), self._now)
|
||||||
|
zi.compress_type = zipfile.ZIP_DEFLATED
|
||||||
|
zi.external_attr = UNIXPERMS
|
||||||
|
if op.content is not None:
|
||||||
|
self._z.writestr(zi, op.content)
|
||||||
# Write manifest
|
# Write manifest
|
||||||
zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now)
|
zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now)
|
||||||
zi.compress_type = zipfile.ZIP_DEFLATED
|
zi.compress_type = zipfile.ZIP_DEFLATED
|
||||||
@ -528,15 +546,20 @@ def load(odffile):
|
|||||||
parser.parse(inpsrc)
|
parser.parse(inpsrc)
|
||||||
del doc._parsing
|
del doc._parsing
|
||||||
except KeyError, v: pass
|
except KeyError, v: pass
|
||||||
# Add the thumbnail here
|
# FIXME: Add subobjects correctly here
|
||||||
# Add the images here
|
|
||||||
for mentry,mvalue in manifest.items():
|
for mentry,mvalue in manifest.items():
|
||||||
if mentry[:9] == "Pictures/" and len(mentry) > 9:
|
if mentry[:9] == "Pictures/" and len(mentry) > 9:
|
||||||
doc.addPicture(mvalue['full-path'], mvalue['media-type'], z.read(mentry))
|
doc.addPicture(mvalue['full-path'], mvalue['media-type'], z.read(mentry))
|
||||||
elif mentry == "Thumbnails/thumbnail.png":
|
elif mentry == "Thumbnails/thumbnail.png":
|
||||||
doc.addThumbnail(z.read(mentry))
|
doc.addThumbnail(z.read(mentry))
|
||||||
|
elif mentry in ('settings.xml', 'meta.xml', 'content.xml', 'styles.xml'):
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
pass # Add the SUN junk here to the struct somewhere
|
if mvalue['full-path'][-1] == '/':
|
||||||
|
doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], None))
|
||||||
|
else:
|
||||||
|
doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], z.read(mentry)))
|
||||||
|
# Add the SUN junk here to the struct somewhere
|
||||||
# It is cached data, so it can be out-of-date
|
# It is cached data, so it can be out-of-date
|
||||||
z.close()
|
z.close()
|
||||||
b = doc.getElementsByType(Body)
|
b = doc.getElementsByType(Body)
|
||||||
|
@ -231,6 +231,19 @@ class ODFContentParser(xml.sax.saxutils.XMLGenerator):
|
|||||||
self._callback_func = callback_func
|
self._callback_func = callback_func
|
||||||
xml.sax.saxutils.XMLGenerator.__init__(self, out, encoding)
|
xml.sax.saxutils.XMLGenerator.__init__(self, out, encoding)
|
||||||
|
|
||||||
|
def _qname(self, name):
|
||||||
|
"""Builds a qualified name from a (ns_url, localname) pair"""
|
||||||
|
if name[0]:
|
||||||
|
if name[0] == u'http://www.w3.org/XML/1998/namespace':
|
||||||
|
return u'xml' + ":" + name[1]
|
||||||
|
# The name is in a non-empty namespace
|
||||||
|
prefix = self._current_context[name[0]]
|
||||||
|
if prefix:
|
||||||
|
# If it is not the default namespace, prepend the prefix
|
||||||
|
return prefix + ":" + name[1]
|
||||||
|
# Return the unqualified name
|
||||||
|
return name[1]
|
||||||
|
|
||||||
def startElementNS(self, name, qname, attrs):
|
def startElementNS(self, name, qname, attrs):
|
||||||
if name == (TEXTNS, u'user-field-decl'):
|
if name == (TEXTNS, u'user-field-decl'):
|
||||||
field_name = attrs.get((TEXTNS, u'name'))
|
field_name = attrs.get((TEXTNS, u'name'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user