Merge branch 'MDL-37172_23' of git://github.com/jmvedrine/moodle into MOODLE_23_STABLE
authorSam Hemelryk <sam@moodle.com>
Mon, 28 Jan 2013 04:28:54 +0000 (17:28 +1300)
committerSam Hemelryk <sam@moodle.com>
Mon, 28 Jan 2013 04:28:54 +0000 (17:28 +1300)
Conflicts:
question/format/learnwise/format.php

1  2 
lang/en/question.php
question/format/learnwise/format.php

diff --combined lang/en/question.php
@@@ -183,13 -183,13 +183,13 @@@ $string['invalidcategoryidforparent'] 
  $string['invalidcategoryidtomove'] = 'Invalid category id to move!';
  $string['invalidconfirm'] = 'Confirmation string was incorrect';
  $string['invalidcontextinhasanyquestions'] = 'Invalid context passed to question_context_has_any_questions.';
 +$string['invalidgrade'] = 'Grades ({$a}) do not match grade options - question skipped.';
  $string['invalidpenalty'] = 'Invalid penalty';
  $string['invalidwizardpage'] = 'Incorrect or no wizard page specified!';
  $string['lastmodifiedby'] = 'Last modified by';
  $string['linkedfiledoesntexist'] = 'Linked file {$a} doesn\'t exist';
  $string['makechildof'] = 'Make child of \'{$a}\'';
  $string['maketoplevelitem'] = 'Move to top level';
 -$string['matcherror'] = 'Grades do not match grade options - question skipped';
  $string['matchgrades'] = 'Match grades';
  $string['matchgradeserror'] = 'Error if grade not listed';
  $string['matchgradesnearest'] = 'Nearest grade if not listed';
@@@ -306,8 -306,6 +306,8 @@@ $string['cannotloadquestion'] = 'Could 
  $string['cannotpreview'] = 'You can\'t preview these questions!';
  $string['category'] = 'Category';
  $string['changeoptions'] = 'Change options';
 +$string['attemptoptions'] = 'Attempt options';
 +$string['displayoptions'] = 'Display options';
  $string['check'] = 'Check';
  $string['clearwrongparts'] = 'Clear incorrect responses';
  $string['closepreview'] = 'Close preview';
@@@ -386,7 -384,6 +386,7 @@@ $string['requiresgrading'] = 'Requires 
  $string['responsehistory'] = 'Response history';
  $string['restart'] = 'Start again';
  $string['restartwiththeseoptions'] = 'Start again with these options';
 +$string['updatedisplayoptions'] = 'Update display options';
  $string['rightanswer'] = 'Right answer';
  $string['rightanswer_help'] = 'an automatically generated summary of the correct response. This can be limited, so you may wish to consider explaining the correct solution in the general feedback for the question, and turning this option off.';
  $string['saved'] = 'Saved: {$a}';
@@@ -416,6 -413,7 +416,7 @@@ $string['technicalinfoquestionsummary'
  $string['technicalinforightsummary'] = 'Right answer summary: {$a}';
  $string['technicalinfostate'] = 'Question state: {$a}';
  $string['unknownbehaviour'] = 'Unknown behaviour: {$a}.';
+ $string['unknownorunhandledtype'] = 'Unknown or unhandled question type: {$a}';
  $string['unknownquestion'] = 'Unknown question: {$a}.';
  $string['unknownquestioncatregory'] = 'Unknown question category: {$a}.';
  $string['unknownquestiontype'] = 'Unknown question type: {$a}.';
@@@ -42,14 -42,10 +42,14 @@@ defined('MOODLE_INTERNAL') || die()
   */
  class qformat_learnwise extends qformat_default {
  
 -    function provide_import() {
 +    public function provide_import() {
          return true;
      }
  
 +    public function export_file_extension() {
 +        return '.xml';
 +    }
 +
      protected function readquestions($lines) {
          $questions = array();
          $currentquestion = array();
          return $questions;
      }
  
 -    function readquestion($lines) {
 +    protected function readquestion($lines) {
+         global $OUTPUT;
          $text = implode(' ', $lines);
 -        $text = str_replace(array('\t','\n','\r','\''), array('','','','\\\''), $text);
 +        $text = str_replace(array('\t','\n','\r'), array('','',''), $text);
  
          $startpos = strpos($text, '<question type');
          $endpos = strpos($text, '</question>');
@@@ -79,8 -77,8 +81,8 @@@
          preg_match("/<question type=[\"\']([^\"\']+)[\"\']>/i", $text, $matches);
          $type = strtolower($matches[1]); // multichoice or multianswerchoice
  
 -        $questiontext = $this->unhtmlentities($this->stringbetween($text, '<text>', '</text>'));
 -        $questionhint = $this->unhtmlentities($this->stringbetween($text, '<hint>', '</hint>'));
 +        $questiontext = textlib::entities_to_utf8($this->stringbetween($text, '<text>', '</text>'));
 +        $questionhint = textlib::entities_to_utf8($this->stringbetween($text, '<hint>', '</hint>'));
          $questionaward = $this->stringbetween($text, '<award>', '</award>');
          $optionlist = $this->stringbetween($text, '<answer>', '</answer>');
  
  
          if ($type == 'multichoice') {
              foreach ($optionlist as $option) {
 +                if (trim($option) === '') {
 +                    continue;
 +                }
                  $correct = $this->stringbetween($option, ' correct="', '">');
                  $answer = $this->stringbetween($option, '">', '</option>');
                  $optionscorrect[$n] = $correct;
 -                $optionstext[$n] = $this->unhtmlentities($answer);
 +                $optionstext[$n] = textlib::entities_to_utf8($answer);
                  ++$n;
              }
          } else if ($type == 'multianswerchoice') {
              $optionsaward = array();
  
              foreach ($optionlist as $option) {
 +                if (trim($option) === '') {
 +                    continue;
 +                }
                  preg_match("/correct=\"([^\"]*)\"/i", $option, $correctmatch);
                  preg_match("/award=\"([^\"]*)\"/i", $option, $awardmatch);
  
                  $answer = $this->stringbetween($option, '">', '</option>');
  
                  $optionscorrect[$n] = $correct;
 -                $optionstext[$n] = $this->unhtmlentities($answer);
 +                $optionstext[$n] = textlib::entities_to_utf8($answer);
                  $optionsaward[$n] = $award;
                  ++$n;
              }
  
          } else {
-             echo "<p>I don't understand this question type (type = <strong>$type</strong>).</p>\n";
+             echo $OUTPUT->notification(get_string('unknownorunhandledtype', 'question', $type));
          }
  
          $question = $this->defaultquestion();
          $question->qtype = MULTICHOICE;
          $question->name = $this->create_default_question_name($questiontext, get_string('questionname', 'question'));
 +        $this->add_blank_combined_feedback($question);
  
          $question->questiontext = $questiontext;
 +        $question->questiontextformat = FORMAT_HTML;
          $question->single = ($type == 'multichoice') ? 1 : 0;
 -        $question->feedback[] = '';
  
          $question->fraction = array();
          $question->answer = array();
          for ($n = 0; $n < count($optionstext); ++$n) {
              if ($optionstext[$n]) {
 -                if (!isset($numcorrect)) { // single answer
 +                if (!isset($numcorrect)) {
 +                    // Single answer.
                      if ($optionscorrect[$n] == 'yes') {
                          $fraction = (int) $questionaward;
                      } else {
                          $fraction = 0;
                      }
 -                } else { // mulitple answers
 +                } else {
 +                    // Multiple answers.
                      if ($optionscorrect[$n] == 'yes') {
                          $fraction = $optionsaward[$n] / $totalaward;
                      } else {
                      }
                  }
                  $question->fraction[] = $fraction;
 -                $question->answer[] = $optionstext[$n];
 -                $question->feedback[] = ''; // no feedback in this type
 +                $question->answer[] = array('text' => $optionstext[$n], 'format' => FORMAT_HTML);
 +                $question->feedback[] = array('text' => '', 'format' => FORMAT_HTML); // No feedback in this type.
              }
          }
  
          return $question;
      }
  
 -    function stringbetween($text, $start, $end) {
 +    /**
 +     * Extract the substring of $text between $start and $end.
 +     * @param string $text text to analyse.
 +     * @param string $start opening delimiter.
 +     * @param string $end closing delimiter.
 +     * @return string the requested substring.
 +     */
 +    protected function stringbetween($text, $start, $end) {
          $startpos = strpos($text, $start) + strlen($start);
          $endpos = strpos($text, $end);
  
              return substr($text, $startpos, $endpos - $startpos);
          }
      }
 -
 -    function unhtmlentities($string) {
 -        $transtable = get_html_translation_table(HTML_ENTITIES);
 -        $transtable = array_flip($transtable);
 -        return strtr($string, $transtable);
 -    }
 -
  }
 -
 -