From d92d15f83d157e1f00458d95e19060ab7fbd35b1 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Wed, 30 Jan 2013 16:43:51 +0100 Subject: [PATCH] Exercises. --- catalogue/models.py | 13 +- catalogue/static/catalogue/css/carousel.css | 1 - catalogue/static/catalogue/css/exercise.css | 179 +++++++++++ catalogue/static/catalogue/css/exercise.scss | 247 +++++++++++++++ catalogue/static/catalogue/css/lesson.css | 76 ----- catalogue/static/catalogue/css/lesson.scss | 103 ------ catalogue/static/catalogue/js/carousel.js | 18 +- catalogue/static/catalogue/js/edumed.js | 315 +++++++++++++------ edumed/settings.d/50-static.py | 1 + 9 files changed, 668 insertions(+), 285 deletions(-) create mode 100644 catalogue/static/catalogue/css/exercise.css create mode 100755 catalogue/static/catalogue/css/exercise.scss diff --git a/catalogue/models.py b/catalogue/models.py index 8ff6be4..fadb718 100644 --- a/catalogue/models.py +++ b/catalogue/models.py @@ -70,14 +70,17 @@ class Lesson(models.Model): 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.build_html() 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) diff --git a/catalogue/static/catalogue/css/carousel.css b/catalogue/static/catalogue/css/carousel.css index 3392bb2..abf7ce0 100644 --- a/catalogue/static/catalogue/css/carousel.css +++ b/catalogue/static/catalogue/css/carousel.css @@ -17,7 +17,6 @@ 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%; } diff --git a/catalogue/static/catalogue/css/exercise.css b/catalogue/static/catalogue/css/exercise.css new file mode 100644 index 0000000..b9c91e9 --- /dev/null +++ b/catalogue/static/catalogue/css/exercise.css @@ -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 index 0000000..6fe8c9a --- /dev/null +++ b/catalogue/static/catalogue/css/exercise.scss @@ -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; + } + } +} diff --git a/catalogue/static/catalogue/css/lesson.css b/catalogue/static/catalogue/css/lesson.css index 65da41d..6ba748e 100644 --- a/catalogue/static/catalogue/css/lesson.css +++ b/catalogue/static/catalogue/css/lesson.css @@ -213,82 +213,6 @@ em.person { .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; } diff --git a/catalogue/static/catalogue/css/lesson.scss b/catalogue/static/catalogue/css/lesson.scss index 95e8be4..543ee8f 100755 --- a/catalogue/static/catalogue/css/lesson.scss +++ b/catalogue/static/catalogue/css/lesson.scss @@ -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 { diff --git a/catalogue/static/catalogue/js/carousel.js b/catalogue/static/catalogue/js/carousel.js index e340eaa..b7e5021 100755 --- a/catalogue/static/catalogue/js/carousel.js +++ b/catalogue/static/catalogue/js/carousel.js @@ -15,14 +15,16 @@ $.fn.cycle.transitions.rgrowY = function($cont, $slides, opts) { 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(){}, + }); }); diff --git a/catalogue/static/catalogue/js/edumed.js b/catalogue/static/catalogue/js/edumed.js index d8f3d94..cc7b9e1 100644 --- a/catalogue/static/catalogue/js/edumed.js +++ b/catalogue/static/catalogue/js/edumed.js @@ -1,7 +1,8 @@ +// Generated by CoffeeScript 1.4.0 (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; @@ -22,45 +23,54 @@ __extends(EduModule, _super); function EduModule(element) { - var _this = this; 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); - Excercise = (function(_super) { + Exercise = (function(_super) { - __extends(Excercise, _super); + __extends(Exercise, _super); - function Excercise(element) { + function Exercise(element) { 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() { - 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'); }; - Excercise.prototype.piece_incorrect = function(qpiece) { + Exercise.prototype.piece_incorrect = function(qpiece) { return $(qpiece).removeClass('correct').addClass('incorrect'); }; - Excercise.prototype.check = function() { + Exercise.prototype.check = function() { var score, scores, _this = this; scores = []; @@ -75,7 +85,15 @@ 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) { @@ -86,7 +104,7 @@ 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 = []; @@ -102,29 +120,49 @@ 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]); }; - Excercise.prototype.draggable_equal = function($draggable1, $draggable2) { + Exercise.prototype.draggable_equal = function($draggable1, $draggable2) { 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]; - if (this.draggable_equal($draggable, $(d))) return false; + if (this.draggable_equal($draggable, $(d))) { + return false; + } } return true; }; - Excercise.prototype.draggable_dropped = function($draggable) { - return $draggable.append('x'); + 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('x'); + 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; @@ -139,7 +177,9 @@ 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)); } @@ -151,25 +191,8 @@ return is_accepted; }, drop: function(ev, ui) { - var $added, added, - _this = this; $(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('x'); - 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'); @@ -181,7 +204,7 @@ }); }; - return Excercise; + return Exercise; })(Binding); @@ -209,7 +232,9 @@ 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; @@ -224,11 +249,27 @@ 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; - })(Excercise); + })(Exercise); Uporzadkuj = (function(_super) { @@ -242,13 +283,13 @@ } 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; - 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; @@ -260,9 +301,35 @@ 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; - })(Excercise); + })(Exercise); Luki = (function(_super) { @@ -292,9 +359,18 @@ 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; - })(Excercise); + })(Exercise); Zastap = (function(_super) { @@ -316,8 +392,7 @@ 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")) { @@ -332,8 +407,21 @@ 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) { - 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; @@ -341,7 +429,7 @@ 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; @@ -373,7 +461,7 @@ return Zastap; - })(Excercise); + })(Exercise); Przyporzadkuj = (function(_super) { @@ -384,7 +472,9 @@ _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; }; @@ -400,45 +490,70 @@ }; 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; - 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]; - pred = $(qp).closest("[data-predicate]"); 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 { - 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; - })(Excercise); + })(Exercise); PrawdaFalsz = (function(_super) { @@ -481,11 +596,27 @@ 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; - })(Excercise); + })(Exercise); - excercise = function(ele) { + exercise = function(ele) { var cls, es; es = { wybor: Wybor, @@ -505,8 +636,8 @@ $(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); }); }); diff --git a/edumed/settings.d/50-static.py b/edumed/settings.d/50-static.py index 2d7c9a5..23d963a 100644 --- a/edumed/settings.d/50-static.py +++ b/edumed/settings.d/50-static.py @@ -20,6 +20,7 @@ PIPELINE_CSS = { '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', -- 2.20.1