X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/2a6069ee7cd170f9d9f1787042e3077af0e2194a..a85740df875a17b21d94b777b4152e77dbae6e28:/redakcja/static/edumed/js/edumed.coffee?ds=sidebyside diff --git a/redakcja/static/edumed/js/edumed.coffee b/redakcja/static/edumed/js/edumed.coffee index 0afdae36..4bd8bed9 100644 --- a/redakcja/static/edumed/js/edumed.coffee +++ b/redakcja/static/edumed/js/edumed.coffee @@ -15,7 +15,6 @@ class EduModule extends Binding $(".teacher", @element).addClass "show" else $(".teacher", @element).removeClass "show" - class Excercise extends Binding @@ -27,10 +26,11 @@ class Excercise extends Binding $('.solutions', @element).click => @show_solutions() - -class Wybor extends Excercise - constructor: (element) -> - super element + piece_correct: (qpiece) -> + $(qpiece).removeClass('incorrect').addClass('correct') + + piece_incorrect: (qpiece) -> + $(qpiece).removeClass('correct').addClass('incorrect') check: -> scores = [] @@ -42,16 +42,29 @@ class Wybor extends Excercise score[0] += s[0] score[1] += s[1] @show_score(score) - + + get_value_list: (elem, data_key) -> + $(elem).data(data_key).split(',').map($.trim).map((x) -> parseInt(x)) + + + show_score: (score) -> + $(".message", @element).text("Wynik: #{score[0]} / #{score[1]}") + + +class Wybor extends Excercise + constructor: (element) -> + super element + + check_question: (question) -> all = 0 good = 0 - solution = $(question).attr('data-solution').split(',').map($.trim).map((x)->parseInt(x)) + solution = @get_value_list(question, 'solution') $(".question-piece", question).each (i, qpiece) => piece_no = parseInt $(qpiece).attr 'data-no' should_be_checked = solution.indexOf(piece_no) >= 0 is_checked = $("input", qpiece).is(":checked") - + if should_be_checked all += 1 @@ -63,28 +76,180 @@ class Wybor extends Excercise @piece_incorrect qpiece else $(qpiece).removeClass("correct,incorrect") - + return [good, all] - - piece_correct: (qpiece) -> - $(qpiece).removeClass('incorrect').addClass('correct') - piece_incorrect: (qpiece) -> - $(qpiece).removeClass('correct').addClass('incorrect') - show_solutions: -> - - show_score: (score) -> - $(".message", @element).text("Wynik: #{score[0]} / #{score[1]}") - + +class Uporzadkuj extends Excercise + constructor: (element) -> + super element + $('ol, ul', @element).sortable({ items: "> li" }) + + check_question: (question) -> + positions = @get_value_list(question, 'original') + sorted = positions.sort() + pkts = $('.question-piece', question) + + correct = 0 + all = 0 + + for pkt in [0...pkts.length] + all +=1 + if pkts.eq(pkt).data('pos') == sorted[pkt] + correct += 1 + @piece_correct pkts.eq(pkt) + else + @piece_incorrect pkts.eq(pkt) + return [correct, all] + + +class Luki extends Excercise + constructor: (element) -> + super element + + check: -> + all = 0 + correct = 0 + $(".question-piece", @element).each (i, qpiece) => + if $(qpiece).data('solution') == $(qpiece).val() + @piece_correct qpiece + correct += 1 + else + @piece_incorrect qpiece + all += 1 + + @show_score [correct, all] + + +class Zastap extends Excercise + constructor: (element) -> + super element + $(".paragraph", @element).each (i, par) => + @wrap_words $(par), $('') + spans = $("> span", par).attr("contenteditable", "true") + spans.click (ev) => + spans.filter(':not(:empty)').removeClass('editing') + $(ev.target).addClass('editing') + + + check: -> + all = 0 + correct = 0 + $(".question-piece", @element).each (i, qpiece) => + txt = $(qpiece).data('original') + should_be_changed = false + if not txt? + txt = $(qpiece).data('solution') + should_be_changed = true + if not txt? + return + + if should_be_changed + all += 1 + + if txt != $(qpiece).text() + @piece_incorrect qpiece + else + if should_be_changed + @piece_correct qpiece + correct += 1 + + @show_score [correct, all] + + wrap_words: (element, wrapper) -> + # This function wraps each word of element in wrapper, but does not descend into child-tags of element. + # It doesn't wrap things between words (defined by ignore RE below). Warning - ignore must begin with ^ + ignore = /^[ \t.,:;()]+/ + + insertWrapped = (txt, elem) -> + nw = wrapper.clone() + $(document.createTextNode(txt)) + .wrap(nw).parent().attr("data-original", txt).insertBefore(elem) + + for j in [element.get(0).childNodes.length-1..0] + chld = element.get(0).childNodes[j] + if chld.nodeType == document.TEXT_NODE + len = chld.textContent.length + wordb = 0 + i = 0 + while i < len + space = ignore.exec(chld.textContent.substr(i)) + if space? + if wordb < i + insertWrapped(chld.textContent.substr(wordb, i-wordb), chld) + + $(document.createTextNode(space[0])).insertBefore(chld) + i += space[0].length + wordb = i + else + i = i + 1 + if wordb < len - 1 + insertWrapped(chld.textContent.substr(wordb, len - 1 - wordb), chld) + $(chld).remove() + + +class Przyporzadkuj extends Excercise + constructor: (element) -> + super element + + if @element.attr('multiple')? + @multiple = true + else + @multiple = false + + $(".question", @element).each (i, question) => + draggable_opts = + revert: 'invalid' + helper: if @multiple then "clone" else null + + $(".draggable", question).draggable(draggable_opts) + .droppable({ + accept: ".draggable" + }) + + $(".predicate .droppable", question).droppable + accept: ".draggable" + drop: (ev, ui) -> + is_multiple = ui.draggable.is(".multiple") + + added = ui.draggable.clone() + + added.attr('style', '') + $(this).append(added) + added.draggable(draggable_opts) + + if not is_multiple + ui.draggable.remove() + + $(".subject", question).droppable + accept: ".draggable" + drop: (ev, ui) -> + is_multiple = ui.draggable.is(".multiple") + + added = ui.draggable.clone() + + added.attr('style', '') + if not is_multiple + $(this).append(added) + added.draggable(draggable_opts) + + ui.draggable.remove() + + ########## excercise = (ele) -> es = - 'wybor': Wybor + wybor: Wybor + uporzadkuj: Uporzadkuj + luki: Luki + zastap: Zastap + przyporzadkuj: Przyporzadkuj + cls = es[$(ele).attr('data-type')] new cls(ele) @@ -98,6 +263,6 @@ window.edumed = $(document).ready () -> new EduModule($("#book-text")) - + $(".excercise").each (i, el) -> excercise(this) \ No newline at end of file