1
# -*- coding: utf-8 -*-
4
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
5
__docformat__ = 'restructuredtext en'
8
Transform OEB content into RB compatible markup.
14
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace
15
from calibre.ebooks.oeb.stylizer import Stylizer
48
('font-weight', {'bold' : 'b', 'bolder' : 'b'}),
49
('font-style', {'italic' : 'i'}),
50
('text-align', {'center' : 'center'}),
53
class RBMLizer(object):
55
def __init__(self, log, name_map={}):
57
self.name_map = name_map
59
def extract_content(self, oeb_book, opts):
60
self.log.info('Converting XHTML to RB markup...')
61
self.oeb_book = oeb_book
63
return self.mlize_spine()
66
def mlize_spine(self):
67
output = u'<HTML><HEAD><TITLE></TITLE></HEAD><BODY>'
68
if 'titlepage' in self.oeb_book.guide:
69
self.log.debug('Generating cover page...')
70
href = self.oeb_book.guide['titlepage'].href
71
item = self.oeb_book.manifest.hrefs[href]
72
if item.spine_position is None:
73
stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts.output_profile)
74
output += self.dump_text(item.data.find(XHTML('body')), stylizer)
75
for item in self.oeb_book.spine:
76
self.log.debug('Converting %s to RocketBook HTML...' % item.href)
77
stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts.output_profile)
78
output += self.add_page_anchor(item.href)
79
output += self.dump_text(item.data.find(XHTML('body')), stylizer)
80
output += u'</BODY></HTML>'
81
output = self.clean_text(output)
84
def add_page_anchor(self, href):
85
href = os.path.splitext(os.path.basename(href))[0]
86
return u'<A NAME="%s"></A>' % href
88
def clean_text(self, text):
89
# Remove anchors that do not have links
90
anchors = set(re.findall(r'(?<=<A NAME=").+?(?="></A>)', text))
91
links = set(re.findall(r'(?<=<A HREF="#).+?(?=">)', text))
92
for unused in anchors.difference(links):
93
text = text.replace('<A NAME="%s"></A>' % unused, '')
97
def dump_text(self, elem, stylizer, tag_stack=[]):
98
if not isinstance(elem.tag, basestring) \
99
or namespace(elem.tag) != XHTML_NS:
103
style = stylizer.style(elem)
105
if style['display'] in ('none', 'oeb-page-head', 'oeb-page-foot') \
106
or style['visibility'] == 'hidden':
109
tag = barename(elem.tag)
112
# Process tags that need special processing and that do not have inner
113
# text. Usually these require an argument
115
src = os.path.basename(elem.get('src'))
116
name = self.name_map.get(src, src)
117
text += '<IMG SRC="%s">' % name
119
rb_tag = tag.upper() if tag in TAGS else None
122
text += '<%s>' % rb_tag
123
tag_stack.append(rb_tag)
126
href = elem.get('href')
128
if '://' not in href:
130
href = href.partition('#')[2]
131
href = os.path.splitext(os.path.basename(href))[0]
133
text += '<A HREF="#%s">' % href
134
tag_stack.append('A')
137
id_name = elem.get('id')
139
text += '<A NAME="%s"></A>' % os.path.splitext(id_name)[0]
141
# Processes style information
143
style_tag = s[1].get(style[s[0]], None)
145
style_tag = style_tag.upper()
147
text += '<%s>' % style_tag
148
tag_stack.append(style_tag)
150
# Proccess tags that contain text.
151
if hasattr(elem, 'text') and elem.text != None and elem.text.strip() != '':
155
text += self.dump_text(item, stylizer, tag_stack)
158
for i in range(0, tag_count):
159
close_tag_list.insert(0, tag_stack.pop())
161
text += self.close_tags(close_tag_list)
163
if hasattr(elem, 'tail') and elem.tail != None and elem.tail.strip() != '':
168
def close_tags(self, tags):
170
for i in range(0, len(tags)):
172
text += '</%s>' % tag