X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/18a72965fc7b90155130e87d4f1a4dd4aa354549..c69605017947202b0bbd0a2a2335cb37752141b9:/librarian/epub.py diff --git a/librarian/epub.py b/librarian/epub.py index 666bcc9..527d050 100644 --- a/librarian/epub.py +++ b/librarian/epub.py @@ -8,6 +8,7 @@ from __future__ import with_statement import os import os.path import subprocess +from StringIO import StringIO from copy import deepcopy from lxml import etree import zipfile @@ -105,7 +106,7 @@ def find_annotations(annotations, source, part_no): child.clear() child.tail = tail child.text = number - if child.tag not in ('extra', 'podtytul'): + if child.tag not in ('extra',): find_annotations(annotations, child, part_no) @@ -264,7 +265,8 @@ def transform_chunk(chunk_xml, chunk_no, annotations, empty=False, _empty_html_s return output_html, toc, chars -def transform(provider, slug=None, file_path=None, output_file=None, output_dir=None, make_dir=False, verbose=False, sample=None): +def transform(provider, slug=None, file_path=None, output_file=None, output_dir=None, make_dir=False, verbose=False, + sample=None, cover_fn=None, flags=None): """ produces a EPUB file provider: a DocProvider @@ -273,6 +275,8 @@ def transform(provider, slug=None, file_path=None, output_file=None, output_dir= output_dir: path to directory to save output file to; either this or output_file must be present make_dir: writes output to //.epub instead of /.epub sample=n: generate sample e-book (with at least n paragraphs) + cover_fn: function(author, title) -> cover image + flags: less-advertising, """ def transform_file(input_xml, chunk_counter=1, first=True, sample=None): @@ -353,6 +357,10 @@ def transform(provider, slug=None, file_path=None, output_file=None, output_dir= raise ValueError('either slug or file_path should be specified') input_xml = etree.parse(provider[slug]) + if flags: + for flag in flags: + input_xml.getroot().set(flag, 'yes') + metadata = input_xml.find('.//'+RDFNS('Description')) if metadata is None: raise NoDublinCore('Document has no DublinCore - which is required.') @@ -393,6 +401,21 @@ def transform(provider, slug=None, file_path=None, output_file=None, output_dir= manifest = opf.find('.//' + OPFNS('manifest')) spine = opf.find('.//' + OPFNS('spine')) + if cover_fn: + cover = StringIO() + cover_fn(book_info.author.readable(), book_info.title).save(cover, format='JPEG') + zip.writestr(os.path.join('OPS', 'cover.jpg'), cover.getvalue()) + del cover + zip.writestr('OPS/cover.html', open(get_resource('epub/cover.html')).read()) + manifest.append(etree.fromstring( + '')) + manifest.append(etree.fromstring( + '')) + spine.insert(0, etree.fromstring('')) + opf.getroot()[0].append(etree.fromstring('')) + opf.getroot().append(etree.fromstring('')) + + annotations = etree.Element('annotations') toc_file = etree.fromstring('Przypisy'\ '' % {'i': toc_counter})) + toc_counter += 1 manifest.append(etree.fromstring( '')) spine.append(etree.fromstring( @@ -425,6 +449,18 @@ def transform(provider, slug=None, file_path=None, output_file=None, output_dir= zip.writestr('OPS/annotations.html', etree.tostring( html_tree, method="html", pretty_print=True)) + nav_map.append(etree.fromstring( + 'Strona redakcyjna'\ + '' % {'i': toc_counter})) + manifest.append(etree.fromstring( + '')) + spine.append(etree.fromstring( + '')) + html_tree = xslt(input_xml, get_resource('epub/xsltLast.xsl')) + chars.update(used_chars(html_tree.getroot())) + zip.writestr('OPS/last.html', etree.tostring( + html_tree, method="html", pretty_print=True)) + # strip fonts tmpdir = mkdtemp('-librarian-epub') cwd = os.getcwd()