#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2004 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id:
#-------------------------------------------------------------------------
#
# Standard Python Modules
#
#-------------------------------------------------------------------------
import os
import tempfile
import zipfile
from gen.ggettext import gettext as _
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from TabbedDoc import *
import const
import Errors
#-------------------------------------------------------------------------
#
# Constants
#
#-------------------------------------------------------------------------
_XMLNS = '''\
xmlns:office="%(urn)soffice:1.0"
xmlns:style="%(urn)sstyle:1.0"
xmlns:text="%(urn)stext:1.0"
xmlns:table="%(urn)stable:1.0"
xmlns:draw="%(urn)sdrawing:1.0"
xmlns:fo="%(urn)sxsl-fo-compatible:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:meta="%(urn)smeta:1.0"
xmlns:number="%(urn)sdatastyle:1.0"
xmlns:svg="%(urn)ssvg-compatible:1.0"
xmlns:chart="%(urn)schart:1.0"
xmlns:dr3d="%(urn)sdr3d:1.0"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xmlns:form="%(urn)sform:1.0"
xmlns:script="%(urn)sscript:1.0"
xmlns:dom="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
''' % {'urn': 'urn:oasis:names:tc:opendocument:xmlns:'}
_DOC_FONTS = '''\
'''
_DOC_STYLES = '''\
'''
_STYLES_FONTS = '''\
'''
_STYLES_STYLES = '''\
'''
_STYLES_AUTOMATIC = '''\
'''
_STYLES_MASTER = '''\
???
Page
1
???
(???)
05/16/2001
,
10:53:17
Page
1 /
99
'''
_MANIFEST = '''\
'''
_META = '''\
%(program)s %(version)s
%(name)s
%(time)s
%(name)s
%(time)s
0-00-00T00:00:00
en-US
1
PT0S
'''
#-------------------------------------------------------------------------
#
# ODSTab
#
#-------------------------------------------------------------------------
class ODSTab(TabbedDoc):
def __init__(self, columns):
TabbedDoc.__init__(self, columns)
self.f = None
self.filename = None
self.level = 0
self.time = "0000-00-00T00:00:00"
def open(self,filename):
import time
t = time.localtime(time.time())
self.time = "%04d-%02d-%02dT%02d:%02d:%02d" % t[:6]
self.filename = filename
if not filename.endswith('.ods'):
self.filename += '.ods'
try:
self.content_xml = tempfile.mktemp()
self.f = open(self.content_xml,"wb")
except IOError,msg:
raise Errors.ReportError(_("Could not create %s") % self.content_xml, msg)
except:
raise Errors.ReportError(_("Could not create %s") % self.content_xml)
self.f = open(self.content_xml,"w")
self.f.write(
'\n' +
' ' +
'\n'
)
self.f.write(_DOC_FONTS)
self.f.write(_DOC_STYLES)
self.f.write(
'\n'
'\n')
def close(self):
self.f.write(
'\n'
'\n'
'\n'
)
self.f.close()
self._write_styles_file()
self._write_manifest()
self._write_meta_file()
self._write_mimetype_file()
self._write_zip()
def start_row(self):
self.f.write('\n')
def end_row(self):
self.f.write('\n')
def write_cell(self, text):
self.f.write('')
self.f.write('>\n')
self.f.write('')
text = text.replace('&','&') # Must be first
text = text.replace('<','<')
text = text.replace('>','>')
text = text.replace('\t','')
text = text.replace('\n','')
self.f.write(unicode(text))
self.f.write('\n')
self.f.write('\n')
# for col in range(1,self.span):
# self.f.write('\n')
def _write_zip(self):
try:
file = zipfile.ZipFile(self.filename,"w",zipfile.ZIP_DEFLATED)
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.filename, msg)
raise Errors.ReportError(errmsg)
except:
raise Errors.ReportError(_("Could not create %s") % self.filename)
file.write(self.manifest_xml,str("META-INF/manifest.xml"))
file.write(self.content_xml,str("content.xml"))
file.write(self.meta_xml,str("meta.xml"))
file.write(self.styles_xml,str("styles.xml"))
file.write(self.mimetype,str("mimetype"))
file.close()
os.unlink(self.manifest_xml)
os.unlink(self.content_xml)
os.unlink(self.meta_xml)
os.unlink(self.styles_xml)
def _write_styles_file(self):
self.styles_xml = tempfile.mktemp()
try:
self.f = open(self.styles_xml,"wb")
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.styles_xml, msg)
raise Errors.ReportError(errmsg)
except:
pass
raise Errors.ReportError(_("Could not create %s") % self.styles_xml)
self.f = open(self.styles_xml,"w")
self.f.write('\n')
self.f.write(
' '
)
self.f.write(_STYLES_FONTS)
self.f.write(_STYLES_STYLES)
self.f.write(_STYLES_AUTOMATIC)
self.f.write(_STYLES_MASTER)
self.f.write('\n')
self.f.close()
def start_page(self):
self.f.write('')
for col in range(0,self.columns):
self.f.write('\n')
def end_page(self):
self.f.write('\n')
def _write_manifest(self):
self.manifest_xml = tempfile.mktemp()
try:
self.f = open(self.manifest_xml,"wb")
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.manifest_xml, msg)
raise Errors.ReportError(errmsg)
except:
pass
raise Errors.ReportError(_("Could not create %s") % self.manifest_xml)
self.f = open(self.manifest_xml,"w")
self.f.write(_MANIFEST)
self.f.close()
def _write_meta_file(self):
self.meta_xml = tempfile.mktemp()
try:
self.f = open(self.meta_xml,"wb")
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.meta_xml, msg)
raise Errors.ReportError(errmsg)
except:
pass
raise Errors.ReportError(_("Could not create %s") % self.meta_xml)
self.f = open(self.meta_xml,"w")
self.f.write(_META %
{'program': const.PROGRAM_NAME,
'version': const.VERSION,
'name' : self.name,
'time' : self.time,
}
)
self.f.close()
def _write_mimetype_file(self):
self.mimetype = tempfile.mktemp()
try:
self.f = open(self.mimetype,"wb")
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.mimetype, msg)
raise Errors.ReportError(errmsg)
except:
pass
raise Errors.ReportError(_("Could not create %s") % self.mimetype)
self.f = open(self.mimetype,"w")
self.f.write('application/vnd.oasis.opendocument.spreadsheet')
self.f.close()
if __name__ == "__main__":
file = ODSTab(3)
file.open("test")
file.start_page()
for i in [ ('one', 'two', 'three'), ('fo"ur', 'fi,ve', 'six') ]:
file.start_row()
for j in i:
file.write_cell(j)
file.end_row()
file.end_page()
file.close()