clean picture handling TODO: update for new rtf

This commit is contained in:
Sengian 2011-01-07 23:29:35 +01:00
parent 56bb15d6ff
commit be93bd120a

View File

@ -16,7 +16,9 @@
# # # #
######################################################################### #########################################################################
import sys, os, tempfile import sys, os, tempfile
from calibre.ebooks.rtf2xml import copy from calibre.ebooks.rtf2xml import copy
class Pict: class Pict:
"""Process graphic information""" """Process graphic information"""
def __init__(self, def __init__(self,
@ -36,13 +38,11 @@ class Pict:
self.__ob_count = 0 self.__ob_count = 0
self.__cb_count = 0 self.__cb_count = 0
self.__pict_count = 0 self.__pict_count = 0
self.__in_pict = 0 self.__in_pict = False
self.__already_found_pict = 0 self.__already_found_pict = False
self.__orig_file = orig_file self.__orig_file = orig_file
self.__initiate_pict_dict() self.__initiate_pict_dict()
self.__out_file = out_file self.__out_file = out_file
# this is left over
self.__no_ask = 1
def __initiate_pict_dict(self): def __initiate_pict_dict(self):
self.__pict_dict = { self.__pict_dict = {
@ -71,57 +71,43 @@ class Pict:
self.__out_file)) self.__out_file))
else: else:
dir_name = os.path.dirname(self.__orig_file) dir_name = os.path.dirname(self.__orig_file)
# self.__output_to_file_func()
self.__dir_name = base_name + "_rtf_pict_dir/" self.__dir_name = base_name + "_rtf_pict_dir/"
self.__dir_name = os.path.join(dir_name, self.__dir_name) self.__dir_name = os.path.join(dir_name, self.__dir_name)
if not os.path.isdir(self.__dir_name): if not os.path.isdir(self.__dir_name):
try: try:
os.mkdir(self.__dir_name) os.mkdir(self.__dir_name)
except OSError, msg: except OSError, msg:
msg = str(msg) msg = _("%sCouldn't make directory '%s':\n") % (str(msg), self.__dir_name)
msg += "Couldn't make directory '%s':\n" % (self.__dir_name)
raise self.__bug_handler raise self.__bug_handler
else: else:
if self.__no_ask: if self.__run_level > 1:
user_response = 'r' sys.stderr.write(_('Removing files from old pict directory...\n'))
else: all_files = os.listdir(self.__dir_name)
msg = 'Do you want to remove all files in %s?\n' % self.__dir_name for the_file in all_files:
msg += 'Type "r" to remove.\n' the_file = os.path.join(self.__dir_name, the_file)
msg += 'Type any other key to keep files in place.\n' try:
sys.stderr.write(msg) os.remove(the_file)
user_response = raw_input() except OSError:
if user_response == 'r': pass
if self.__run_level > 1: if self.__run_level > 1:
sys.stderr.write('Removing files from old pict directory...\n') sys.stderr.write(_('Files removed.\n'))
all_files = os.listdir(self.__dir_name)
for the_file in all_files:
the_file = os.path.join(self.__dir_name, the_file)
try:
os.remove(the_file)
except OSError:
pass
if self.__run_level > 1:
sys.stderr.write('Files removed.\n')
def __create_pict_file(self): def __create_pict_file(self):
"""Create a file for all the pict data to be written to. """Create a file for all the pict data to be written to.
""" """
self.__pict_file = os.path.join(self.__dir_name, 'picts.rtf') self.__pict_file = os.path.join(self.__dir_name, 'picts.rtf')
write_pic_obj = open(self.__pict_file, 'w')
write_pic_obj.close()
self.__write_pic_obj = open(self.__pict_file, 'a') self.__write_pic_obj = open(self.__pict_file, 'a')
def __in_pict_func(self, line): def __in_pict_func(self, line):
if self.__cb_count == self.__pict_br_count: if self.__cb_count == self.__pict_br_count:
self.__in_pict = 0 self.__in_pict = False
self.__write_pic_obj.write("}\n") self.__write_pic_obj.write("}\n")
return 1 return True
else: else:
action = self.__pict_dict.get(self.__token_info) action = self.__pict_dict.get(self.__token_info)
if action: if action:
line = action(line) self.__write_pic_obj.write(action(line))
self.__write_pic_obj.write(line) return False
return 0
def __default(self, line, write_obj): def __default(self, line, write_obj):
"""Determine if each token marks the beginning of pict data. """Determine if each token marks the beginning of pict data.
@ -142,50 +128,42 @@ class Pict:
write_obj.write('mi<mk<pict-end__\n') write_obj.write('mi<mk<pict-end__\n')
if not self.__already_found_pict: if not self.__already_found_pict:
self.__create_pict_file() self.__create_pict_file()
self.__already_found_pict=1; self.__already_found_pict=True;
self.__print_rtf_header() self.__print_rtf_header()
self.__in_pict = 1 self.__in_pict = 1
self.__pict_br_count = self.__ob_count self.__pict_br_count = self.__ob_count
self.__cb_count = 0 self.__cb_count = 0
self.__write_pic_obj.write("{\\pict\n") self.__write_pic_obj.write("{\\pict\n")
return 0 return False
return 1 return True
def __print_rtf_header(self): def __print_rtf_header(self):
"""Print to pict file the necessary RTF data for the file to be """Print to pict file the necessary RTF data for the file to be
recognized as an RTF file. recognized as an RTF file.
""" """
self.__write_pic_obj.write("{\\rtf1 \n") self.__write_pic_obj.write("{\\rtf1 \n{\\fonttbl\\f0\\null;} \n")
self.__write_pic_obj.write("{\\fonttbl\\f0\\null;} \n") self.__write_pic_obj.write("{\\colortbl\\red255\\green255\\blue255;} \n\\pard \n")
self.__write_pic_obj.write("{\\colortbl\\red255\\green255\\blue255;} \n")
self.__write_pic_obj.write("\\pard \n")
def process_pict(self): def process_pict(self):
self.__make_dir() self.__make_dir()
read_obj = open(self.__file) with open(self.__file) as read_obj, open(self.__write_to, 'w') as write_obj:
write_obj = open(self.__write_to, 'w') for line in read_obj:
line_to_read = 'dummy' self.__token_info = line[:16]
while line_to_read: if self.__token_info == 'ob<nu<open-brack':
line_to_read = read_obj.readline() self.__ob_count = line[-5:-1]
line = line_to_read if self.__token_info == 'cb<nu<clos-brack':
self.__token_info = line[:16] self.__cb_count = line[-5:-1]
if self.__token_info == 'ob<nu<open-brack': if not self.__in_pict:
self.__ob_count = line[-5:-1] to_print = self.__default(line, write_obj)
if self.__token_info == 'cb<nu<clos-brack': if to_print :
self.__cb_count = line[-5:-1] write_obj.write(line)
if not self.__in_pict: else:
to_print = self.__default(line, write_obj) to_print = self.__in_pict_func(line)
if to_print : if to_print :
write_obj.write(line) write_obj.write(line)
else: if self.__already_found_pict:
to_print = self.__in_pict_func(line) self.__write_pic_obj.write("}\n")
if to_print : self.__write_pic_obj.close()
write_obj.write(line)
if self.__already_found_pict:
self.__write_pic_obj.write("}\n")
self.__write_pic_obj.close()
read_obj.close()
write_obj.close()
copy_obj = copy.Copy(bug_handler = self.__bug_handler) copy_obj = copy.Copy(bug_handler = self.__bug_handler)
if self.__copy: if self.__copy:
copy_obj.copy_file(self.__write_to, "pict.data") copy_obj.copy_file(self.__write_to, "pict.data")