#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 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
#
import os
import tempfile
import string
from TextDoc import *
from latin_utf8 import latin_to_utf8
import const
import utils
cnv = utils.fl2txt
try:
import PIL.Image
no_pil = 0
except:
no_pil = 1
try:
from codecs import *
except:
def EncodedFile(a,b,c):
return a
class OpenOfficeDoc(TextDoc):
def __init__(self,styles,type,orientation):
TextDoc.__init__(self,styles,type,orientation)
self.f = None
self.filename = None
self.level = 0
self.time = "0000-00-00T00:00:00"
self.new_page = 0
def open(self,filename):
import time
t = time.localtime(time.time())
self.time = "%04d-%02d-%02dT%02d:%02d:%02d" % \
(t[0],t[1],t[2],t[3],t[4],t[5])
if filename[-4:] != ".sxw":
self.filename = filename + ".sxw"
else:
self.filename = filename
tempfile.tempdir = "/tmp"
self.tempdir = tempfile.mktemp()
os.mkdir(self.tempdir,0700)
os.mkdir(self.tempdir + os.sep + "Pictures")
os.mkdir(self.tempdir + os.sep + "META-INF")
fname = self.tempdir + os.sep + "content.xml"
self.f = EncodedFile(open(fname,"wb"),'latin-1','utf-8')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
for style_name in self.style_list.keys():
style = self.style_list[style_name]
self.f.write('\n\n')
self.f.write('\n')
for style_name in self.table_styles.keys():
style = self.table_styles[style_name]
self.f.write('\n')
table_width = float(self.get_usable_width())
table_width_str = cnv("%.4f",table_width)
self.f.write('\n')
self.f.write('\n')
for col in range(0,style.get_columns()):
self.f.write('')
width = table_width * float(style.get_column_width(col)/100.0)
width_str = cnv("%.4f",width)
self.f.write('' % width_str)
self.f.write('\n')
for cell in self.cell_styles.keys():
cell_style = self.cell_styles[cell]
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
def close(self):
self.f.write('\n')
self.f.write('\n')
self.f.close()
self._write_styles_file()
self._write_manifest()
self._write_meta_file()
self._write_photos()
self._write_zip()
def add_photo(self,name,x,y):
import GdkImlib
image = GdkImlib.Image(name)
scale = float(image.rgb_width)/float(image.rgb_height)
act_width = x * scale
act_height = y * scale
self.photo_list.append((name,int(act_width)*40,int(act_height)*40))
base = os.path.basename(name)
tag = string.replace(base,'.','_')
self.f.write('\n')
def start_table(self,name,style_name):
self.f.write('\n')
table = self.table_styles[style_name]
for col in range(0,table.get_columns()):
self.f.write('\n')
def end_table(self):
self.f.write('\n')
def start_row(self):
self.f.write('\n')
def end_row(self):
self.f.write('\n')
def start_cell(self,style_name,span=1):
self.span = span
self.f.write(' 1:
self.f.write(' table:number-columns-spanned="' + str(span) + '">\n')
else:
self.f.write('>\n')
def end_cell(self):
self.f.write('\n')
for col in range(1,self.span):
self.f.write('\n')
def start_bold(self):
self.f.write('')
def end_bold(self):
self.f.write('')
def _write_zip(self):
if os.path.isfile(self.filename):
os.unlink(self.filename)
os.system("cd " + self.tempdir + "; " + const.zipcmd + " " \
+ self.filename + " .")
os.unlink(self.tempdir + os.sep + "META-INF" + os.sep + "manifest.xml")
os.unlink(self.tempdir + os.sep + "content.xml")
os.unlink(self.tempdir + os.sep + "meta.xml")
os.unlink(self.tempdir + os.sep + "styles.xml")
for image in self.photo_list:
base = os.path.basename(image[0])
os.unlink(self.tempdir + os.sep + "Pictures" + os.sep + base)
os.rmdir(self.tempdir + os.sep + "Pictures")
os.rmdir(self.tempdir + os.sep + "META-INF")
os.rmdir(self.tempdir)
def _write_styles_file(self):
file = self.tempdir + os.sep + "styles.xml"
self.f = EncodedFile(open(file,"wb"),'latin-1','utf-8')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
for key in self.style_list.keys():
style = self.style_list[key]
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
# Current no leading number format for headers
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.close()
def page_break(self):
self.new_page = 1
def start_paragraph(self,style_name,leader=None):
style = self.style_list[style_name]
self.level = style.get_header_level()
if self.new_page == 1:
self.new_page = 0
name = "NL%s" % style_name
else:
name = style_name
if self.level == 0:
self.f.write('' % name)
else:
self.f.write('')
if leader != None:
self.f.write(latin_to_utf8(leader))
self.f.write('')
def end_paragraph(self):
if self.level == 0:
self.f.write('\n')
else:
self.f.write('\n')
def write_text(self,text):
text = string.replace(text,'\n','')
self.f.write(latin_to_utf8(text))
def _write_photos(self):
for file_tuple in self.photo_list:
file = file_tuple[0]
width = file_tuple[1]
height = file_tuple[2]
base = os.path.basename(file)
image_name = self.tempdir + os.sep + "Pictures" + os.sep + base
if no_pil:
cmd = "%s -geometry %dx%d '%s' '%s'" % (const.convert,width,height,file,image_name)
os.system(cmd)
else:
im = PIL.Image.open(file)
im.thumbnail((width,height))
im.save(image_name,"JPEG")
def _write_manifest(self):
file = self.tempdir + os.sep + "META-INF" + os.sep + "manifest.xml"
self.f = EncodedFile(open(file,"wb"),'latin-1','utf-8')
self.f.write('\n')
self.f.write('')
self.f.write('')
for image in self.photo_list:
i = image[0]
base = os.path.basename(i)
self.f.write('')
self.f.write('')
self.f.write('')
self.f.write('')
self.f.write('')
self.f.write('\n')
self.f.close()
def _write_meta_file(self):
file = self.tempdir + os.sep + "meta.xml"
name = latin_to_utf8(self.name)
self.f = EncodedFile(open(file,"wb"),'latin-1','utf-8')
self.f.write('\n')
self.f.write('\n');
self.f.write('\n')
self.f.write('')
self.f.write(const.progName + ' ' + const.version)
self.f.write('\n')
self.f.write('')
self.f.write(name)
self.f.write('\n')
self.f.write('')
self.f.write(self.time)
self.f.write('\n')
self.f.write('')
self.f.write(name)
self.f.write('\n')
self.f.write('')
self.f.write(self.time)
self.f.write('\n')
self.f.write('0-00-00T00:00:00\n')
self.f.write('en-US\n')
self.f.write('1\n')
self.f.write('PT0S\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.write('\n')
self.f.close()