X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/1704f1ee2a43803f965c913c2cb88307b9bb820e..a67b6e3ad2751083a433228454665c212c9a5a1e:/librarian/epub.py diff --git a/librarian/epub.py b/librarian/epub.py index cdb5aae..e992f40 100644 --- a/librarian/epub.py +++ b/librarian/epub.py @@ -7,38 +7,22 @@ from __future__ import with_statement import os import os.path +import subprocess from copy import deepcopy from lxml import etree import zipfile +from tempfile import mkdtemp +from shutil import rmtree -from librarian import XMLNamespace, RDFNS, DCNS, WLNS, NoDublinCore -from librarian.dcparser import BookInfo - -NCXNS = XMLNamespace("http://www.daisy.org/z3986/2005/ncx/") -OPFNS = XMLNamespace("http://www.idpf.org/2007/opf") - - -class DocProvider(object): - class DoesNotExist(Exception): - pass - - def by_slug(self, slug): - raise NotImplemented - - def __getitem__(self, slug): - return self.by_slug(slug) - - def by_uri(self, uri): - return self.by_slug(uri.rsplit('/', 1)[1]) +import sys +sys.path.append('..') # for running from working copy +from librarian import XMLNamespace, RDFNS, DCNS, WLNS, NCXNS, OPFNS, NoDublinCore +from librarian.dcparser import BookInfo -class DirDocProvider(DocProvider): - def __init__(self, dir): - self.dir = dir - self.files = {} +from librarian import functions - def by_slug(self, slug): - return open(os.path.join(self.dir, '%s.xml' % slug)) +functions.reg_person_name() def inner_xml(node): @@ -229,6 +213,14 @@ class TOC(object): return counter +def used_chars(element): + """ Lists characters used in an ETree Element """ + chars = set((element.text or '') + (element.tail or '')) + for child in element: + chars = chars.union(used_chars(child)) + return chars + + def chop(main_text): """ divide main content of the XML file into chunks """ @@ -254,7 +246,7 @@ def chop(main_text): def transform_chunk(chunk_xml, chunk_no, annotations): - """ transforms one chunk, returns a HTML string and a TOC object """ + """ transforms one chunk, returns a HTML string, a TOC object and a set of used characters """ toc = TOC() for element in chunk_xml[0]: @@ -265,8 +257,10 @@ def transform_chunk(chunk_xml, chunk_no, annotations): element.set('sub', str(subnumber)) find_annotations(annotations, chunk_xml, chunk_no) replace_by_verse(chunk_xml) - output_html = etree.tostring(xslt(chunk_xml, res('xsltScheme.xsl')), pretty_print=True) - return output_html, toc + html_tree = xslt(chunk_xml, res('xsltScheme.xsl')) + chars = used_chars(html_tree.getroot()) + output_html = etree.tostring(html_tree, pretty_print=True) + return output_html, toc, chars def transform(provider, slug, output_file=None, output_dir=None): @@ -285,14 +279,19 @@ def transform(provider, slug, output_file=None, output_dir=None): # every input file will have a TOC entry, # pointing to starting chunk toc = TOC(node_name(input_xml.find('.//'+DCNS('title'))), chunk_counter) + chars = set() if first: # write book title page + html_tree = xslt(input_xml, res('xsltTitle.xsl')) + chars = used_chars(html_tree.getroot()) zip.writestr('OPS/title.html', - etree.tostring(xslt(input_xml, res('xsltTitle.xsl')), pretty_print=True)) + etree.tostring(html_tree, pretty_print=True)) elif children: # write title page for every parent + html_tree = xslt(input_xml, res('xsltChunkTitle.xsl')) + chars = used_chars(html_tree.getroot()) zip.writestr('OPS/part%d.html' % chunk_counter, - etree.tostring(xslt(input_xml, res('xsltChunkTitle.xsl')), pretty_print=True)) + etree.tostring(html_tree, pretty_print=True)) add_to_manifest(manifest, chunk_counter) add_to_spine(spine, chunk_counter) chunk_counter += 1 @@ -309,9 +308,10 @@ def transform(provider, slug, output_file=None, output_dir=None): if main_text is not None: replace_characters(main_text) - for chunk_no, chunk_xml in enumerate(chop(main_text), chunk_counter): - chunk_html, chunk_toc = transform_chunk(chunk_xml, chunk_counter, annotations) + for chunk_xml in chop(main_text): + chunk_html, chunk_toc, chunk_chars = transform_chunk(chunk_xml, chunk_counter, annotations) toc.extend(chunk_toc) + chars = chars.union(chunk_chars) zip.writestr('OPS/part%d.html' % chunk_counter, chunk_html) add_to_manifest(manifest, chunk_counter) add_to_spine(spine, chunk_counter) @@ -320,10 +320,11 @@ def transform(provider, slug, output_file=None, output_dir=None): if children: for child in children: child_xml = etree.parse(provider.by_uri(child)) - child_toc, chunk_counter = transform_file(child_xml, chunk_counter, first=False) + child_toc, chunk_counter, chunk_chars = transform_file(child_xml, chunk_counter, first=False) toc.append(child_toc) + chars = chars.union(chunk_chars) - return toc, chunk_counter + return toc, chunk_counter, chars # read metadata from the first file input_xml = etree.parse(provider[slug]) @@ -372,13 +373,14 @@ def transform(provider, slug, output_file=None, output_dir=None): 'version="2005-1">