~ubuntu-branches/ubuntu/hoary/moodle/hoary

« back to all changes in this revision

Viewing changes to mod/quiz/format/multianswer/format.php

  • Committer: Bazaar Package Importer
  • Author(s): Isaac Clerencia
  • Date: 2004-12-29 00:49:52 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20041229004952-gliyqzpj2w3e7clx
Tags: 1.4.3-1
* Urgency high as upstream release fixes several security bugs
* New upstream release
* Write database creation errors and warn the user about it, 
closes: #285842, #285842

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?PHP  // $Id: format.php,v 1.2 2004/03/08 13:09:42 moodler Exp $ 
 
1
<?PHP  // $Id: format.php,v 1.3 2004/07/21 13:01:05 moodler Exp $ 
2
2
 
3
3
////////////////////////////////////////////////////////////////////////////
4
4
/// MULTIANSWER FORMAT
9
9
 
10
10
// Based on format.php, included by ../../import.php
11
11
 
12
 
    // REGULAR EXPRESSION CONSTANTS
13
 
    // I do not know any way to make this easier
14
 
    // Regexes are always awkard when defined but more comprehensible
15
 
    // when used as constants in the executive code
16
 
 
17
 
// ANSWER_ALTERNATIVE regexes
18
 
 
19
 
define("ANSWER_ALTERNATIVE_FRACTION_REGEX",
20
 
       '=|%(-?[0-9]+)%');
21
 
define("ANSWER_ALTERNATIVE_ANSWER_REGEX",
22
 
        '[^~#}]+');
23
 
define("ANSWER_ALTERNATIVE_FEEDBACK_REGEX",
24
 
        '[^~}]*');
25
 
define("ANSWER_ALTERNATIVE_REGEX",
26
 
       '(' . ANSWER_ALTERNATIVE_FRACTION_REGEX .')?'
27
 
       . '(' . ANSWER_ALTERNATIVE_ANSWER_REGEX . ')'
28
 
       . '(#(' . ANSWER_ALTERNATIVE_FEEDBACK_REGEX .'))?');
29
 
 
30
 
// Parenthesis positions for ANSWER_ALTERNATIVE_REGEX
31
 
define("ANSWER_ALTERNATIVE_REGEX_PERCENTILE_FRACTION", 2);
32
 
define("ANSWER_ALTERNATIVE_REGEX_FRACTION", 1);
33
 
define("ANSWER_ALTERNATIVE_REGEX_ANSWER", 3);
34
 
define("ANSWER_ALTERNATIVE_REGEX_FEEDBACK", 5);
35
 
 
36
 
// NUMBER_FORMATED_ALTERNATIVE_ANSWER_REGEX is used
37
 
// for identifying numerical answers in ANSWER_ALTERNATIVE_REGEX_ANSWER
38
 
define("NUMBER_REGEX",
39
 
        '-?(([0-9]+[.,]?[0-9]*|[.,][0-9]+)([eE][-+]?[0-9]+)?)');
40
 
define("NUMERICAL_ALTERNATIVE_REGEX",
41
 
        '^(' . NUMBER_REGEX . ')(:' . NUMBER_REGEX . ')?$');
42
 
 
43
 
// Parenthesis positions for NUMERICAL_FORMATED_ALTERNATIVE_ANSWER_REGEX
44
 
define("NUMERICAL_CORRECT_ANSWER", 1);
45
 
define("NUMERICAL_ABS_ERROR_MARGIN", 6);
46
 
 
47
 
// Remaining ANSWER regexes
48
 
define("ANSWER_TYPE_DEF_REGEX",
49
 
       '(NUMERICAL|NM)|(MULTICHOICE|MC)|(SHORTANSWER|SA|MW)');
50
 
define("ANSWER_START_REGEX",
51
 
       '\{([0-9]*):(' . ANSWER_TYPE_DEF_REGEX . '):');
52
 
 
53
 
define("ANSWER_REGEX",
54
 
        ANSWER_START_REGEX
55
 
        . '(' . ANSWER_ALTERNATIVE_REGEX
56
 
        . '(~'
57
 
        . ANSWER_ALTERNATIVE_REGEX
58
 
        . ')*)}' );
59
 
 
60
 
// Parenthesis positions for singulars in ANSWER_REGEX
61
 
define("ANSWER_REGEX_NORM", 1);
62
 
define("ANSWER_REGEX_ANSWER_TYPE_NUMERICAL", 3);
63
 
define("ANSWER_REGEX_ANSWER_TYPE_MULTICHOICE", 4);
64
 
define("ANSWER_REGEX_ANSWER_TYPE_SHORTANSWER", 5);
65
 
define("ANSWER_REGEX_ALTERNATIVES", 6);
66
 
 
67
 
 
68
 
function extractMultiAnswerQuestion($text) {
69
 
    $question = NULL;
70
 
    $question->qtype= MULTIANSWER;
71
 
    $question->questiontext= $text;
72
 
    $question->answers= array();
73
 
    $question->defaultgrade = 0; // Will be increased for each answer norm
74
 
 
75
 
    for ($positionkey=1
76
 
        ; ereg(ANSWER_REGEX, $question->questiontext, $answerregs)
77
 
        ; ++$positionkey )
78
 
    {
79
 
        unset($multianswer);
80
 
 
81
 
        $multianswer->positionkey = $positionkey;
82
 
        $multianswer->norm = $answerregs[ANSWER_REGEX_NORM]
83
 
            or $multianswer->norm = '1';
84
 
        if ($answerregs[ANSWER_REGEX_ANSWER_TYPE_NUMERICAL]) {
85
 
            $multianswer->answertype = NUMERICAL;
86
 
        } else if($answerregs[ANSWER_REGEX_ANSWER_TYPE_SHORTANSWER]) {
87
 
            $multianswer->answertype = SHORTANSWER;
88
 
        } else if($answerregs[ANSWER_REGEX_ANSWER_TYPE_MULTICHOICE]){
89
 
            $multianswer->answertype = MULTICHOICE;
90
 
        } else {
91
 
            error("Cannot identify answertype $answerregs[2]");
92
 
            return false;
93
 
        }
94
 
 
95
 
        $multianswer->alternatives= array();
96
 
        $remainingalts = $answerregs[ANSWER_REGEX_ALTERNATIVES];
97
 
        while (ereg(ANSWER_ALTERNATIVE_REGEX, $remainingalts, $altregs)) {
98
 
            unset($alternative);
99
 
            
100
 
            if ('=' == $altregs[ANSWER_ALTERNATIVE_REGEX_FRACTION]) {
101
 
                $alternative->fraction = '1';
102
 
            } else {
103
 
                $alternative->fraction = .01 *
104
 
                        $altregs[ANSWER_ALTERNATIVE_REGEX_PERCENTILE_FRACTION]
105
 
                    or $alternative->fraction = '0';
106
 
            }
107
 
            $alternative->feedback = $altregs[ANSWER_ALTERNATIVE_REGEX_FEEDBACK];
108
 
            if ($answerregs[ANSWER_REGEX_ANSWER_TYPE_NUMERICAL]
109
 
                    && ereg(NUMERICAL_ALTERNATIVE_REGEX,
110
 
                            $altregs[ANSWER_ALTERNATIVE_REGEX_ANSWER],
111
 
                            $numregs) )
112
 
            {
113
 
                $alternative->answer = $numregs[NUMERICAL_CORRECT_ANSWER];
114
 
                if ($numregs[NUMERICAL_ABS_ERROR_MARGIN]) {
115
 
                    $alternative->min = $numregs[NUMERICAL_CORRECT_ANSWER]
116
 
                                      - $numregs[NUMERICAL_ABS_ERROR_MARGIN];
117
 
                    $alternative->max = $numregs[NUMERICAL_CORRECT_ANSWER]
118
 
                                      + $numregs[NUMERICAL_ABS_ERROR_MARGIN];
119
 
                } else {
120
 
                    $alternative->min = $numregs[NUMERICAL_CORRECT_ANSWER];
121
 
                    $alternative->max = $numregs[NUMERICAL_CORRECT_ANSWER];
122
 
                }
123
 
            } else { // Min and max must stay undefined...
124
 
                $alternative->answer =
125
 
                        $altregs[ANSWER_ALTERNATIVE_REGEX_ANSWER];
126
 
            }
127
 
            
128
 
            $multianswer->alternatives[] = $alternative;
129
 
            $tmp = explode($altregs[0], $remainingalts, 2);
130
 
            $remainingalts = $tmp[1];
131
 
        }
132
 
 
133
 
        $question->defaultgrade += $multianswer->norm;
134
 
        $question->answers[] = $multianswer;
135
 
        $question->questiontext = implode("{#$positionkey}",
136
 
                    explode($answerregs[0], $question->questiontext, 2));
137
 
    }
138
 
    return $question;
139
 
}
140
 
 
141
12
class quiz_file_format extends quiz_default_format {
142
13
 
143
14
    function readquestions($lines) {
147
18
    /// multianswer import
148
19
 
149
20
        $questions= array();
150
 
        $thequestion= extractMultiAnswerQuestion(addslashes(implode('',$lines)));
 
21
        $thequestion= quiz_qtype_multianswer_extract_question
 
22
                            (addslashes(implode('',$lines)));
 
23
        $thequestion->qtype = MULTIANSWER;
151
24
 
152
25
        if (!empty($thequestion)) {
153
26
            $thequestion->name = $lines[0];