import os
from ebooklib import epub
from django.conf import settings
from typogrify.filters import typogrify
def generate_epub_file(f):
book = epub.EpubBook()
# add metadata
book.set_identifier('lux23')
book.set_title(f.title)
book.set_language('en')
book.add_author('Scott Gilbertson')
# intro chapter
c1 = epub.EpubHtml(title='Introduction', file_name='intro.xhtml', lang='en')
c1.content = u'
Forward
Thank you for downloading my story %s. I hope you enjoy it and please feel free to email me if you have any questions or comments.
If you enjoy this story and would like to read more, head on over to luxagraf.net.
– Scott Gilbertson
sng@luxagraf.net
' % f.title
# chapter
c2 = epub.EpubHtml(title=f.title, file_name='story.xhtml')
c2.content = '%s
' % f.title
c2.content += typogrify(f.body_html)
# add chapters to the book
book.add_item(c1)
book.add_item(c2)
# create table of contents
# - add section
# - add auto created links to chapters
book.toc = (epub.Link('intro.xhtml', 'Introduction', 'intro'),
epub.Link('story.xhtml', f.title, 'story'),
)
# add navigation files
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
# define css style
style = '''
@namespace epub "http://www.idpf.org/2007/ops";
body {
font-family: Georgia, Times, Times New Roman, serif;
}
h2 {
text-align: left;
text-transform: uppercase;
font-weight: 200;
}
ol {
list-style-type: none;
}
ol > li:first-child {
margin-top: 0.3em;
}
nav[epub|type~='toc'] > ol > li > ol {
list-style-type:square;
}
nav[epub|type~='toc'] > ol > li > ol > li {
margin-top: 0.3em;
}
'''
# add css file
nav_css = epub.EpubItem(uid="style_nav", file_name="style/nav.css", media_type="text/css", content=style)
book.add_item(nav_css)
# create spine
book.spine = ['nav', c1, c2]
path, filename = os.path.split(f.get_absolute_url())
fpath = '%s%s/' % (settings.FLATFILES_ROOT, path)
if not os.path.isdir(fpath):
os.makedirs(fpath)
bk = '%s%s.epub' % (fpath, f.slug)
# create epub file
epub.write_epub(bk, book, {})