//<pre>
// Script to pose study questions on a given topic
//
// To use this script, add "importScript('User:Proteins/studyquestions.js');" to your monobook.js subpage
// under your user page, as you can see at User:Proteins/monobook.js
//******************
// The Main Function
//******************
function poseStudyQuestions() {
var alert_string = "";
var backup_string = "";
var summary_string = "";
var question_string = "";
var allow_questions_to_be_repeated = true;
var body_content;
var span_nodes;
var temp_span_node;
var num_span_nodes = 0;
var span_node_index = 0;
var random_index = 0;
var max_random_index = 0;
var question_index = 0;
var question_counter = 0;
var study_question_index = 0;
var num_study_questions = 0;
var num_questions_posed = 0;
var num_questions_desired = 0;
var num_questions_selected = 0;
var num_questions_remaining = 0;
var num_answers = 0;
var answer_index = 0;
var answer_counter = 0;
var num_answers_selected = 0;
var num_answers_remaining = 0;
var num_answers_printed_with_question = 5;
var num_correct_answers = 0;
var num_incorrect_answers = 0;
var percentage_of_correct_answers = 0;
var temp_study_question;
var study_question_text = "";
var answer_list = new Array();
var study_question_list = new Array();
var study_question_has_been_posed = new Array();
var selected_study_question_indices = new Array();
var temp_answer;
var correct_answer_node;
var user_answer_index = 0;
var printed_answer_index = 0;
var correct_answer_index = 0;
var correct_printed_answer_index = 0;
var selected_answer_indices = new Array();
var answer_has_been_chosen_already = new Array();
// Get the bodyContent node
body_content = document.getElementById('bodyContent');
if (!body_content) {
error_string = "ERROR: There is no bodyContent node in this article.";
window.alert(error_string);
return;
}
span_nodes = body_content.getElementsByTagName("SPAN");
if (!span_nodes) {
error_string = "ERROR: This page has no SPAN nodes.\n";
window.alert(error_string);
return;
}
num_span_nodes = span_nodes.length;
if (num_span_nodes < 1) {
error_string = "ERROR: This page has zero SPAN nodes.\n";
window.alert(error_string);
return;
}
//**********************************************
// Count the number of study questions on a page
//**********************************************
for (span_node_index=0; span_node_index<num_span_nodes; span_node_index++) {
temp_span_node = span_nodes[span_node_index];
if (!temp_span_node) { continue; }
if (temp_span_node.className.match(/study_question/)) {
num_study_questions++;
study_question_list.push(temp_span_node);
}
} // closes loop over the SPAN nodes in the main article
if (num_study_questions < 1) {
error_string = "No study questions were found on this page.";
window.alert(error_string);
return;
} else if (num_study_questions == 1) {
alert_string = "This page has one type of study question.\n\n";
backup_string = "This page has only one type of study question.\n\n";
// window.alert(alert_string);
} else {
alert_string = "This page has " + num_study_questions + " types of study questions.\n\n";
backup_string = "This page has only " + num_study_questions + " types of study questions.\n\n";
// window.alert(alert_string);
}
// Ask the reader how many study questions they'd like to try
num_questions_desired = window.prompt(alert_string + "How many examples would you like to try?");
if (!allow_questions_to_be_repeated) {
while (num_questions_desired > num_study_questions) {
num_questions_desired = window.prompt(backup_string + "Please choose a number less than or equal to " + num_study_questions);
}
}
// Loop over the questions to initialize the markers
for (question_index=0; question_index<num_study_questions; question_index++) {
temp_study_question = study_question_list[question_index];
if (!temp_study_question) {
error_string = "Study question " + question_index + " is undefined now (initialization).\n";
window.alert(error_string);
continue;
}
study_question_has_been_posed[question_index] = false;
} // closes initialization loop over all the study questions
// Select the questions at random
num_questions_selected = 0;
while (num_questions_selected < num_questions_desired) {
if (allow_questions_to_be_repeated) {
question_index = Math.floor(num_study_questions*Math.random());
selected_study_question_indices[num_questions_selected] = question_index;
num_questions_selected++;
} else {
num_questions_remaining = num_study_questions - num_questions_selected;
random_index = Math.floor(num_questions_remaining*Math.random());
question_counter = 0;
for (question_index=0; question_index<num_study_questions; question_index++) {
if (study_question_has_been_posed[question_index] != false) {
continue;
}
if (question_counter == random_index) {
study_question_has_been_posed[question_index] = true;
selected_study_question_indices[num_questions_selected] = question_index;
num_questions_selected++;
break;
}
question_counter++;
} // closes loop over all study questions
} // closes check whether questions are allowed to be repeated
} // closes while loop selecting the study questions for presentation
//************************
// Loop over the questions
//************************
for (question_index=1; question_index<=num_questions_selected; question_index++) {
study_question_index = selected_study_question_indices[question_index-1];
temp_study_question = study_question_list[study_question_index];
if (!temp_study_question) {
error_string = "Study question " + question_index + " is undefined now (main loop).\n";
window.alert(error_string);
continue;
}
question_string = temp_study_question.title;
if (!question_string) {
error_string = "ERROR: No question string in study question " + study_question_index + "\n";
window.alert(error_string);
continue;
}
if (!question_string.match(/SUBJECT/)) {
error_string = "ERROR: No SUBJECT in question string of study question " + study_question_index + "\n";
window.alert(error_string);
continue;
}
question_string = "Question " + question_index + ": " + question_string;
// window.alert(question_string);
// Determine all the answers
num_answers = 0;
span_nodes = temp_study_question.getElementsByTagName("SPAN");
if (!span_nodes) {
error_string = "ERROR: This study question has no SPAN nodes.\n";
window.alert(error_string);
return;
}
num_span_nodes = span_nodes.length;
if (num_span_nodes < 1) {
error_string = "ERROR: This study question has zero SPAN nodes.\n";
window.alert(error_string);
return;
}
for (span_node_index=0; span_node_index<num_span_nodes; span_node_index++) {
temp_span_node = span_nodes[span_node_index];
if (!temp_span_node) { continue; }
if (temp_span_node.className.match(/answer/)) {
answer_list[num_answers] = temp_span_node;
answer_has_been_chosen_already[num_answers] = false;
num_answers++;
}
} // closes loop over the SPAN nodes in the main article
alert_string = "Study question " + question_index + " (type " + study_question_index + ") has " + num_answers + " possible answers.\n";
// window.alert(alert_string);
// Choose num_answers_printed_with_question random answers for printing
num_answers_selected = 0;
while (num_answers_selected < num_answers_printed_with_question) {
num_answers_remaining = num_answers - num_answers_selected;
random_index = Math.floor(num_answers_remaining*Math.random());
answer_counter = 0;
for (answer_index=0; answer_index<num_answers; answer_index++) {
if (answer_has_been_chosen_already[answer_index] != false) {
continue;
}
if (answer_counter == random_index) {
answer_has_been_chosen_already[answer_index] = true;
selected_answer_indices[num_answers_selected] = answer_index;
num_answers_selected++;
break;
}
answer_counter++;
} // closes loop over all possible answers to the question
} // closes while() loop that selects the answers
// Generate the question, choose correct and incorrect answers
correct_printed_answer_index = Math.floor(num_answers_selected*Math.random());
correct_answer_index = selected_answer_indices[correct_printed_answer_index];
correct_answer_node = answer_list[correct_answer_index];
if (!correct_answer_node) { continue; }
correct_printed_answer_index++;
correct_answer_string = correct_answer_node.innerHTML.replace(/<[^>]+>/ig,"");
question_string = question_string.replace(/SUBJECT/, correct_answer_node.title) + "\n\n";
// window.alert(question_string);
for (printed_answer_index=1; printed_answer_index<=num_answers_selected; printed_answer_index++) {
answer_index = selected_answer_indices[printed_answer_index-1];
// question_string += printed_answer_index + ". Answer " + answer_index + "\n\n";
temp_answer = answer_list[answer_index];
if (!temp_answer) {
error_string = "ERROR: Printed answer " + printed_answer_index + " of study question " + study_question_index + " is undefined.\n\n";
window.alert(error_string);
continue;
}
question_string += printed_answer_index + ". " + temp_answer.innerHTML.replace(/<[^>]+>/ig,"") + "\n\n";
} // closes loop over answers to be printed
// window.alert(question_string);
// Present the question in a prompt window
question_string += "Please type in the number of the correct answer (1–" + num_answers_selected + "):";
user_answer_index = window.prompt(question_string);
num_questions_posed++;
// Evaluate the answer
if (user_answer_index == correct_printed_answer_index) {
num_correct_answers++;
window.alert("Congratulations! You picked the correct answer.\n");
} else {
window.alert("Sorry! The correct answer was " + correct_printed_answer_index + ": " + correct_answer_string + "\n");
}
} // closes loop over the study questions
// Print summary of number of correct answers
percentage_of_correct_answers = 0;
if (num_questions_posed > 0) {
percentage_of_correct_answers = Math.round((100 * num_correct_answers) / num_questions_posed);
summary_string = "You gave " + num_correct_answers + " correct answers out of " + num_questions_posed + " questions posed (" + percentage_of_correct_answers + "%).\n\n";
window.alert(summary_string);
}
} // closes function poseStudyQuestions()
$(function () {
mw.util.addPortletLink('p-navigation', 'javascript:poseStudyQuestions()', 'Study questions', 'ca-questions', 'Poses study questions on this topic to the reader', '', '');
});
//</pre>