MediaWiki:Gadget-zmquiz.js
Материал из Абсурдопедии
Перейти к навигацииПерейти к поискуЗамечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
- Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
- Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
- Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
- Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
( function ( mw, $ ) {
/**
* Script for quizzes and tests
* see [[Template:ZmQuiz]] (ru) for details
* author: Źmicier Dzikański
* date: 7 / 10 / 2017
* version: 2.4.1
*/
if($('.zmQuizBody')[0]) {
var type;
var results;
var step;
var questionsCollection;
var amIFine;
var questionsArray = $('.zmQuizBacklogBlock').children();
var messages = loadMessages();
var quizSettings = {};
quizSettings['points'] = {
setInitialValues : function() {
results = 0;
step = 0;
questionsCollection = loadQuestionsCollectionAsList();
},
getQuestion : function() {
return questionsCollection[step];
},
processAnswerMarker : function(answerMarker) {
results += parseFloat(answerMarker);
step++;
},
buildResults : function(resultsArray) {
resultBlock = "";
for(i = 0; i < resultsArray.length; i++ ) {
interval = $(resultsArray[i]).attr('data-marker');
beginOfInterval = parseFloat(interval.split(',')[0]);
endOfInterval = parseFloat(interval.split(',')[1]);
if(beginOfInterval <= results && results < endOfInterval) {
resultBlock = $(resultsArray[i]).html();
break;
}
}
if(!resultBlock || 0 === resultBlock.length) {
showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
} else {
return getParagraphMessage("zmQuiz-tpoints-result", results) + "<p>" + resultBlock + "</p>";
}
}
}
quizSettings['character'] = {
setInitialValues : function() {
results = {};
step = 0;
questionsCollection = loadQuestionsCollectionAsList();
},
getQuestion : function() {
return questionsCollection[step];
},
processAnswerMarker : function(answerMarker) {
if(results[answerMarker]) {
results[answerMarker] += 1;
} else {
results[answerMarker] = 1;
}
step++;
},
buildResults : function(resultsArray) {
resultBlock = "";
var max = -1;
var arrayOfPopulars = [];
for(i = 0; i < resultsArray.length; i++ ) {
marker = $(resultsArray[i]).attr('data-marker');
if(!(marker in results)) {
continue;
}
if(results[marker] == max) {
arrayOfPopulars.push($(resultsArray[i]).html());
} else if(results[marker] > max) {
max = results[marker];
arrayOfPopulars = [$(resultsArray[i]).html()];
}
}
if(arrayOfPopulars.length == 0) {
showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
return;
} else if(arrayOfPopulars.length == 1) {
resultBlock="";
} else if(arrayOfPopulars.length > 1) {
resultBlock=getParagraphMessage("zmQuiz-tcharacteristics-several");
}
for(i = 0; i < arrayOfPopulars.length; i++ ) {
resultBlock += "<p>" + arrayOfPopulars[i] + "</p>";
}
return resultBlock;
}
}
quizSettings['quest'] = {
setInitialValues : function() {
step = $(questionsArray[0]).attr('data-marker');
questionsCollection = loadQuestionsCollectionAsMap();
},
getQuestion : function() {
questions = questionsCollection[step];
if(questions) {
return questions[0];
}
},
processAnswerMarker : function(answerMarker) {
step = answerMarker;
},
buildResults : function(resultsArray) {
for(i = 0; i < resultsArray.length; i++ ) {
marker = $(resultsArray[i]).attr('data-marker');
if(marker == step) {
return "<p>" + $(resultsArray[i]).html() + "</p>";
}
}
showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
}
}
/* init processes */
type = $('.zmQuizBody').attr('data-type');
thisQuizSettings = quizSettings[type];
init();
/* main logic */
function init() {
amIFine = true;
$(".zmQuizBody").html(getParagraphMessage("zmQuiz-quiz-description") + "<p><a class=\"zmQuizStartButton\" style=\"cursor: pointer\">" + getMessage("zmQuiz-begin") + "</a></p>");
$(".zmQuizStartButton" ).click(function() {
if(thisQuizSettings == null) {
showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-type", type)));
return;
} else {
thisQuizSettings.setInitialValues();
}
showQuestion();
});
}
function showQuestion() {
question = thisQuizSettings.getQuestion();
if(question) {
$(".zmQuizBody").html($(question).find( ".zmQuizQuestionText" ).html());
$(".zmQuizBody").append("<ul></ul>\n");
answers = $(question).find( ".zmQuizAnswer" );
for(i = 0; i < answers.length; i++ ) {
$(".zmQuizBody ul").append("<li><a id=\"zmQuizAnswer_"+step+"_"+i+"\" style=\"cursor: pointer\">" + $(answers[i]).html() + "</a></li>\n");
$("#zmQuizAnswer_"+step+"_"+i).click({marker: $(answers[i]).attr('data-points')}, processClick);
}
} else {
showResult();
}
}
function showResult() {
resultsArray = $('.zmQuizResultsBlock').children();
resultBlock = thisQuizSettings.buildResults(resultsArray);
if(amIFine) {
$(".zmQuizBody").html("<p style='font-weight: bold;'>" + getMessage("zmQuiz-quiz-passed") +"</p>" + resultBlock + "<p><a class=\"zmQuizRepeatButton\" style=\"cursor: pointer\">" + getMessage("zmQuiz-repeat") + "</a></p>");
$(".zmQuizRepeatButton" ).click(init);
}
}
function showError(erMessage) {
amIFine = false;
$(".zmQuizBody").html(erMessage);
}
function processClick(event) {
answerMarker = event.data.marker;
thisQuizSettings.processAnswerMarker(answerMarker);
showQuestion();
}
function loadQuestionsCollectionAsMap() {
questionsMap = {};
for(var i = 0; i < questionsArray.length; i++) {
marker = $(questionsArray[i]).attr('data-marker');
if(marker == null) {
marker = i.toString();
}
if(questionsMap[marker]) {
questionsMap[marker].push($(questionsArray[i]));
} else {
questionsMap[marker] = [$(questionsArray[i])];
}
}
return questionsMap;
}
function loadQuestionsCollectionAsList() {
return questionsArray.slice();
}
function loadMessages() {
messages = {};
messagesHTML = $('.zmQuizMessages').children();
for(i = 0; i < messagesHTML.length; i++ ) {
messages[$(messagesHTML[i]).attr('id')] = $(messagesHTML[i]).html();
}
return messages;
}
function getMessage() {
key = arguments[0];
message = messages[key];
for (var i = 1; i < arguments.length; i++) {
message = message.replace(new RegExp("#\\("+i+"\\)", 'g'), arguments[i]);
}
return message;
}
function getParagraphMessage() {
return "<p>" + getMessage.apply(this, arguments) + "</p>";
}
}
}( mediaWiki, jQuery ) );