From: thepurpleblob Date: Thu, 27 Jan 2005 11:22:45 +0000 (+0000) Subject: Addition code to handle 'multianswerchoice' type Learnwise questions. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=2d4aa134d5d8e9c25f7a10797915013d0e0a8ac5;p=moodle.git Addition code to handle 'multianswerchoice' type Learnwise questions. --- diff --git a/mod/quiz/format/learnwise/format.php b/mod/quiz/format/learnwise/format.php index ce0fcc0816..363f69e9e2 100755 --- a/mod/quiz/format/learnwise/format.php +++ b/mod/quiz/format/learnwise/format.php @@ -1,109 +1,144 @@ -readquestion($currentquestion)) { - $questions[] = $question; - $currentquestion = array(); - } - } - - return $questions; - } - - function unhtmlentities($string) - // puts all the > etc stuff back to 'normal' - // good for PHP 4.1.0 on - { - $trans_tbl = get_html_translation_table(HTML_ENTITIES); - $trans_tbl = array_flip($trans_tbl); - return strtr($string, $trans_tbl); - } + if ($question = $this->readquestion($currentquestion)) { + $questions[] = $question; + $currentquestion = array(); + } + } + return $questions; + } function readquestion($lines) { - $text = ''; - foreach ($lines as $line) $text .= $line; - $text = str_replace(array('\t','\n','\r','\''), array('','','','\\\''), $text); - $len = strlen($text); - - $question = NULL; - - if($questiontype = sscanf($text, '')) - { - if($pos = stripos($text, '')) - { - $text = substr($text, 0, $pos); - $text = stristr($text, '', ''); - $questionaward = string_between($text, '', ''); - $questionhint = string_between($text, '', ''); - $optionlist = string_between($text, '', ''); - - $optionlist = explode(''); - $b = string_between($option, '">', ''); - - $options_correct[$n] = $a; $options_text[$n] = $b; - //echo "$a, $b
"; - $n++; - - } - - $question->qtype = MULTICHOICE; - $question->name = substr($this->unhtmlentities($questiontext),0,30); - if(strlen($questionlen)<30) $question->name .= '...'; - $question->questiontext = $this->unhtmlentities($questiontext); - $question->single = 1; - $question->feedback[] = ''; - $question->usecase = 0; - $question->defaultgrade = 1; - $question->image = ''; - - for($n=0; $nfraction[] = $fraction; - $question->answer[] = $this->unhtmlentities($options_text[$n]); - //echo "hello: $options_text[$n], $fraction
"; - } - } - } - } - + $text = implode(' ', $lines); + $text = str_replace(array('\t','\n','\r','\''), array('','','','\\\''), $text); + + $startpos = strpos($text, ''); + if ($startpos === false || $endpos === false) { + return false; + } + + preg_match("//i", $text, $matches); + $type = strtolower($matches[1]); // multichoice or multianswerchoice + + $questiontext = $this->unhtmlentities($this->stringbetween($text, '', '')); + $questionhint = $this->unhtmlentities($this->stringbetween($text, '', '')); + $questionaward = $this->stringbetween($text, '', ''); + $optionlist = $this->stringbetween($text, '', ''); + + $optionlist = explode('stringbetween($option, ' correct="', '">'); + $answer = $this->stringbetween($option, '">', ''); + $optionscorrect[$n] = $correct; + $optionstext[$n] = $this->unhtmlentities($answer); + ++$n; + } + } else if ($type == 'multianswerchoice') { + $numcorrect = 0; + $totalaward = 0; + + $optionsaward = array(); + + foreach ($optionlist as $option) { + preg_match("/correct=\"([^\"]*)\"/i", $option, $correctmatch); + preg_match("/award=\"([^\"]*)\"/i", $option, $awardmatch); + + $correct = $correctmatch[1]; + $award = $awardmatch[1]; + if ($correct == 'yes') { + $totalaward += $award; + ++$numcorrect; + } + + $answer = $this->stringbetween($option, '">', ''); + + $optionscorrect[$n] = $correct; + $optionstext[$n] = $this->unhtmlentities($answer); + $optionsaward[$n] = $award; + ++$n; + } + + } else { + echo "

I don't understand this question type (type = $type).

\n"; + } + + $question->qtype = MULTICHOICE; + $question->name = substr($questiontext, 0, 30); + if (strlen($questiontext) > 30) { + $question->name .= '...'; + } + + $question->questiontext = $questiontext; + $question->single = ($type == 'multichoice') ? 1 : 0; + $question->feedback[] = ''; + $question->usecase = 0; + $question->defaultgrade = 1; + $question->image = ''; + + $question->fraction = array(); + $question->answer = array(); + for ($n = 0; $n < count($optionstext); ++$n) { + if ($optionstext[$n]) { + if (!isset($numcorrect)) { // single answer + if ($optionscorrect[$n] == 'yes') { + $fraction = (int) $questionaward; + } else { + $fraction = 0; + } + } else { // mulitple answers + if ($optionscorrect[$n] == 'yes') { + $fraction = $optionsaward[$n] / $totalaward; + } else { + $fraction = -$optionsaward[$n] / count($optionstext); + } + } + $question->fraction[] = $fraction; + $question->answer[] = $optionstext[$n]; + } + } + return $question; } + + function stringbetween($text, $start, $end) { + $startpos = strpos($text, $start) + strlen($start); + $endpos = strpos($text, $end); + + if ($startpos <= $endpos) { + return substr($text, $startpos, $endpos - $startpos); + } + } + + function unhtmlentities($string) { + $transtable = get_html_translation_table(HTML_ENTITIES); + $transtable = array_flip($transtable); + return strtr($string, $transtable); + } + } ?>