add resource path to TEXINPUTS so images are included without symlink hacks
[librarian.git] / librarian / epub.py
index 841b7c5..8dc11c7 100644 (file)
@@ -15,10 +15,11 @@ from lxml import etree
 import zipfile
 from tempfile import mkdtemp, NamedTemporaryFile
 from shutil import rmtree
 import zipfile
 from tempfile import mkdtemp, NamedTemporaryFile
 from shutil import rmtree
+from mimetypes import guess_type
 
 from librarian import RDFNS, WLNS, NCXNS, OPFNS, XHTMLNS, OutputFile
 from librarian.cover import WLCover, FutureOfCopyrightCover
 
 from librarian import RDFNS, WLNS, NCXNS, OPFNS, XHTMLNS, OutputFile
 from librarian.cover import WLCover, FutureOfCopyrightCover
-
+from librarian.latex import LatexFragment
 from librarian import functions, get_resource
 
 functions.reg_person_name()
 from librarian import functions, get_resource
 
 functions.reg_person_name()
@@ -329,9 +330,27 @@ def transform_chunk(chunk_xml, chunk_no, annotations, empty=False, _empty_html_s
     return output_html, toc, chars
 
 
     return output_html, toc, chars
 
 
+def render_latex(wldoc, prefix="latex"):
+    """
+    Renders <latex>CODE</latex> as images and returns
+    (changed_wldoc, [ (epub_filepath1, latexfragment_object1), ... ]
+"""
+    root = wldoc.edoc.getroot()
+    latex_nodes = root.findall(".//latex")
+    images = []
+    for ln in latex_nodes:
+        fragment = LatexFragment(ln.text, resize=40)
+        images.append((os.path.join(prefix, fragment.filename), fragment))
+        ln.tag = "img"
+        ln.text = os.path.join(prefix, fragment.filename)
+        
+    return wldoc, images
+        
+
 def transform(wldoc, verbose=False,
               style=None, html_toc=False,
 def transform(wldoc, verbose=False,
               style=None, html_toc=False,
-              sample=None, cover=None, flags=None, resources=None):
+              sample=None, cover=None, flags=None, resources=None,
+              intro_file=None, cover_file=None):
     """ produces a EPUB file
 
     sample=n: generate sample e-book (with at least n paragraphs)
     """ produces a EPUB file
 
     sample=n: generate sample e-book (with at least n paragraphs)
@@ -355,7 +374,7 @@ def transform(wldoc, verbose=False,
             zip.writestr('OPS/title.html',
                  etree.tostring(html_tree, method="html", pretty_print=True))
             # add a title page TOC entry
             zip.writestr('OPS/title.html',
                  etree.tostring(html_tree, method="html", pretty_print=True))
             # add a title page TOC entry
-            toc.add(u"Title", "title.html")
+            toc.add(u"Tytuł", "title.html")
         elif wldoc.book_info.parts:
             # write title page for every parent
             if sample is not None and sample <= 0:
         elif wldoc.book_info.parts:
             # write title page for every parent
             if sample is not None and sample <= 0:
@@ -441,6 +460,12 @@ def transform(wldoc, verbose=False,
     if not style:
         style = get_resource('epub/style.css')
     zip.write(style, os.path.join('OPS', 'style.css'))
     if not style:
         style = get_resource('epub/style.css')
     zip.write(style, os.path.join('OPS', 'style.css'))
+
+    document, latex_images = render_latex(document)
+    for image in latex_images:
+        zip.write(image[1].path, os.path.join('OPS', image[0]))
+        image[1].remove()
+
     if resources:
         if os.path.isdir(resources):
             for dp, dirs, files in os.walk(resources):
     if resources:
         if os.path.isdir(resources):
             for dp, dirs, files in os.walk(resources):
@@ -448,6 +473,9 @@ def transform(wldoc, verbose=False,
                     fpath  = os.path.join(dp, fname)
                     if os.path.isfile(fpath):
                         zip.write(fpath, os.path.join('OPS', fname))
                     fpath  = os.path.join(dp, fname)
                     if os.path.isfile(fpath):
                         zip.write(fpath, os.path.join('OPS', fname))
+                        manifest.append(etree.fromstring(
+                                '<item id="%s" href="%s" media-type="%s" />' % (os.path.splitext(fname)[0], fname, guess_type(fpath)[0])))
+
         else:
             print "resources path %s is not directory" % resources
                 
         else:
             print "resources path %s is not directory" % resources
                 
@@ -494,10 +522,20 @@ def transform(wldoc, verbose=False,
     nav_map = toc_file[-1]
 
     manifest.append(etree.fromstring(
     nav_map = toc_file[-1]
 
     manifest.append(etree.fromstring(
-        '<item id="intro" href="intro.html" media-type="application/xhtml+xml" />'))
+        '<item id="first" href="first.html" media-type="application/xhtml+xml" />'))
     spine.append(etree.fromstring(
     spine.append(etree.fromstring(
-        '<itemref idref="intro" />'))
-    zip.writestr('OPS/intro.html', open(get_resource('epub/intro.html')).read())
+        '<itemref idref="first" />'))
+    html_tree = xslt(document.edoc, get_resource('epub/xsltFirst.xsl'))
+#    chars.update(used_chars(html_tree.getroot()))
+    zip.writestr('OPS/first.html', etree.tostring(
+                        html_tree, method="html", pretty_print=True))
+
+    if intro_file:
+        manifest.append(etree.fromstring(
+                '<item id="intro" href="intro.html" media-type="application/xhtml+xml" />'))
+        spine.append(etree.fromstring(
+                '<itemref idref="intro" />'))
+        zip.writestr('OPS/intro.html', open(intro_file or get_resource('epub/intro.html')).read())
 
 
     if html_toc:
 
 
     if html_toc:
@@ -509,12 +547,14 @@ def transform(wldoc, verbose=False,
 
     toc, chunk_counter, chars, sample = transform_file(document, sample=sample)
 
 
     toc, chunk_counter, chars, sample = transform_file(document, sample=sample)
 
+    toc.add("Informacje redakcyjne", "first.html", index=0)
+
     if len(toc.children) < 2:
     if len(toc.children) < 2:
-        toc.add(u"Beginning of the book", "part1.html")
+        toc.add(u"Początek książki", "part1.html")
 
     # Last modifications in container files and EPUB creation
     if len(annotations) > 0:
 
     # Last modifications in container files and EPUB creation
     if len(annotations) > 0:
-        toc.add("Footnotes", "annotations.html")
+        toc.add("Przypisy", "annotations.html")
         manifest.append(etree.fromstring(
             '<item id="annotations" href="annotations.html" media-type="application/xhtml+xml" />'))
         spine.append(etree.fromstring(
         manifest.append(etree.fromstring(
             '<item id="annotations" href="annotations.html" media-type="application/xhtml+xml" />'))
         spine.append(etree.fromstring(
@@ -534,7 +574,7 @@ def transform(wldoc, verbose=False,
     # chars.update(used_chars(etree.fromstring(html_string)))
     # zip.writestr('OPS/support.html', html_string)
 
     # chars.update(used_chars(etree.fromstring(html_string)))
     # zip.writestr('OPS/support.html', html_string)
 
-    toc.add("Editors", "last.html")
+    toc.add("Informacje redakcyjne", "last.html")
     manifest.append(etree.fromstring(
         '<item id="last" href="last.html" media-type="application/xhtml+xml" />'))
     spine.append(etree.fromstring(
     manifest.append(etree.fromstring(
         '<item id="last" href="last.html" media-type="application/xhtml+xml" />'))
     spine.append(etree.fromstring(
@@ -582,7 +622,7 @@ def transform(wldoc, verbose=False,
 
     # write TOC
     if html_toc:
 
     # write TOC
     if html_toc:
-        toc.add(u"Table of Contents", "toc.html", index=1)
+        toc.add(u"Spis treści", "toc.html", index=1)
         zip.writestr('OPS/toc.html', toc.html().encode('utf-8'))
     toc.write_to_xml(nav_map)
     zip.writestr('OPS/toc.ncx', etree.tostring(toc_file, pretty_print=True))
         zip.writestr('OPS/toc.html', toc.html().encode('utf-8'))
     toc.write_to_xml(nav_map)
     zip.writestr('OPS/toc.ncx', etree.tostring(toc_file, pretty_print=True))