Exercises.
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 30 Jan 2013 15:43:51 +0000 (16:43 +0100)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 30 Jan 2013 15:43:51 +0000 (16:43 +0100)
catalogue/models.py
catalogue/static/catalogue/css/carousel.css
catalogue/static/catalogue/css/exercise.css [new file with mode: 0644]
catalogue/static/catalogue/css/exercise.scss [new file with mode: 0755]
catalogue/static/catalogue/css/lesson.css
catalogue/static/catalogue/css/lesson.scss
catalogue/static/catalogue/js/carousel.js
catalogue/static/catalogue/js/edumed.js
edumed/settings.d/50-static.py

index 8ff6be4..fadb718 100644 (file)
@@ -70,14 +70,17 @@ class Lesson(models.Model):
         lesson.section = Section.objects.all()[0]
         lesson.order = 1
         lesson.depth = 1
         lesson.section = Section.objects.all()[0]
         lesson.order = 1
         lesson.depth = 1
-
-        # Build HTML.
-        html = wldoc.as_html()
-        lesson.html_file.save("%s.html" % slug,
-            File(open(html.get_filename())), save=False)
         lesson.save()
         lesson.save()
+        lesson.build_html()
         return lesson
 
         return lesson
 
+    def build_html(self):
+        from librarian.parser import WLDocument
+        wldoc = WLDocument.from_file(self.xml_file.path)
+        html = wldoc.as_html()
+        self.html_file.save("%s.html" % self.slug,
+            File(open(html.get_filename())), save=False)
+        self.save()
 
 class Attachment(models.Model):
     lesson = models.ForeignKey(Lesson)
 
 class Attachment(models.Model):
     lesson = models.ForeignKey(Lesson)
index 3392bb2..abf7ce0 100644 (file)
@@ -17,7 +17,6 @@
       top: 0;
       left: 0;
       height: 100%;
       top: 0;
       left: 0;
       height: 100%;
-      /* background-image: url(/static/test.jpg);  set real background image */
       background-size: 100% 100%;
       border-top-left-radius: 0.938em 6.38%;
       border-bottom-left-radius: 0.938em 6.38%; }
       background-size: 100% 100%;
       border-top-left-radius: 0.938em 6.38%;
       border-bottom-left-radius: 0.938em 6.38%; }
diff --git a/catalogue/static/catalogue/css/exercise.css b/catalogue/static/catalogue/css/exercise.css
new file mode 100644 (file)
index 0000000..b9c91e9
--- /dev/null
@@ -0,0 +1,179 @@
+@charset "UTF-8";
+.exercise .question-piece {
+  border-radius: 0.688em;
+  padding: 0.5em 0.688em; }
+.exercise .lista.punkt {
+  list-style: none;
+  margin: 0;
+  padding: 0; }
+.exercise .lista li {
+  margin: 0.313em 0; }
+.exercise .question-piece.correct {
+  background-color: #16a487;
+  color: white; }
+.exercise .question-piece.incorrect {
+  background-color: #f00;
+  color: white; }
+.exercise .placeholder.dragover {
+  background: #ed7831 !important; }
+.exercise .remove {
+  float: right;
+  display: inline-block;
+  border-radius: 0.5em;
+  padding: 0.25em 0.5em;
+  margin: -0.25em -0.5em -1em 0.5em;
+  background: #ed7831;
+  color: white; }
+.exercise .buttons {
+  background: #5e6165;
+  border-radius: 0.563em;
+  height: 1.875em;
+  line-height: 1.875em;
+  overflow: hidden;
+  color: white;
+  margin-top: 1.875em; }
+  .exercise .buttons input {
+    height: 100%;
+    border: 0;
+    background: #8e9093;
+    color: white;
+    text-transform: uppercase;
+    font-weight: bold; }
+  .exercise .buttons .message {
+    float: right;
+    margin-right: 1.25em; }
+  .exercise .buttons input.check {
+    background: #ed7831; }
+
+.luki .question-piece {
+  background-color: #d4d6d8;
+  color: #363a3e;
+  cursor: pointer;
+  z-index: 2;
+  display: inline-block;
+  margin: 0.313em;
+  z-index: 2; }
+.luki .question-piece.disabled {
+  background-color: #eee;
+  color: #d4d6d8; }
+.luki .placeholder {
+  border-radius: 0.688em;
+  padding: 0.5em 0.688em;
+  display: inline-block;
+  margin: 0.313em;
+  z-index: 2;
+  width: 4em;
+  background-color: #eee;
+  z-index: 1; }
+.luki .placeholder:after {
+  content: "\0000a0"; }
+
+.zastap .question-piece {
+  background-color: #d4d6d8;
+  color: #363a3e;
+  cursor: pointer;
+  z-index: 2;
+  display: inline-block;
+  margin: 0.313em;
+  z-index: 2; }
+.zastap .question-piece.disabled {
+  background-color: #eee;
+  color: #d4d6d8; }
+.zastap .question-piece.placeholder {
+  background-color: inherit;
+  color: inherit;
+  cursor: inherit;
+  z-index: inherit;
+  display: inline;
+  margin: 0;
+  padding: 0;
+  z-index: inherit;
+  border-radius: 0; }
+
+.uporzadkuj .question-piece {
+  background-color: #d4d6d8;
+  color: #363a3e;
+  cursor: pointer;
+  z-index: 2; }
+.uporzadkuj .question-piece.disabled {
+  background-color: #eee;
+  color: #d4d6d8; }
+.uporzadkuj .lista {
+  list-style: none;
+  margin: 0;
+  padding: 0; }
+
+.przyporzadkuj .question-piece {
+  background-color: #d4d6d8;
+  color: #363a3e;
+  cursor: pointer;
+  z-index: 2; }
+.przyporzadkuj .question-piece.disabled {
+  background-color: #eee;
+  color: #d4d6d8; }
+.przyporzadkuj .predicate {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  white-space: nowrap; }
+  .przyporzadkuj .predicate > li {
+    white-space: normal;
+    border-radius: 0.688em;
+    padding: 0.5em 0.688em;
+    display: inline-block;
+    background-color: #5e6165;
+    color: white;
+    width: 11.25em;
+    position: relative;
+    vertical-align: top; }
+    .przyporzadkuj .predicate > li .subjects {
+      list-style: none;
+      margin: 0;
+      padding: 0;
+      min-height: 2.813em;
+      position: relative;
+      margin: 0.5em -0.688em -0.5em -0.688em;
+      padding: 0.5em 0.688em; }
+      .przyporzadkuj .predicate > li .subjects .placeholder {
+        border-radius: 0.688em;
+        padding: 0.5em 0.688em;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        margin: 0;
+        z-index: -1;
+        text-align: right; }
+      .przyporzadkuj .predicate > li .subjects .placeholder.dragover {
+        z-index: 1; }
+      .przyporzadkuj .predicate > li .subjects .placeholder:after {
+        content: "upuść tutaj";
+        text-style: italic; }
+  .przyporzadkuj .predicate .comment {
+    white-space: normal; }
+.przyporzadkuj .subject {
+  list-style: none;
+  margin: 0;
+  padding: 0; }
+
+.prawdafalsz .question li.question-piece {
+  position: relative;
+  padding-left: 11em; }
+.prawdafalsz .question .buttons {
+  margin-top: 0;
+  top: 0;
+  left: 0;
+  position: absolute;
+  background-color: #d4d6d8;
+  color: #363a3e;
+  display: inline-block; }
+  .prawdafalsz .question .buttons a {
+    color: #363a3e;
+    text-transform: uppercase;
+    font-weight: bold;
+    display: inline-block;
+    padding: 0 0.688em; }
+  .prawdafalsz .question .buttons a.chosen {
+    background: #ed7831;
+    color: white; }
diff --git a/catalogue/static/catalogue/css/exercise.scss b/catalogue/static/catalogue/css/exercise.scss
new file mode 100755 (executable)
index 0000000..6fe8c9a
--- /dev/null
@@ -0,0 +1,247 @@
+$px: 0.0625em;
+
+
+@mixin bubble {
+    border-radius: 11*$px;
+    padding: 8*$px 11*$px;
+}
+@mixin bubble-drag {
+    background-color: #d4d6d8;
+    color: #363a3e;
+    cursor: pointer;
+    z-index: 2;
+}
+@mixin bubble-drag-disabled {
+    background-color: #eee;
+    color: #d4d6d8;
+}
+@mixin un-bubble-drag {
+    background-color: inherit;
+    color: inherit;
+    cursor: inherit;
+    z-index: inherit;
+}
+
+@mixin bubble-inline {
+    display: inline-block;
+    margin: 5*$px;
+    z-index: 2;
+}
+@mixin un-bubble-inline {
+    display: inline;
+    margin: 0;
+    padding: 0;
+    z-index: inherit;
+    border-radius: 0;
+}
+@mixin list-plain {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+
+
+.exercise {
+    .question-piece {
+        @include bubble;
+    }
+    .lista.punkt {
+        @include list-plain;
+    }
+    .lista {
+        li {
+            margin: 5*$px 0;
+        }
+    }
+
+    .question-piece.correct {
+        background-color: #16a487;
+        color: white;
+    }
+    .question-piece.incorrect {
+        background-color: #f00;
+        color: white;
+    }
+    
+    .placeholder.dragover {
+         background: #ed7831 !important;
+    }
+
+    .remove {
+        float: right;
+        display: inline-block;
+        border-radius: 8*$px;
+        padding: 4*$px 8*$px;
+        margin: -4*$px -8*$px -1em 8*$px;
+        background: #ed7831;
+        color: white;
+    }
+
+    .buttons {
+        background: #5e6165;
+        border-radius: 9*$px;
+        height: 30*$px;
+        line-height: 30*$px;
+        overflow: hidden;
+        color: white;
+        margin-top: 30*$px;
+
+        input {
+            height: 100%;
+            border: 0;
+            background: #8e9093;
+            color: white;
+            text-transform: uppercase;
+            font-weight: bold;
+        }
+        .message {
+            float: right;
+            margin-right: 20*$px;
+        }
+
+        input.check {
+            background: #ed7831;
+            
+        }
+    }
+
+}
+
+
+.luki {
+    .question-piece {
+        @include bubble-drag;
+        @include bubble-inline;
+    }
+    .question-piece.disabled {
+        @include bubble-drag-disabled;
+    }
+
+    .placeholder {
+        @include bubble;
+        @include bubble-inline;
+
+        width: 4em;
+        background-color: #eee;
+        z-index: 1;
+    }
+    .placeholder:after {
+        content: "\0000a0";
+    }
+}
+
+
+.zastap {
+    .question-piece {
+        @include bubble-drag;
+        @include bubble-inline;
+    }
+    .question-piece.disabled {
+        @include bubble-drag-disabled;
+    }
+    .question-piece.placeholder {
+        @include un-bubble-drag;
+        @include un-bubble-inline;
+    }
+}
+
+.uporzadkuj {
+    .question-piece {
+        @include bubble-drag;
+    }
+    .question-piece.disabled {
+        @include bubble-drag-disabled;
+    }
+    .lista {
+        @include list-plain;
+    }
+}
+
+.przyporzadkuj {
+    .question-piece {
+        @include bubble-drag;
+    }
+    .question-piece.disabled {
+        @include bubble-drag-disabled;
+    }
+    .predicate {
+        @include list-plain;
+        white-space: nowrap;
+
+        > li {
+            white-space: normal;
+            @include bubble;
+            display: inline-block;
+            background-color: #5e6165;
+            color: white;
+            width: 180*$px;
+            position: relative;
+            vertical-align: top;
+
+            .subjects {
+                @include list-plain;
+                min-height: 45*$px;
+                position: relative;
+                margin: 8*$px -11*$px -8*$px -11*$px;
+                padding: 8*$px 11*$px;
+
+                .placeholder {
+                    @include bubble;
+                    position: absolute;
+                    top: 0;
+                    bottom: 0;
+                    left: 0;
+                    right: 0;
+                    margin: 0;
+                    z-index: -1;
+                    text-align: right;
+                }
+                .placeholder.dragover {
+                    z-index: 1;
+                }
+                .placeholder:after {
+                    content: "upuść tutaj";
+                    text-style: italic;
+                }
+            }
+        }
+        .comment {
+            white-space: normal;
+        }
+    }
+    .subject {
+        @include list-plain;
+    }
+
+}
+
+
+.prawdafalsz .question {
+    li.question-piece {
+        position: relative;
+        padding-left: 11em;
+    }
+
+    .buttons {
+        margin-top: 0;
+        top: 0;
+        left: 0;
+        position: absolute;
+        
+        background-color: #d4d6d8;
+        color: #363a3e;
+        display: inline-block;
+
+        a {
+            color: #363a3e;
+            text-transform: uppercase;
+            font-weight: bold;
+            display: inline-block;
+            padding: 0 11*$px;
+        }
+        a.chosen {
+            background: #ed7831;
+            color: white;
+        }
+    }
+}
index 65da41d..6ba748e 100644 (file)
@@ -213,82 +213,6 @@ em.person {
 .clearboth {
   clear: both; }
 
 .clearboth {
   clear: both; }
 
-.excercise .buttons {
-  text-align: right; }
-
-.teacher {
-  display: none; }
-
-.teacher.show {
-  display: inherit; }
-
-.question-piece.correct {
-  background-color: darkgreen; }
-
-.question-piece.incorrect {
-  background-color: orange; }
-
-.buttons .chosen {
-  background-color: lightblue; }
-
-.excercise .lista.predicate {
-  list-style: none;
-  position: relative;
-  clear: both;
-  padding-left: 0; }
-
-.excercise .subjects {
-  padding-left: 0; }
-
-.excercise .lista.predicate > li {
-  list-style: none;
-  display: block;
-  float: left;
-  width: 208px;
-  margin: 2px; }
-
-.excercise.wide .lista.predicate > li {
-  width: 100%;
-  margin: 2px; }
-
-.excercise .lista.predicate .droppable {
-  min-height: 50px;
-  border: 1px dotted black; }
-
-.excercise .draggable {
-  padding: 3px;
-  border: 1px dotted black;
-  display: inline-block; }
-
-.excercise .draggable.disabled {
-  background-color: grey; }
-
-.excercise .placeholder {
-  padding: 3px;
-  border: 1px dotted black;
-  display: inline-block;
-  min-width: 200px;
-  min-height: 1em; }
-
-.excercise .placeholder.accepting.dragover {
-  background-color: #ffff99; }
-
-.excercise.zastap .paragraph .placeholder {
-  display: inline;
-  min-width: none;
-  min-height: none;
-  border: inherit;
-  padding: inherit; }
-
-.excercise .lista.subjects {
-  padding-left: 0px; }
-
-.draggable .remove {
-  font-family: sans-serif;
-  padding: 2px 4px;
-  background-color: #ee6666;
-  margin-left: 5px; }
-
 /* utils */
 .clr {
   clear: both; }
 /* utils */
 .clr {
   clear: both; }
index 95e8be4..543ee8f 100755 (executable)
@@ -259,109 +259,6 @@ em.person {
 }
 
 
 }
 
 
-.excercise .buttons {
-    text-align: right;
-}
-
-.teacher {
-    display: none;
-}
-
-.teacher.show {
-    display: inherit;
-}
-
-.question-piece.correct {
-    background-color: darkgreen;
-}
-
-.question-piece.incorrect {
-    background-color: orange;
-}
-
-.buttons .chosen {
-    background-color: lightblue;
-}
-
-
-
-.excercise .lista.predicate {
-    list-style: none;
-    position: relative;
-    clear: both;
-    padding-left: 0;
-}
-
-
-.excercise .subjects {
-    padding-left: 0;
-}
-
-
-.excercise .lista.predicate > li {
-    list-style: none;
-    display: block;
-    float: left;
-    width: 208px;
-    margin: 2px;
-}
-
-.excercise.wide .lista.predicate > li {
-    width: 100%;
-    margin: 2px;
-}
-
-.excercise .lista.predicate .droppable {
-    min-height: 50px;
-    border: 1px dotted black;
-}
-
-
-.excercise .draggable {
-    padding: 3px;
-    border: 1px dotted black;
-    display: inline-block;
-}
-
-.excercise .draggable.disabled {
-    background-color: grey;
-}
-
-.excercise .placeholder {
-    padding: 3px;
-    border: 1px dotted black;
-    display: inline-block;
-    min-width: 200px;
-    min-height: 1em;
-}
-
-.excercise .placeholder.accepting.dragover {
-    background-color: #ffff99;
-}
-
-
-.excercise.zastap .paragraph .placeholder {
-    display: inline;
-    min-width: none;
-    min-height: none;
-    border: inherit;
-    padding: inherit;
-}
-
-
-
-.excercise .lista.subjects {
-    padding-left: 0px;
-}
-
-
-.draggable .remove {
-    font-family: sans-serif;
-    padding: 2px 4px;
-    background-color: #ee6666;
-    margin-left: 5px;
-}
-
 /* utils */
 
 .clr {
 /* utils */
 
 .clr {
index e340eaa..b7e5021 100755 (executable)
@@ -15,14 +15,16 @@ $.fn.cycle.transitions.rgrowY = function($cont, $slides, opts) {
        opts.cssBefore.left = 0;
 };
 
        opts.cssBefore.left = 0;
 };
 
-$("#catalogue-carousel-links").cycle({
-    fx: 'rgrowY',
-    sync:false,
-    easeIn: 'easeInQuad',
-    easeOut: 'easeOutQuad',
-    speed: 1000,
-    pager: '#catalogue-carousel-switcher',
-    pagerAnchorBuilder: function(){},
+$("#catalogue-carousel-links").each(function() {
+    $(this).cycle({
+        fx: 'rgrowY',
+        sync:false,
+        easeIn: 'easeInQuad',
+        easeOut: 'easeOutQuad',
+        speed: 1000,
+        pager: '#catalogue-carousel-switcher',
+        pagerAnchorBuilder: function(){},
+    });
 });
 
 
 });
 
 
index d8f3d94..cc7b9e1 100644 (file)
@@ -1,7 +1,8 @@
+// Generated by CoffeeScript 1.4.0
 (function() {
 (function() {
-  var $, Binding, EduModule, Excercise, Luki, PrawdaFalsz, Przyporzadkuj, Uporzadkuj, Wybor, Zastap, excercise,
-    __hasProp = Object.prototype.hasOwnProperty,
-    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
+  var $, Binding, EduModule, Exercise, Luki, PrawdaFalsz, Przyporzadkuj, Uporzadkuj, Wybor, Zastap, exercise,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   $ = jQuery;
 
 
   $ = jQuery;
 
     __extends(EduModule, _super);
 
     function EduModule(element) {
     __extends(EduModule, _super);
 
     function EduModule(element) {
-      var _this = this;
       EduModule.__super__.constructor.call(this, 'edumodule', element);
       EduModule.__super__.constructor.call(this, 'edumodule', element);
-      $("[name=teacher-toggle]").change(function(ev) {
-        if ($(ev.target).is(":checked")) {
-          return $(".teacher", _this.element).addClass("show");
-        } else {
-          return $(".teacher", _this.element).removeClass("show");
-        }
-      });
     }
 
     return EduModule;
 
   })(Binding);
 
     }
 
     return EduModule;
 
   })(Binding);
 
-  Excercise = (function(_super) {
+  Exercise = (function(_super) {
 
 
-    __extends(Excercise, _super);
+    __extends(Exercise, _super);
 
 
-    function Excercise(element) {
+    function Exercise(element) {
       var _this = this;
       var _this = this;
-      Excercise.__super__.constructor.call(this, 'excercise', element);
-      $(".check", this.element).click(function() {
-        return _this.check();
+      Exercise.__super__.constructor.call(this, 'exercise', element);
+      $(this.element).data("exercise-html", $(this.element).html());
+      $(".check", this.element).click(function(ev) {
+        _this.check();
+        $(ev.target).next(".retry").show();
+        return $(ev.target).hide();
+      });
+      $(".retry", this.element).click(function(ev) {
+        $(".correct, .incorrect", _this.element).removeClass("correct incorrect");
+        $(ev.target).prev(".check").show();
+        return $(ev.target).hide();
       });
       $('.solutions', this.element).click(function() {
       });
       $('.solutions', this.element).click(function() {
-        return _this.show_solutions();
+        _this.show_solutions();
+        return $(".comment", _this.element).show();
+      });
+      $('.reset', this.element).click(function() {
+        return _this.reset();
       });
     }
 
       });
     }
 
-    Excercise.prototype.piece_correct = function(qpiece) {
+    Exercise.prototype.reset = function() {
+      $(this.element).html($(this.element).data('exercise-html'));
+      return exercise(this.element);
+    };
+
+    Exercise.prototype.piece_correct = function(qpiece) {
       return $(qpiece).removeClass('incorrect').addClass('correct');
     };
 
       return $(qpiece).removeClass('incorrect').addClass('correct');
     };
 
-    Excercise.prototype.piece_incorrect = function(qpiece) {
+    Exercise.prototype.piece_incorrect = function(qpiece) {
       return $(qpiece).removeClass('correct').addClass('incorrect');
     };
 
       return $(qpiece).removeClass('correct').addClass('incorrect');
     };
 
-    Excercise.prototype.check = function() {
+    Exercise.prototype.check = function() {
       var score, scores,
         _this = this;
       scores = [];
       var score, scores,
         _this = this;
       scores = [];
       return this.show_score(score);
     };
 
       return this.show_score(score);
     };
 
-    Excercise.prototype.get_value_list = function(elem, data_key, numbers) {
+    Exercise.prototype.show_solutions = function() {
+      var _this = this;
+      this.reset();
+      return $(".question", this.element).each(function(i, question) {
+        return _this.solve_question(question);
+      });
+    };
+
+    Exercise.prototype.get_value_list = function(elem, data_key, numbers) {
       var vl;
       vl = $(elem).attr("data-" + data_key).split(/[ ,]+/).map($.trim);
       if (numbers) {
       var vl;
       vl = $(elem).attr("data-" + data_key).split(/[ ,]+/).map($.trim);
       if (numbers) {
       return vl;
     };
 
       return vl;
     };
 
-    Excercise.prototype.get_value_optional_list = function(elem, data_key) {
+    Exercise.prototype.get_value_optional_list = function(elem, data_key) {
       var mandat, opt, v, vals, _i, _len;
       vals = this.get_value_list(elem, data_key);
       mandat = [];
       var mandat, opt, v, vals, _i, _len;
       vals = this.get_value_list(elem, data_key);
       mandat = [];
       return [mandat, opt];
     };
 
       return [mandat, opt];
     };
 
-    Excercise.prototype.show_score = function(score) {
+    Exercise.prototype.show_score = function(score) {
       return $(".message", this.element).text("Wynik: " + score[0] + " / " + score[1]);
     };
 
       return $(".message", this.element).text("Wynik: " + score[0] + " / " + score[1]);
     };
 
-    Excercise.prototype.draggable_equal = function($draggable1, $draggable2) {
+    Exercise.prototype.draggable_equal = function($draggable1, $draggable2) {
       return false;
     };
 
       return false;
     };
 
-    Excercise.prototype.draggable_accept = function($draggable, $droppable) {
+    Exercise.prototype.draggable_accept = function($draggable, $droppable) {
       var d, dropped, _i, _len;
       dropped = $droppable.closest("ul, ol").find(".draggable");
       for (_i = 0, _len = dropped.length; _i < _len; _i++) {
         d = dropped[_i];
       var d, dropped, _i, _len;
       dropped = $droppable.closest("ul, ol").find(".draggable");
       for (_i = 0, _len = dropped.length; _i < _len; _i++) {
         d = dropped[_i];
-        if (this.draggable_equal($draggable, $(d))) return false;
+        if (this.draggable_equal($draggable, $(d))) {
+          return false;
+        }
       }
       return true;
     };
 
       }
       return true;
     };
 
-    Excercise.prototype.draggable_dropped = function($draggable) {
-      return $draggable.append('<span class="close">x</span>');
+    Exercise.prototype.draggable_move = function($draggable, $placeholder, ismultiple) {
+      var $added,
+        _this = this;
+      $added = $draggable.clone();
+      $added.data("original", $draggable.get(0));
+      if (!ismultiple) {
+        $draggable.addClass('disabled').draggable('disable');
+      }
+      $placeholder.after($added);
+      if (!$placeholder.hasClass('multiple')) {
+        $placeholder.hide();
+      }
+      $added.append('<span class="remove">x</span>');
+      return $('.remove', $added).click(function(ev) {
+        $added.prev(".placeholder:not(.multiple)").show();
+        if (!ismultiple) {
+          $($added.data('original')).removeClass('disabled').draggable('enable');
+        }
+        return $added.remove();
+      });
     };
 
     };
 
-    Excercise.prototype.dragging = function(ismultiple, issortable) {
+    Exercise.prototype.dragging = function(ismultiple, issortable) {
       var _this = this;
       return $(".question", this.element).each(function(i, question) {
         var draggable_opts, self;
       var _this = this;
       return $(".question", this.element).each(function(i, question) {
         var draggable_opts, self;
             var $draggable, is_accepted;
             $draggable = $(draggable);
             is_accepted = true;
             var $draggable, is_accepted;
             $draggable = $(draggable);
             is_accepted = true;
-            if (!$draggable.is(".draggable")) is_accepted = false;
+            if (!$draggable.is(".draggable")) {
+              is_accepted = false;
+            }
             if (is_accepted) {
               is_accepted = self.draggable_accept($draggable, $(this));
             }
             if (is_accepted) {
               is_accepted = self.draggable_accept($draggable, $(this));
             }
             return is_accepted;
           },
           drop: function(ev, ui) {
             return is_accepted;
           },
           drop: function(ev, ui) {
-            var $added, added,
-              _this = this;
             $(ev.target).removeClass('accepting dragover');
             $(ev.target).removeClass('accepting dragover');
-            added = $(ui.draggable).clone();
-            $added = added;
-            $added.data("original", ui.draggable);
-            if (!ismultiple) {
-              $(ui.draggable).addClass('disabled').draggable('disable');
-            }
-            $(ev.target).after(added);
-            if (!$(ev.target).hasClass('multiple')) $(ev.target).hide();
-            $added.append('<span class="remove">x</span>');
-            return $('.remove', added).click(function(ev) {
-              $added.prev(".placeholder:not(.multiple)").show();
-              if (!ismultiple) {
-                $added.data('original').removeClass('disabled').draggable('enable');
-              }
-              return $(added).remove();
-            });
+            return _this.draggable_move($(ui.draggable), $(ev.target), ismultiple);
           },
           over: function(ev, ui) {
             return $(ev.target).addClass('dragover');
           },
           over: function(ev, ui) {
             return $(ev.target).addClass('dragover');
       });
     };
 
       });
     };
 
-    return Excercise;
+    return Exercise;
 
   })(Binding);
 
 
   })(Binding);
 
           should_be_checked = solution.indexOf(piece_no) >= 0;
         }
         is_checked = $("input", qpiece).is(":checked");
           should_be_checked = solution.indexOf(piece_no) >= 0;
         }
         is_checked = $("input", qpiece).is(":checked");
-        if (should_be_checked) all += 1;
+        if (should_be_checked) {
+          all += 1;
+        }
         if (is_checked) {
           if (should_be_checked) {
             good += 1;
         if (is_checked) {
           if (should_be_checked) {
             good += 1;
       return [good, all];
     };
 
       return [good, all];
     };
 
-    Wybor.prototype.show_solutions = function() {};
+    Wybor.prototype.solve_question = function(question) {
+      var solution,
+        _this = this;
+      solution = this.get_value_list(question, 'solution');
+      return $(".question-piece", question).each(function(i, qpiece) {
+        var piece_name, piece_no, should_be_checked;
+        piece_no = $(qpiece).attr('data-no');
+        piece_name = $(qpiece).attr('data-name');
+        if (piece_name) {
+          should_be_checked = solution.indexOf(piece_name) >= 0;
+        } else {
+          should_be_checked = solution.indexOf(piece_no) >= 0;
+        }
+        console.log("check " + $("input[type=checkbox]", qpiece).attr("id") + " -> " + should_be_checked);
+        return $("input[type=checkbox]", qpiece).prop('checked', should_be_checked);
+      });
+    };
 
     return Wybor;
 
 
     return Wybor;
 
-  })(Excercise);
+  })(Exercise);
 
   Uporzadkuj = (function(_super) {
 
 
   Uporzadkuj = (function(_super) {
 
     }
 
     Uporzadkuj.prototype.check_question = function(question) {
     }
 
     Uporzadkuj.prototype.check_question = function(question) {
-      var all, correct, pkt, pkts, positions, sorted, _ref;
+      var all, correct, pkt, pkts, positions, sorted, _i, _ref;
       positions = this.get_value_list(question, 'original', true);
       sorted = positions.sort();
       pkts = $('.question-piece', question);
       correct = 0;
       all = 0;
       positions = this.get_value_list(question, 'original', true);
       sorted = positions.sort();
       pkts = $('.question-piece', question);
       correct = 0;
       all = 0;
-      for (pkt = 0, _ref = pkts.length; 0 <= _ref ? pkt < _ref : pkt > _ref; 0 <= _ref ? pkt++ : pkt--) {
+      for (pkt = _i = 0, _ref = pkts.length; 0 <= _ref ? _i < _ref : _i > _ref; pkt = 0 <= _ref ? ++_i : --_i) {
         all += 1;
         if (pkts.eq(pkt).data('pos') === sorted[pkt]) {
           correct += 1;
         all += 1;
         if (pkts.eq(pkt).data('pos') === sorted[pkt]) {
           correct += 1;
       return [correct, all];
     };
 
       return [correct, all];
     };
 
+    Uporzadkuj.prototype.solve_question = function(question) {
+      var p, parent, pkts, positions, sorted, _i, _len, _results;
+      positions = this.get_value_list(question, 'original', true);
+      sorted = positions.sort();
+      pkts = $('.question-piece', question);
+      pkts.sort(function(a, b) {
+        var q, w;
+        q = $(a).data('pos');
+        w = $(b).data('pos');
+        if (q < w) {
+          return 1;
+        }
+        if (q > w) {
+          return -1;
+        }
+        return 0;
+      });
+      parent = pkts.eq(0).parent();
+      _results = [];
+      for (_i = 0, _len = pkts.length; _i < _len; _i++) {
+        p = pkts[_i];
+        _results.push(parent.prepend(p));
+      }
+      return _results;
+    };
+
     return Uporzadkuj;
 
     return Uporzadkuj;
 
-  })(Excercise);
+  })(Exercise);
 
   Luki = (function(_super) {
 
 
   Luki = (function(_super) {
 
       return this.show_score([correct, all]);
     };
 
       return this.show_score([correct, all]);
     };
 
+    Luki.prototype.solve_question = function(question) {
+      var _this = this;
+      return $(".placeholder", question).each(function(i, placeholder) {
+        var $qp;
+        $qp = $(".question-piece[data-no=" + $(placeholder).data('solution') + "]", question);
+        return _this.draggable_move($qp, $(placeholder), false);
+      });
+    };
+
     return Luki;
 
     return Luki;
 
-  })(Excercise);
+  })(Exercise);
 
   Zastap = (function(_super) {
 
 
   Zastap = (function(_super) {
 
       correct = 0;
       $(".paragraph", this.element).each(function(i, par) {
         return $(".placeholder", par).each(function(j, qpiece) {
       correct = 0;
       $(".paragraph", this.element).each(function(i, par) {
         return $(".placeholder", par).each(function(j, qpiece) {
-          var $dragged, $qp, should_be_checked;
-          should_be_checked = false;
+          var $dragged, $qp;
           $qp = $(qpiece);
           $dragged = $qp.next(".draggable");
           if ($qp.data("solution")) {
           $qp = $(qpiece);
           $dragged = $qp.next(".draggable");
           if ($qp.data("solution")) {
       return this.show_score([correct, all]);
     };
 
       return this.show_score([correct, all]);
     };
 
+    Zastap.prototype.show_solutions = function() {
+      var _this = this;
+      this.reset();
+      return $(".paragraph", this.element).each(function(i, par) {
+        return $(".placeholder[data-solution]", par).each(function(j, qpiece) {
+          var $dr, $qp;
+          $qp = $(qpiece);
+          $dr = $(".draggable[data-no=" + $qp.data('solution') + "]", _this.element);
+          return _this.draggable_move($dr, $qp, false);
+        });
+      });
+    };
+
     Zastap.prototype.wrap_words = function(element, wrapper) {
     Zastap.prototype.wrap_words = function(element, wrapper) {
-      var chld, i, ignore, insertWrapped, j, len, space, wordb, _ref, _results;
+      var chld, i, ignore, insertWrapped, j, len, space, wordb, _i, _ref, _results;
       ignore = /^[ \t.,:;()]+/;
       insertWrapped = function(txt, elem) {
         var nw;
       ignore = /^[ \t.,:;()]+/;
       insertWrapped = function(txt, elem) {
         var nw;
         return $(document.createTextNode(txt)).wrap(nw).parent().attr("data-original", txt).insertBefore(elem);
       };
       _results = [];
         return $(document.createTextNode(txt)).wrap(nw).parent().attr("data-original", txt).insertBefore(elem);
       };
       _results = [];
-      for (j = _ref = element.get(0).childNodes.length - 1; _ref <= 0 ? j <= 0 : j >= 0; _ref <= 0 ? j++ : j--) {
+      for (j = _i = _ref = element.get(0).childNodes.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; j = _ref <= 0 ? ++_i : --_i) {
         chld = element.get(0).childNodes[j];
         if (chld.nodeType === document.TEXT_NODE) {
           len = chld.textContent.length;
         chld = element.get(0).childNodes[j];
         if (chld.nodeType === document.TEXT_NODE) {
           len = chld.textContent.length;
 
     return Zastap;
 
 
     return Zastap;
 
-  })(Excercise);
+  })(Exercise);
 
   Przyporzadkuj = (function(_super) {
 
 
   Przyporzadkuj = (function(_super) {
 
       _ref = $(".question-piece", this.element);
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
         qp = _ref[_i];
       _ref = $(".question-piece", this.element);
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
         qp = _ref[_i];
-        if ($(qp).data('solution').split(/[ ,]+/).length > 1) return true;
+        if ($(qp).data('solution').split(/[ ,]+/).length > 1) {
+          return true;
+        }
       }
       return false;
     };
       }
       return false;
     };
     };
 
     Przyporzadkuj.prototype.check_question = function(question) {
     };
 
     Przyporzadkuj.prototype.check_question = function(question) {
-      var all, all_multiple, count, mandatory, optional, pn, pred, qp, v, _i, _j, _len, _len2, _ref, _ref2;
+      var all, count, mandatory, minimum, optional, pn, pred, qp, v, _i, _j, _len, _len1, _ref, _ref1;
+      minimum = $(question).data("minimum");
       count = 0;
       all = 0;
       count = 0;
       all = 0;
-      all_multiple = 0;
-      _ref = $(".predicate .question-piece", question);
+      if (!minimum) {
+        all = $(".subjects .question-piece", question).length;
+      }
+      _ref = $(".predicate [data-predicate]", question);
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        pred = _ref[_i];
+        pn = $(pred).attr('data-predicate');
+        if (minimum != null) {
+          all += minimum;
+        }
+        _ref1 = $(".question-piece", pred);
+        for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+          qp = _ref1[_j];
+          v = this.get_value_optional_list(qp, 'solution');
+          mandatory = v[0];
+          optional = v[1];
+          if (mandatory.indexOf(pn) >= 0 || (minimum && optional.indexOf(pn) >= 0)) {
+            count += 1;
+            this.piece_correct(qp);
+          } else {
+            this.piece_incorrect(qp);
+          }
+        }
+      }
+      return [count, all];
+    };
+
+    Przyporzadkuj.prototype.solve_question = function(question) {
+      var $ph, $pr, draggables, m, mandatory, minimum, optional, qp, v, _i, _len, _ref, _results;
+      minimum = $(question).data("min");
+      _ref = $(".subject .question-piece", question);
+      _results = [];
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
         qp = _ref[_i];
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
         qp = _ref[_i];
-        pred = $(qp).closest("[data-predicate]");
         v = this.get_value_optional_list(qp, 'solution');
         mandatory = v[0];
         optional = v[1];
         v = this.get_value_optional_list(qp, 'solution');
         mandatory = v[0];
         optional = v[1];
-        all_multiple += mandatory.length + optional.length;
-        pn = pred.data('predicate');
-        if (mandatory.indexOf(pn) >= 0 || optional.indexOf(pn) >= 0) {
-          count += 1;
-          this.piece_correct(qp);
+        if (minimum) {
+          draggables = mandatory.count(optional).slice(0, minimum);
         } else {
         } else {
-          this.piece_incorrect(qp);
+          draggables = mandatory;
         }
         }
-        all += 1;
-      }
-      if (this.multiple) {
-        _ref2 = $(".subject .question-piece", question);
-        for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
-          qp = _ref2[_j];
-          v = this.get_value_optional_list(qp, 'solution');
-          mandatory = v[0];
-          optional = v[1];
-          all_multiple += mandatory.length + optional.length;
-        }
-        return [count, all_multiple];
-      } else {
-        return [count, all];
+        _results.push((function() {
+          var _j, _len1, _results1;
+          _results1 = [];
+          for (_j = 0, _len1 = draggables.length; _j < _len1; _j++) {
+            m = draggables[_j];
+            $pr = $(".predicate [data-predicate=" + m + "]", question);
+            $ph = $pr.find(".placeholder:visible");
+            _results1.push(this.draggable_move($(qp), $ph, this.multiple));
+          }
+          return _results1;
+        }).call(this));
       }
       }
+      return _results;
     };
 
     return Przyporzadkuj;
 
     };
 
     return Przyporzadkuj;
 
-  })(Excercise);
+  })(Exercise);
 
   PrawdaFalsz = (function(_super) {
 
 
   PrawdaFalsz = (function(_super) {
 
       return [good, all];
     };
 
       return [good, all];
     };
 
+    PrawdaFalsz.prototype.show_solutions = function() {
+      var qp, _i, _len, _ref, _results;
+      reset();
+      _ref = $(".question-piece", this.element);
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        qp = _ref[_i];
+        if ($(qp).data('solution') === 'true') {
+          _results.push($(".true", qp).click());
+        } else {
+          _results.push($(".false", qp).click());
+        }
+      }
+      return _results;
+    };
+
     return PrawdaFalsz;
 
     return PrawdaFalsz;
 
-  })(Excercise);
+  })(Exercise);
 
 
-  excercise = function(ele) {
+  exercise = function(ele) {
     var cls, es;
     es = {
       wybor: Wybor,
     var cls, es;
     es = {
       wybor: Wybor,
 
   $(document).ready(function() {
     new EduModule($("#book-text"));
 
   $(document).ready(function() {
     new EduModule($("#book-text"));
-    return $(".excercise").each(function(i, el) {
-      return excercise(this);
+    return $(".exercise").each(function(i, el) {
+      return exercise(this);
     });
   });
 
     });
   });
 
index 2d7c9a5..23d963a 100644 (file)
@@ -20,6 +20,7 @@ PIPELINE_CSS = {
           'catalogue/css/carousel.scss',
           'catalogue/css/layout.scss',
           'catalogue/css/lesson.scss',
           'catalogue/css/carousel.scss',
           'catalogue/css/layout.scss',
           'catalogue/css/lesson.scss',
+          'catalogue/css/exercise.scss',
           'catalogue/css/section_list.scss',
         ),
         'output_filename': 'compressed/base.css',
           'catalogue/css/section_list.scss',
         ),
         'output_filename': 'compressed/base.css',