User:Proteins/studyquestions.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<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>