From: moodler Date: Mon, 22 Dec 2003 15:09:25 +0000 (+0000) Subject: Latest version from Paul Shew X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=0787779dad5ddd1c057ea59ebb3dd6d9f78af878;p=moodle.git Latest version from Paul Shew --- diff --git a/mod/quiz/format/gift/format.php b/mod/quiz/format/gift/format.php index 3a5065fb29..9da0198736 100755 --- a/mod/quiz/format/gift/format.php +++ b/mod/quiz/format/gift/format.php @@ -1,111 +1,121 @@ - 0 and $answer_weight <> 1){ - /// $question->single = 0; // ok many good answers - /// } - return $answer_weight; - } - - - function commentparser(&$answer) { - //Answer Comment parser - if (strpos($answer,"#") > 0){ - $hashpos = strpos($answer,"#"); - $comment = addslashes(substr($answer, $hashpos+1)); - $answer = substr($answer, 0, $hashpos); - } else { - $comment = " "; - } - return $comment; - } - + function answerweightparser(&$answer) { + $answer = substr($answer, 1); // removes initial % + $end_position = strpos($answer, "%"); + $answer_weight = substr($answer, 0, $end_position); // gets weight as integer + $answer_weight = $answer_weight/100; // converts to percent + $answer = substr($answer, $end_position+1); // removes comment from answer + // To enable multiple answers (if fractional answer weights are assigned) + // uncomment the following three lines. + // if ($answer_weight > 0 and $answer_weight <> 1){ + // $question->single = 0; // ok many good answers + // } + return $answer_weight; + } + + + function commentparser(&$answer) { + if (strpos($answer,"#") > 0){ + $hashpos = strpos($answer,"#"); + $comment = addslashes(substr($answer, $hashpos+1)); + $answer = substr($answer, 0, $hashpos); + } else { + $comment = " "; + } + return $comment; + } + function readquestion($lines) { - /// Given an array of lines known to define a question in this format, this function - /// converts it into a question object suitable for processing and insertion into Moodle. + // Given an array of lines known to define a question in this format, this function + // converts it into a question object suitable for processing and insertion into Moodle. $question = NULL; $comment = NULL; - $answer_weight_regex = "^%\-*([0-9]{1,2})\.?([0-9]*)%"; - $text = implode(" ", $lines); - - /// QUESTION NAME parser - $text = trim($text); - if (substr($text, 0, 2) == "::") { - $text = substr($text, 2); - - $namefinish = strpos($text, "::"); - if ($namefinish === false) { - $question->name = false; - // name will be assigned after processing question text below - } else { - $question->name = addslashes(trim(substr($text, 0, $namefinish))); - $text = substr($text, $namefinish+2); // Remove name from text - } - } else { - $question->name = false; - } - - - /// FIND ANSWER section + define("GIFT_ANSWERWEIGHT_REGEX", "^%\-*([0-9]{1,2})\.?([0-9]*)%"); + + $text = trim(implode(" ", $lines)); + + // QUESTION NAME parser + if (substr($text, 0, 2) == "::") { + $text = substr($text, 2); + + $namefinish = strpos($text, "::"); + if ($namefinish === false) { + $question->name = false; + // name will be assigned after processing question text below + } else { + $question->name = addslashes(trim(substr($text, 0, $namefinish))); + $text = trim(substr($text, $namefinish+2)); // Remove name from text + } + } else { + $question->name = false; + } + + + // FIND ANSWER section $answerstart = strpos($text, "{"); if ($answerstart === false) { if ($this->displayerrors) { @@ -125,150 +135,241 @@ class quiz_file_format extends quiz_default_format { $answerlength = $answerfinish - $answerstart; $answertext = trim(substr($text, $answerstart + 1, $answerlength - 1)); - /// SAVE QUESTION TEXT without answer, inserting "_____" as necessary - if (substr($text, -1) == "}") { - /// no blank line if answers follow question, outside of closing punctuation - $question->questiontext = addslashes(substr_replace($text, "", $answerstart, $answerlength+1)); - } else { - /// inserts blank line for missing word format - $question->questiontext = addslashes(substr_replace($text, "_____", $answerstart, $answerlength+1)); - } - - /// set question name if not already set - if ($question->name === false) { - $question->name = $question->questiontext; - } - - - /// ANSWERS - // Only Multiple-choice questions contain tilde ~ - if (strstr($answertext, "~") !== FALSE) { // tilde conditional - - ///MULTIPLE CHOICE - $answertext = str_replace("=", "~=", $answertext); - $answers = explode("~", $answertext); - if (isset($answers[0])) { - $answers[0] = trim($answers[0]); - } - if (empty($answers[0])) { - array_shift($answers); - } - - $countanswers = count($answers); - if ($countanswers < 2) { // MC $countanswers conditional + // Format QUESTION TEXT without answer, inserting "_____" as necessary + if (substr($text, -1) == "}") { + // no blank line if answers follow question, outside of closing punctuation + $question->questiontext = addslashes(trim(substr_replace($text, "", $answerstart, $answerlength+1))); + } else { + // inserts blank line for missing word format + $question->questiontext = addslashes(trim(substr_replace($text, "_____", $answerstart, $answerlength+1))); + } + + // set question name if not already set + if ($question->name === false) { + $question->name = $question->questiontext; + } + + + // determine QUESTION TYPE + $question->qtype = NULL; + + if ($answertext{0} == "#"){ + $question->qtype = NUMERICAL; + + } elseif (strstr($answertext, "~") !== false) { + // only Multiplechoice questions contain tilde ~ + $question->qtype = MULTICHOICE; + + } else { // either TRUEFALSE or SHORTANSWER + + // TRUEFALSE question check + $truefalse_check = $answertext; + if (strpos($answertext,"#") > 0){ + // strip comments to check for TrueFalse question + $truefalse_check = trim(substr($answertext, 0, strpos($answertext,"#"))); + } + + $valid_tf_answers = array("T", "TRUE", "F", "FALSE"); + if (in_array($truefalse_check, $valid_tf_answers)) { + $question->qtype = TRUEFALSE; + + } else { // Must be SHORTANSWER + $question->qtype = SHORTANSWER; + } + } + + if (!isset($question->qtype)) { + if ($this->displayerrors) { + echo "

$text

Question type not set."; + } + return false; + } + + switch ($question->qtype) { + case MULTICHOICE: + $answertext = str_replace("=", "~=", $answertext); + $answers = explode("~", $answertext); + if (isset($answers[0])) { + $answers[0] = trim($answers[0]); + } + if (empty($answers[0])) { + array_shift($answers); + } + + $countanswers = count($answers); + if ($countanswers < 2) { + if ($this->displayerrors) { + echo "

$text

Found tilde for multiple choice, + but too few answers for Multiple Choice.
+ Found $countanswers answers in answertext."; + } + return false; + break; + } + + $question->single = 1; // Only one answer allowed by default + + foreach ($answers as $key => $answer) { + $answer = trim($answer); + + // determine answer weight + if ($answer[0] == "=") { + $answer_weight = 1; + $answer = substr($answer, 1); + + } elseif (ereg(GIFT_ANSWERWEIGHT_REGEX, $answer)) { // check for properly formatted answer weight + $answer_weight = $this->answerweightparser($answer); + + } else { //default, i.e., wrong anwer + $answer_weight = 0; + } + $question->fraction[$key] = $answer_weight; + $question->feedback[$key] = $this->commentparser($answer); // commentparser also removes comment from $answer + $question->answer[$key] = addslashes($answer); + } // end foreach answer + + $question->defaultgrade = 1; + $question->image = ""; // No images with this format + return $question; + break; + + case TRUEFALSE: + $answer = $answertext; + $comment = $this->commentparser($answer); // commentparser also removes comment from $answer + + if ($answer == "T" OR $answer == "TRUE") { + $question->answer = 1; + $question->feedbackfalse = $comment; //feedback if answer is wrong + } else { + $question->answer = 0; + $question->feedbacktrue = $comment; //feedback if answer is wrong + } + $question->defaultgrade = 1; + $question->image = ""; // No images with this format + return $question; + break; + + case SHORTANSWER: + // SHORTANSWER Question + $answers = explode("=", $answertext); + if (isset($answers[0])) { + $answers[0] = trim($answers[0]); + } + if (empty($answers[0])) { + array_shift($answers); + } + + if (count($answers) == 0) { + // invalid question + if ($this->displayerrors) { + echo "

$text

Found equals=, but no answers in answertext"; + } + return false; + break; + } + + foreach ($answers as $key => $answer) { + $answer = trim($answer); + + // Answer Weight + if (ereg(GIFT_ANSWERWEIGHT_REGEX, $answer)) { // check for properly formatted answer weight + $answer_weight = $this->answerweightparser($answer); + } else { //default, i.e., full-credit anwer + $answer_weight = 1; + } + $question->fraction[$key] = $answer_weight; + $question->feedback[$key] = $this->commentparser($answer); //commentparser also removes comment from $answer + $question->answer[$key] = addslashes($answer); + } // end foreach + + $question->usecase = 0; // Ignore case + $question->defaultgrade = 1; + $question->image = ""; // No images with this format + return $question; + break; + + case NUMERICAL: + // Note similarities to ShortAnswer + $answertext = substr($answertext, 1); // remove leading "#" + + $answers = explode("=", $answertext); + if (isset($answers[0])) { + $answers[0] = trim($answers[0]); + } + if (empty($answers[0])) { + array_shift($answers); + } + + if (count($answers) == 0) { + // invalid question + if ($this->displayerrors) { + echo "

$text

No answers found in answertext (Numerical answer)"; + } + return false; + break; + } + + foreach ($answers as $key => $answer) { + $answer = trim($answer); + + // Answer weight + if (ereg(GIFT_ANSWERWEIGHT_REGEX, $answer)) { // check for properly formatted answer weight + $answer_weight = $this->answerweightparser($answer); + } else { //default, i.e., full-credit anwer + $answer_weight = 1; + } + $question->fraction[$key] = $answer_weight; + $question->feedback[$key] = $this->commentparser($answer); //commentparser also removes comment from $answer + + //Calculate Answer and Min/Max values + if (strpos($answer,"..") > 0) { // optional [min]..[max] format + $marker = strpos($answer,".."); + $question->max[$key] = trim(substr($answer, $marker+2)); + $question->min[$key] = trim(substr($answer, 0, $marker)); + $question->answer[$key] = ($question->max[$key] + $question->min[$key])/2; + + } elseif (strpos($answer,":") > 0){ // standard [answer]:[errormargin] format + $marker = strpos($answer,":"); + $errormargin = trim(substr($answer, $marker+1)); + $question->answer[$key] = trim(substr($answer, 0, $marker)); + $question->max[$key] = $question->answer[$key] + $errormargin; + $question->min[$key] = $question->answer[$key] - $errormargin; + + } else { // only one valid answer (zero errormargin) + $errormargin = 0; + $question->answer[$key] = trim($answer); + $question->max[$key] = $question->answer[$key] + $errormargin; + $question->min[$key] = $question->answer[$key] - $errormargin; + } + + if (!is_numeric($question->answer[$key]) + OR !is_numeric($question->max[$key]) + OR !is_numeric($question->max[$key])) { + if ($this->displayerrors) { + echo "

$text

For numerical questions, answer must be numbers. +

Answer: $answer

ErrorMargin: $errormargin ."; + } + return false; + break; + } + + } // end foreach + + $question->defaultgrade = 1; + $question->image = ""; // No images with this format + return $question; + break; + + default: if ($this->displayerrors) { - echo "

Found tilde, but " . $countanswers . " answers in $answertext"; + echo "

$text

No valid question type. Error in switch(question->qtype)"; } return false; - } else { // MC $countanswers conditional - - $question->qtype = MULTICHOICE; - $question->single = 1; // Only one answer allowed by default - - foreach ($answers as $key => $answer) { - $answer = trim($answer); - - // determine answer weight - if ($answer[0] == "=") { - $answer_weight = 1; - $answer = substr($answer, 1); - - } elseif (ereg($answer_weight_regex, $answer)) { // check for properly formatted answer weight - $answer_weight = $this->answerweightparser($answer); - - } else { //default, i.e., wrong anwer - $answer_weight = 0; - } - $question->fraction[$key] = $answer_weight; - - $comment = $this->commentparser($answer); // commentparser also cleans up $answer - $question->feedback[$key] = $comment; - - $question->answer[$key] = addslashes($answer); - } // end foreach answer - - $question->defaultgrade = 1; - $question->image = ""; // No images with this format - return $question; - } // end MC $countanswers conditional - - /// Otherwise, begin parsing other question-types - } else { // tilde conditional - - /// TRUEFALSE Question - $TF_check = $answertext; - if (strpos($answertext,"#") > 0){ - // strip comments to check for TrueFalse question - $TF_check = trim(substr($answertext, 0, strpos($answertext,"#"))); - } - - if (($TF_check == "T") // TrueFalse/ShortAnswer QuestionType conditional - OR ($TF_check == "TRUE") - OR ($TF_check == "F") - OR ($TF_check == "FALSE")) { - $answer = $answertext; - $question->qtype = TRUEFALSE; - $comment = $this->commentparser($answer); // commentparser also cleans up $answer - - if ($answer == "T" OR $answer == "TRUE") { - $question->answer = 1; - $question->feedbackfalse = $comment; //feedback if answer is wrong - } else { - $question->answer = 0; - $question->feedbacktrue = $comment; //feedback if answer is wrong - } - - - } else { // TrueFalse/ShortAnswer QuestionType conditional - - /// SHORTANSWER Question - $answers = explode("=", $answertext); - if (isset($answers[0])) { - $answers[0] = trim($answers[0]); - } - if (empty($answers[0])) { - array_shift($answers); - } - - if (count($answers) == 0) { - /// invalid question - if ($this->displayerrors) { - echo "

Found equals=, but no answers in $answertext"; - } - return false; - } else { - - $question->qtype = SHORTANSWER; - $question->usecase = 0; // Ignore case - - foreach ($answers as $key => $answer) { - $answer = trim($answer); - - // Answer Weight - if (ereg($answer_weight_regex, $answer)) { // check for properly formatted answer weight - $answer_weight = $this->answerweightparser($answer); - } else { //default, i.e., full-credit anwer - $answer_weight = 1; - } - $question->fraction[$key] = $answer_weight; - - $comment = $this->commentparser($answer); //commentparser also cleans up $answer - $question->feedback[$key] = $comment; - - $question->answer[$key] = addslashes($answer); - } // end foreach - } // end ount($answers) conditional - - } // end TrueFalse/ShortAnswer QuestionType conditional - - $question->defaultgrade = 1; - $question->image = ""; // No images with this format - return $question; - - } // end tilde conditional - - } // end function readquestion($lines) + break; + + } // end switch ($question->qtype) + + } // end function readquestion($lines) } ?> -