slowniczek in pdf
[librarian.git] / librarian / pyhtml.py
index de04fc0..6d1e914 100644 (file)
@@ -9,7 +9,9 @@ from xmlutils import Xmill, tag, tagged, ifoption, tag_open_close
 from librarian import functions
 import re
 import random
+from copy import deepcopy
 
+IMAGE_THUMB_WIDTH = 300
 
 class EduModule(Xmill):
     def __init__(self, options=None):
@@ -65,11 +67,12 @@ class EduModule(Xmill):
             toc.append("<li>%s</li>" % atxt)
         toc = "<ul class='toc'>%s</ul>" % "".join(toc)
         add_header = "Lekcja: " if self.options['wldoc'].book_info.type in ('course', 'synthetic') else ''
-        return "<h1 class='title'>%s" % add_header, "</h1>" + toc
+        return "<h1 class='title'><a name='top'></a>%s" % add_header, "</h1>" + toc
 
-    @tagged("h2")
     def handle_naglowek_rozdzial(self, element):
-        return "", "".join(tag_open_close("a", name=self.naglowek_to_anchor(element)))
+        return_to_top = u"<a href='#top' class='top-link'>wróć do spisu treści</a>"
+        anchor = "".join(tag_open_close("a", name=self.naglowek_to_anchor(element)))
+        return return_to_top + "<h2>", anchor + "</h2>"
 
     def handle_uwaga(self, _e):
         return None
@@ -255,12 +258,28 @@ u"""%(wskazowki)s
 
             return u"<a href='%s'>" % def_href, u'%s</a>%s' % (def_err, more_links)
 
+    def handle_obraz(self, element):
+        name = element.attrib.get('nazwa', '').strip()
+        if not name:
+            print '!! <obraz> missing "nazwa"'
+            return
+        alt = element.attrib.get('alt', '')
+        if not alt:
+            print '** <obraz> missing "alt"'
+        slug, ext = name.rsplit('.', 1)
+        url = self.options['urlmapper'].url_for_image(slug, ext)
+        thumb_url = self.options['urlmapper'].url_for_image(slug, ext, IMAGE_THUMB_WIDTH)
+        e = etree.Element("a", attrib={"href": url, "class": "image"})
+        e.append(etree.Element("img", attrib={"src": thumb_url, "alt": alt,
+                    "width": str(IMAGE_THUMB_WIDTH)}))
+        return etree.tostring(e, encoding=unicode), u""
+
     def handle_video(self, element):
         url = element.attrib.get('url')
         if not url:
             print '!! <video> missing url'
             return
-        m = re.match(r'https?://(?:www.)?youtube.com/watch\?(?:.*&)?v=([^&]+)(?:$|&)', url)
+        m = re.match(r'(?:https?://)?(?:www.)?youtube.com/watch\?(?:.*&)?v=([^&]+)(?:$|&)', url)
         if not m:
             print '!! unknown <video> url scheme:', url
             return
@@ -344,14 +363,16 @@ class Exercise(EduModule):
     def get_instruction(self):
         if not self.instruction_printed:
             self.instruction_printed = True
-            return u'<span class="instruction">%s</span>' % self.INSTRUCTION
+            if self.INSTRUCTION:
+                return u'<span class="instruction">%s</span>' % self.INSTRUCTION
+            else:
+                return ""
         else:
             return ""
 
 
 
 class Wybor(Exercise):
-    INSTRUCTION = None
     def handle_cwiczenie(self, element):
         pre, post = super(Wybor, self).handle_cwiczenie(element)
         is_single_choice = True
@@ -424,12 +445,10 @@ class Luki(Exercise):
         return question.xpath(".//luka")
 
     def solution_html(self, piece):
+        piece = deepcopy(piece)
+        piece.tail = None
         sub = EduModule()
         return sub.generate(piece)
-        # print piece.text
-        # return piece.text + ''.join(
-        #     [etree.tostring(n, encoding=unicode)
-        #      for n in piece])
 
     def handle_pytanie(self, element):
         qpre, qpost = super(Luki, self).handle_pytanie(element)
@@ -474,7 +493,6 @@ class Przyporzadkuj(Exercise):
                    u"Kliknij numer odpowiedzi, przeciągnij i upuść w wybranym polu."]
 
     def get_instruction(self):
-        print self.options['handles']
         if not self.instruction_printed:
             self.instruction_printed = True
             return u'<span class="instruction">%s</span>' % self.INSTRUCTION[self.options['handles'] and 1 or 0]
@@ -582,6 +600,9 @@ class EduModuleFormat(Format):
     def url_for_material(self, slug, fmt):
         return "%s.%s" % (slug, fmt)
 
+    def url_for_image(self, slug, fmt, width=None):
+        return self.url_for_material(self, slug, fmt)
+
 
 def transform(wldoc, stylesheet='edumed', options=None, flags=None):
     """Transforms the WL document to XHTML.