mirror of
https://github.com/gryf/ebook-converter.git
synced 2026-01-05 18:54:11 +01:00
Here is the first batch of modules, which are needed for converting several formats to LRF. Some of the logic has been change, more cleanups will follow.
158 lines
5.6 KiB
Python
158 lines
5.6 KiB
Python
from __future__ import unicode_literals, absolute_import, print_function, division
|
|
#########################################################################
|
|
# #
|
|
# #
|
|
# copyright 2002 Paul Henry Tremblay #
|
|
# #
|
|
# 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. #
|
|
# #
|
|
# #
|
|
#########################################################################
|
|
import sys,os
|
|
|
|
from ebook_converter.ebooks.rtf2xml import copy
|
|
from . import open_for_read, open_for_write
|
|
|
|
|
|
class Preamble:
|
|
"""
|
|
Fix the reamaing parts of the preamble. This module does very little. It
|
|
makes sure that no text gets put in the revision of list table. In the
|
|
future, when I understand how to interpret the revision table and list
|
|
table, I will make these methods more functional.
|
|
"""
|
|
|
|
def __init__(self, file,
|
|
bug_handler,
|
|
platform,
|
|
default_font,
|
|
code_page,
|
|
copy=None,
|
|
temp_dir=None,
|
|
):
|
|
"""
|
|
Required:
|
|
file--file to parse
|
|
platform --Windows or Macintosh
|
|
default_font -- the default font
|
|
code_page --the code page (ansi1252, for example)
|
|
Optional:
|
|
'copy'-- whether to make a copy of result for debugging
|
|
'temp_dir' --where to output temporary results (default is
|
|
directory from which the script is run.)
|
|
Returns:
|
|
nothing
|
|
"""
|
|
self.__file=file
|
|
self.__bug_handler = bug_handler
|
|
self.__copy = copy
|
|
self.__default_font = default_font
|
|
self.__code_page = code_page
|
|
self.__platform = platform
|
|
if temp_dir:
|
|
self.__write_to = os.path.join(temp_dir,"info_table_info.data")
|
|
else:
|
|
self.__write_to = "info_table_info.data"
|
|
|
|
def __initiate_values(self):
|
|
"""
|
|
Initiate all values.
|
|
"""
|
|
self.__state = 'default'
|
|
self.__text_string = ''
|
|
self.__state_dict = {
|
|
'default' : self.__default_func,
|
|
'revision' : self.__revision_table_func,
|
|
'list_table' : self.__list_table_func,
|
|
'body' : self.__body_func,
|
|
}
|
|
self.__default_dict = {
|
|
'mi<mk<rtfhed-beg' : self.__found_rtf_head_func,
|
|
'mi<mk<listabbeg_' : self.__found_list_table_func,
|
|
'mi<mk<revtbl-beg' : self.__found_revision_table_func,
|
|
'mi<mk<body-open_' : self.__found_body_func,
|
|
}
|
|
|
|
def __default_func(self, line):
|
|
action = self.__default_dict.get(self.__token_info)
|
|
if action:
|
|
action(line)
|
|
else:
|
|
self.__write_obj.write(line)
|
|
|
|
def __found_rtf_head_func(self, line):
|
|
"""
|
|
Requires:
|
|
line -- the line to parse
|
|
Returns:
|
|
nothing.
|
|
Logic:
|
|
Write to the output file the default font info, the code page
|
|
info, and the platform info.
|
|
"""
|
|
self.__write_obj.write(
|
|
'mi<tg<empty-att_<rtf-definition'
|
|
'<default-font>%s<code-page>%s'
|
|
'<platform>%s\n' % (self.__default_font, self.__code_page,
|
|
self.__platform)
|
|
)
|
|
|
|
def __found_list_table_func(self, line):
|
|
self.__state = 'list_table'
|
|
|
|
def __list_table_func(self, line):
|
|
if self.__token_info == 'mi<mk<listabend_':
|
|
self.__state = 'default'
|
|
elif line[0:2] == 'tx':
|
|
pass
|
|
else:
|
|
self.__write_obj.write(line)
|
|
|
|
def __found_revision_table_func(self, line):
|
|
self.__state = 'revision'
|
|
|
|
def __revision_table_func(self, line):
|
|
if self.__token_info == 'mi<mk<revtbl-end':
|
|
self.__state = 'default'
|
|
elif line[0:2] == 'tx':
|
|
pass
|
|
else:
|
|
self.__write_obj.write(line)
|
|
|
|
def __found_body_func(self, line):
|
|
self.__state = 'body'
|
|
self.__write_obj.write(line)
|
|
|
|
def __body_func(self, line):
|
|
self.__write_obj.write(line)
|
|
|
|
def fix_preamble(self):
|
|
"""
|
|
Requires:
|
|
nothing
|
|
Returns:
|
|
nothing (changes the original file)
|
|
Logic:
|
|
Read one line in at a time. Determine what action to take based on
|
|
the state. The state can either be defaut, the revision table, or
|
|
the list table.
|
|
"""
|
|
self.__initiate_values()
|
|
with open_for_read(self.__file) as read_obj:
|
|
with open_for_write(self.__write_to) as self.__write_obj:
|
|
for line in read_obj:
|
|
self.__token_info = line[:16]
|
|
action = self.__state_dict.get(self.__state)
|
|
if action is None:
|
|
sys.stderr.write(
|
|
'no matching state in module preamble_rest.py\n' + self.__state + '\n')
|
|
action(line)
|
|
copy_obj = copy.Copy(bug_handler=self.__bug_handler)
|
|
if self.__copy:
|
|
copy_obj.copy_file(self.__write_to, "preamble_div.data")
|
|
copy_obj.rename(self.__write_to, self.__file)
|
|
os.remove(self.__write_to)
|