10
10
// Based on format.php, included by ../../import.php
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
17
// ANSWER_ALTERNATIVE regexes
19
define("ANSWER_ALTERNATIVE_FRACTION_REGEX",
21
define("ANSWER_ALTERNATIVE_ANSWER_REGEX",
23
define("ANSWER_ALTERNATIVE_FEEDBACK_REGEX",
25
define("ANSWER_ALTERNATIVE_REGEX",
26
'(' . ANSWER_ALTERNATIVE_FRACTION_REGEX .')?'
27
. '(' . ANSWER_ALTERNATIVE_ANSWER_REGEX . ')'
28
. '(#(' . ANSWER_ALTERNATIVE_FEEDBACK_REGEX .'))?');
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);
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 . ')?$');
43
// Parenthesis positions for NUMERICAL_FORMATED_ALTERNATIVE_ANSWER_REGEX
44
define("NUMERICAL_CORRECT_ANSWER", 1);
45
define("NUMERICAL_ABS_ERROR_MARGIN", 6);
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 . '):');
53
define("ANSWER_REGEX",
55
. '(' . ANSWER_ALTERNATIVE_REGEX
57
. ANSWER_ALTERNATIVE_REGEX
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);
68
function extractMultiAnswerQuestion($text) {
70
$question->qtype= MULTIANSWER;
71
$question->questiontext= $text;
72
$question->answers= array();
73
$question->defaultgrade = 0; // Will be increased for each answer norm
76
; ereg(ANSWER_REGEX, $question->questiontext, $answerregs)
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;
91
error("Cannot identify answertype $answerregs[2]");
95
$multianswer->alternatives= array();
96
$remainingalts = $answerregs[ANSWER_REGEX_ALTERNATIVES];
97
while (ereg(ANSWER_ALTERNATIVE_REGEX, $remainingalts, $altregs)) {
100
if ('=' == $altregs[ANSWER_ALTERNATIVE_REGEX_FRACTION]) {
101
$alternative->fraction = '1';
103
$alternative->fraction = .01 *
104
$altregs[ANSWER_ALTERNATIVE_REGEX_PERCENTILE_FRACTION]
105
or $alternative->fraction = '0';
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],
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];
120
$alternative->min = $numregs[NUMERICAL_CORRECT_ANSWER];
121
$alternative->max = $numregs[NUMERICAL_CORRECT_ANSWER];
123
} else { // Min and max must stay undefined...
124
$alternative->answer =
125
$altregs[ANSWER_ALTERNATIVE_REGEX_ANSWER];
128
$multianswer->alternatives[] = $alternative;
129
$tmp = explode($altregs[0], $remainingalts, 2);
130
$remainingalts = $tmp[1];
133
$question->defaultgrade += $multianswer->norm;
134
$question->answers[] = $multianswer;
135
$question->questiontext = implode("{#$positionkey}",
136
explode($answerregs[0], $question->questiontext, 2));
141
12
class quiz_file_format extends quiz_default_format {
143
14
function readquestions($lines) {