cleanups regarding dragging, zastap excercise
authorMarcin Koziej <marcin.koziej@nowoczesnapolska.org.pl>
Fri, 18 Jan 2013 12:03:15 +0000 (13:03 +0100)
committerMarcin Koziej <marcin.koziej@nowoczesnapolska.org.pl>
Fri, 18 Jan 2013 12:03:15 +0000 (13:03 +0100)
librarian/pyhtml.py

index 2cbc678..59455e2 100644 (file)
@@ -6,7 +6,7 @@
 from lxml import etree
 from librarian import OutputFile, RDFNS, DCNS
 from xmlutils import Xmill, tag, tagged, ifoption
 from lxml import etree
 from librarian import OutputFile, RDFNS, DCNS
 from xmlutils import Xmill, tag, tagged, ifoption
-import random 
+import random
 
 class EduModule(Xmill):
     def __init__(self, *args):
 
 class EduModule(Xmill):
     def __init__(self, *args):
@@ -37,7 +37,7 @@ class EduModule(Xmill):
     def handle_aktywnosc(self, element):
         self.activity_counter += 1
         self.options = {
     def handle_aktywnosc(self, element):
         self.activity_counter += 1
         self.options = {
-            'activity': True, 
+            'activity': True,
             'activity_counter': self.activity_counter
             }
         submill = EduModule()
             'activity_counter': self.activity_counter
             }
         submill = EduModule()
@@ -61,7 +61,7 @@ class EduModule(Xmill):
 
         return u"""
 <div class="activity">
 
         return u"""
 <div class="activity">
- <div class="text">%(counter)d. 
+ <div class="text">%(counter)d.
   %(opis)s
   %(wskazowki)s
  </div>
   %(opis)s
   %(wskazowki)s
  </div>
@@ -76,18 +76,18 @@ class EduModule(Xmill):
 
     handle_opis = ifoption(activity=False)(tag('div', 'description'))
     handle_wskazowki = ifoption(activity=False)(tag('div', ('hints', 'teacher')))
 
     handle_opis = ifoption(activity=False)(tag('div', 'description'))
     handle_wskazowki = ifoption(activity=False)(tag('div', ('hints', 'teacher')))
-    
+
     @ifoption(activity=False)
     @tagged('div', 'materials')
     def handle_pomoce(self, _):
         return "Pomoce: ", ""
     @ifoption(activity=False)
     @tagged('div', 'materials')
     def handle_pomoce(self, _):
         return "Pomoce: ", ""
-    
+
     def handle_czas(self, *_):
         return
 
     def handle_forma(self, *_):
         return
     def handle_czas(self, *_):
         return
 
     def handle_forma(self, *_):
         return
-            
+
     def handle_cwiczenie(self, element):
         excercise_handlers = {
             'wybor': Wybor,
     def handle_cwiczenie(self, element):
         excercise_handlers = {
             'wybor': Wybor,
@@ -97,7 +97,7 @@ class EduModule(Xmill):
             'przyporzadkuj': Przyporzadkuj,
             'prawdafalsz': PrawdaFalsz
             }
             'przyporzadkuj': Przyporzadkuj,
             'prawdafalsz': PrawdaFalsz
             }
-        
+
         typ = element.attrib['typ']
         handler = excercise_handlers[typ](self.options)
         return handler.generate(element)
         typ = element.attrib['typ']
         handler = excercise_handlers[typ](self.options)
         return handler.generate(element)
@@ -109,17 +109,17 @@ class EduModule(Xmill):
             self.options = {'slowniczek': True}
             return '<div class="slowniczek">', '</div>'
 ### robie teraz punkty wyboru
             self.options = {'slowniczek': True}
             return '<div class="slowniczek">', '</div>'
 ### robie teraz punkty wyboru
-        listtag = {'num': 'ol', 
-               'punkt': 'ul', 
-               'alfa': 'ul', 
+        listtag = {'num': 'ol',
+               'punkt': 'ul',
+               'alfa': 'ul',
                'czytelnia': 'ul'}[ltype]
 
         classes = attrs.get('class', '')
         if classes: del attrs['class']
                'czytelnia': 'ul'}[ltype]
 
         classes = attrs.get('class', '')
         if classes: del attrs['class']
-            
+
         attrs_s = ' '.join(['%s="%s"' % kv for kv in attrs.items()])
         if attrs_s: attrs_s = ' ' + attrs_s
         attrs_s = ' '.join(['%s="%s"' % kv for kv in attrs.items()])
         if attrs_s: attrs_s = ' ' + attrs_s
-            
+
         return '<%s class="lista %s %s"%s>' % (listtag, ltype, classes, attrs_s), '</%s>' % listtag
 
     def handle_punkt(self, element):
         return '<%s class="lista %s %s"%s>' % (listtag, ltype, classes, attrs_s), '</%s>' % listtag
 
     def handle_punkt(self, element):
@@ -130,7 +130,7 @@ class EduModule(Xmill):
 
     def handle_rdf__RDF(self, _):
         # ustal w opcjach  rzeczy :D
 
     def handle_rdf__RDF(self, _):
         # ustal w opcjach  rzeczy :D
-        return 
+        return
 
 
 class Excercise(EduModule):
 
 
 class Excercise(EduModule):
@@ -165,18 +165,25 @@ class Excercise(EduModule):
             pre = pre + qpre
             post = qpost + post
         return pre, post
             pre = pre + qpre
             post = qpost + post
         return pre, post
+
     def handle_pytanie(self, element):
         """This will handle <cwiczenie> element, when there is no <pytanie>
         """
     def handle_pytanie(self, element):
         """This will handle <cwiczenie> element, when there is no <pytanie>
         """
+        add_class = ""
         self.question_counter += 1
         self.piece_counter = 0
         solution = element.attrib.get('rozw', None)
         if solution: solution_s = ' data-solution="%s"' % solution
         else: solution_s = ''
 
         self.question_counter += 1
         self.piece_counter = 0
         solution = element.attrib.get('rozw', None)
         if solution: solution_s = ' data-solution="%s"' % solution
         else: solution_s = ''
 
-        return '<div class="question" data-no="%d" %s>' %\
-            (self.question_counter, solution_s), \
+        handles = element.attrib.get('uchwyty', None)
+        if handles:
+            add_class += ' handles handles-%s' % handles
+            self.options = {'handles': handles}
+
+
+        return '<div class="question%s" data-no="%d" %s>' %\
+            (add_class, self.question_counter, solution_s), \
     "</div>"
 
 
     "</div>"
 
 
@@ -218,34 +225,49 @@ Overrides the returned content default handle_pytanie
 
 
 class Luki(Excercise):
 
 
 class Luki(Excercise):
+    def find_pieces(self, question):
+        return question.xpath("//luka")
+
+    def solution_html(self, piece):
+        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)
 
     def handle_pytanie(self, element):
         qpre, qpost = super(Luki, self).handle_pytanie(element)
 
-        luki = list(enumerate(element.xpath("//luka")))
+        luki = list(enumerate(self.find_pieces(element)))
         luki_html = ""
         i = 0
         random.shuffle(luki)
         for (i, luka) in luki:
             i += 1
         luki_html = ""
         i = 0
         random.shuffle(luki)
         for (i, luka) in luki:
             i += 1
-            luka_html = luka.text + \
-                ''.join([etree.tostring(n, encoding=unicode) for n in luka])
+            luka_html = self.solution_html(luka)
             luki_html += u'<span class="draggable question-piece" data-no="%d">%s</span>' % (i, luka_html)
         self.words_html = '<div class="words">%s</div>' % luki_html
             luki_html += u'<span class="draggable question-piece" data-no="%d">%s</span>' % (i, luka_html)
         self.words_html = '<div class="words">%s</div>' % luki_html
-        
+
         return qpre, qpost
 
     def handle_opis(self, element):
         pre, post = super(Luki, self).handle_opis(element)
         return pre, self.words_html + post
         return qpre, qpost
 
     def handle_opis(self, element):
         pre, post = super(Luki, self).handle_opis(element)
         return pre, self.words_html + post
-                
+
     def handle_luka(self, element):
         self.piece_counter += 1
         return '<span class="placeholder" data-solution="%d"></span>' % self.piece_counter
 
 
     def handle_luka(self, element):
         self.piece_counter += 1
         return '<span class="placeholder" data-solution="%d"></span>' % self.piece_counter
 
 
-class Zastap(Excercise):
+class Zastap(Luki):
+    def find_pieces(self, question):
+        return question.xpath("//zastap")
+
+    def solution_html(self, piece):
+        return piece.attrib['rozw']
+
     def handle_zastap(self, element):
     def handle_zastap(self, element):
-        return '<span class="zastap question-piece" data-solution="%(rozw)s">' % element.attrib, '</span>'
+        self.piece_counter += 1
+        return '<span class="placeholder zastap question-piece" data-solution="%d">' \
+            % self.piece_counter, '</span>'
 
 
 class Przyporzadkuj(Excercise):
 
 
 class Przyporzadkuj(Excercise):
@@ -269,17 +291,20 @@ class Przyporzadkuj(Excercise):
         return pre, post + '<br class="clr"/>'
 
     def handle_punkt(self, element):
         return pre, post + '<br class="clr"/>'
 
     def handle_punkt(self, element):
-        self.piece_counter += 1
         print "in punkt %s %s" % (element.attrib, self.options)
 
         if self.options['subject']:
         print "in punkt %s %s" % (element.attrib, self.options)
 
         if self.options['subject']:
-            return '<li data-solution="%s" data-no="%s" class="question-piece draggable">' % (element.attrib['rozw'], self.piece_counter), '</li>'
-        
+            self.piece_counter += 1
+            if self.options['handles']:
+                return '<li><span data-solution="%s" data-no="%s" class="question-piece draggable handle">%s</span>' % (element.attrib['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>'
+
         elif self.options['predicate']:
             print etree.tostring(element, encoding=unicode)
             placeholders = u'<li class="placeholder multiple"/>'
             return '<li data-predicate="%(nazwa)s">' % element.attrib, '<ul class="subjects">' + placeholders + '</ul></li>'
         elif self.options['predicate']:
             print etree.tostring(element, encoding=unicode)
             placeholders = u'<li class="placeholder multiple"/>'
             return '<li data-predicate="%(nazwa)s">' % element.attrib, '<ul class="subjects">' + placeholders + '</ul></li>'
-        
+
         else:
             return super(Przyporzadkuj, self).handle_punkt(element)
 
         else:
             return super(Przyporzadkuj, self).handle_punkt(element)