Don't show activity counter if it's not adjacent to another activity (PDF)
[librarian.git] / librarian / pyhtml.py
index 1f1f3df..900d068 100644 (file)
@@ -28,6 +28,7 @@ class EduModule(Xmill):
     def __init__(self, options=None):
         super(EduModule, self).__init__(options)
         self.activity_counter = 0
+        self.activity_last = None
         self.exercise_counter = 0
 
         # text filters
@@ -36,7 +37,7 @@ class EduModule(Xmill):
                 txt = txt.replace("/\n", "<br/>\n")
             return txt
         self.register_text_filter(functions.substitute_entities)
-        self.register_text_filter(swap_endlines)
+        self.register_escaped_text_filter(swap_endlines)
 
     @tagged('div', 'stanza')
     def handle_strofa(self, element):
@@ -58,7 +59,7 @@ class EduModule(Xmill):
     handle_podtytul = tag("span", "subtitle")
     handle_naglowek_akt = handle_naglowek_czesc = handle_srodtytul = tag("h2")
     handle_naglowek_scena = tag('h2')
-    handle_naglowek_osoba = handle_naglowek_podrozdzial = tag('h3')
+    handle_naglowek_osoba = tag('h3')
     handle_akap = handle_akap_dialog = handle_akap_cd = tag('p', 'paragraph')
 
     handle_wyroznienie = tag('em')
@@ -82,6 +83,10 @@ class EduModule(Xmill):
         pre, post = tag_open_close("h2", id=naglowek_to_anchor(element))
         return return_to_top + pre, post
 
+    def handle_naglowek_podrozdzial(self, element):
+        self.activity_counter = 0
+        return tag('h3')(self, element)
+
     def handle_uwaga(self, _e):
         return None
 
@@ -93,7 +98,10 @@ class EduModule(Xmill):
             }
         submill = EduModule(dict(self.options.items() + {'sub_gen': True}.items()))
 
-        opis = submill.generate(element.xpath('opis')[0])
+        if element.xpath('opis'):
+            opis = submill.generate(element.xpath('opis')[0])
+        else:
+            opis = ''
 
         n = element.xpath('wskazowki')
         if n: wskazowki = submill.generate(n[0])
@@ -110,10 +118,17 @@ class EduModule(Xmill):
 
         counter = self.activity_counter
 
+        if element.getnext().tag == 'aktywnosc' or self.activity_last.getnext() == element:
+            counter_html = """<span class="act_counter">%(counter)d.</span>""" % locals()
+        else:
+            counter_html = ''
+
+        self.activity_last = element
+
         return u"""
 <div class="activity">
  <div class="text">
-  <span class="act_counter">%(counter)d.</span>
+  %(counter_html)s
   %(opis)s""" % locals(), \
 u"""%(wskazowki)s
  </div>
@@ -396,13 +411,13 @@ class Wybor(Exercise):
         if not pytania:
             pytania = [element]
         for p in pytania:
-            solutions = re.split(r"[, ]+", p.attrib['rozw'])
+            solutions = re.split(r"[, ]+", p.attrib.get('rozw', ''))
             if len(solutions) != 1:
                 is_single_choice = False
                 break
             choices = p.xpath(".//*[@nazwa]")
             uniq = set()
-            for n in choices: uniq.add(n.attrib['nazwa'])
+            for n in choices: uniq.add(n.attrib.get('nazwa', ''))
             if len(choices) != len(uniq):
                 is_single_choice = False
                 break
@@ -496,7 +511,7 @@ class Zastap(Luki):
         return question.xpath(".//zastap")
 
     def solution_html(self, piece):
-        return piece.attrib['rozw']
+        return piece.attrib.get('rozw', '')
 
     def handle_zastap(self, element):
         self.piece_counter += 1
@@ -551,16 +566,16 @@ class Przyporzadkuj(Exercise):
         if self.options['subject']:
             self.piece_counter += 1
             if self.options['handles']:
-                return '<li><span data-solution="%s" data-no="%s" class="question-piece draggable handle add-li">%s</span>' % (element.attrib['rozw'], self.piece_counter, self.piece_counter), '</li>'
+                return '<li><span data-solution="%s" data-no="%s" class="question-piece draggable handle add-li">%s</span>' % (element.attrib.get('rozw', ''), self.piece_counter, self.piece_counter), '</li>'
             else:
-                return '<li data-solution="%s" data-no="%s" class="question-piece draggable">' % (element.attrib['rozw'], self.piece_counter), '</li>'
+                return '<li data-solution="%s" data-no="%s" class="question-piece draggable">' % (element.attrib.get('rozw', ''), self.piece_counter), '</li>'
 
         elif self.options['predicate']:
             if self.options['min']:
                 placeholders = u'<li class="placeholder"></li>' * self.options['min']
             else:
                 placeholders = u'<li class="placeholder multiple"></li>'
-            return '<li data-predicate="%(nazwa)s">' % element.attrib, '<ul class="subjects">' + placeholders + '</ul></li>'
+            return '<li data-predicate="%s">' % element.attrib.get('nazwa', ''), '<ul class="subjects">' + placeholders + '</ul></li>'
 
         else:
             return super(Przyporzadkuj, self).handle_punkt(element)