From bd9dd91015c2d831ad2eee25f78da923da1df36c Mon Sep 17 00:00:00 2001 From: moodler Date: Wed, 14 Jan 2004 16:56:39 +0000 Subject: [PATCH] Latest files from Denis --- mod/quiz/format/webct/TODO.txt | 7 ++ mod/quiz/format/webct/format.php | 166 ++++++++++++++++++------------- 2 files changed, 103 insertions(+), 70 deletions(-) create mode 100644 mod/quiz/format/webct/TODO.txt diff --git a/mod/quiz/format/webct/TODO.txt b/mod/quiz/format/webct/TODO.txt new file mode 100644 index 0000000000..c095ac7f5a --- /dev/null +++ b/mod/quiz/format/webct/TODO.txt @@ -0,0 +1,7 @@ +- Ajouter un espace après un symbole <= s'il préfixe une parenthèse ouvrante. +- Gérer 'and', 'or', ... comme &&, || +- Ne pas mettre de '$' sur les @param si aucun nom de variable n'esp spécifié. +- Ajouter OneTrueBrace pour les if, while, for, else ... (Gustavo Carreno , Richard Bateman , Yaroslav Shvetsov , Chris Small ) +- Remove blank lines (Sergio Marchesini ) +- Forcer une ligne vide après une déclaration de fonction (Richard Bateman ) + diff --git a/mod/quiz/format/webct/format.php b/mod/quiz/format/webct/format.php index 165984cd39..96855598b5 100644 --- a/mod/quiz/format/webct/format.php +++ b/mod/quiz/format/webct/format.php @@ -10,7 +10,7 @@ // Part of Moodle - Modular Object-Oriented Dynamic Learning Environment // // http://moodle.com // // // -// Copyright (C) 2003 ASP Consulting http://www.asp-consulting.net // +// Copyright (C) 2004 ASP Consulting http://www.asp-consulting.net // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // @@ -28,6 +28,36 @@ // Based on format.php, included by ../../import.php +function unhtmlentities($string){ + $search = array ("']*?>.*?'si", // remove javascript + "'<[\/\!]*?[^]*?>'si", // remove HTML tags + "'([\r\n])[\s]+'", // remove spaces + "'&(quot|#34);'i", // remove HTML entites + "'&(amp|#38);'i", + "'&(lt|#60);'i", + "'&(gt|#62);'i", + "'&(nbsp|#160);'i", + "'&(iexcl|#161);'i", + "'&(cent|#162);'i", + "'&(pound|#163);'i", + "'&(copy|#169);'i", + "'&#(\d+);'e"); // Evaluate like PHP + $replace = array ("", + "", + "\\1", + "\"", + "&", + "<", + "?>", + " ", + chr(161), + chr(162), + chr(163), + chr(169), + "chr(\\1)"); + return preg_replace ($search, $replace, $string); +} + class quiz_file_format extends quiz_default_format { function readquestions ($lines) { @@ -37,21 +67,21 @@ class quiz_file_format extends quiz_default_format { $warnings = array(); $webct_options = array(); - $ignore_lines = FALSE; + $ignore_rest_of_question = FALSE; - $nLine = 0; + $nLineCounter = 0; $nQuestionStartLine = 0; - $bRawText = TRUE; + $bIsHTMLText = FALSE; $lines[] = ":EOF:"; // for an easiest processing of the last line foreach ($lines as $line) { - $nLine++; + $nLineCounter++; + + // Processing multiples lines strings + if (is_string($questiontext)) { if (ereg("^:",$line)) { - if ($bRawText) { - $questiontext = htmlentities($questiontext); - } - $question->questiontext = trim($questiontext); + $question->questiontext = addslashes(trim($questiontext)); unset($questiontext); } else { @@ -62,13 +92,11 @@ class quiz_file_format extends quiz_default_format { if (is_string($answertext)) { if (ereg("^:",$line)) { - if ($bRawText) { - $answertext = htmlentities($answertext); + if ($bIsHTMLText) { + $answertext = unhtmlentities($answertext); // answer as HTML text not supported by Moddle } - $answertext = trim($answertext); + $answertext = addslashes(trim($answertext)); $question->answer[$currentchoice] = $answertext; - $question->answers[$currentchoice] = $answertext; // for question MULTIANSWER (see lib.php) - $question->subanswers[$currentchoice] = $answertext; unset($answertext); } else { @@ -79,10 +107,10 @@ class quiz_file_format extends quiz_default_format { if (is_string($responstext)) { if (ereg("^:",$line)) { - if ($bRawText) { - $responstext = htmlentities($responstext); + if ($bIsHTMLText) { + $responstext = unhtmlentities($responstext); // answer as HTML text not supported by Moddle } - $question->subquestions[$currentchoice] = trim($responstext); + $question->subquestions[$currentchoice] = addslashes(trim($responstext)); unset($responstext); } else { @@ -93,10 +121,10 @@ class quiz_file_format extends quiz_default_format { if (is_string($feedbacktext)) { if (ereg("^:",$line)) { - if ($bRawText) { - $feedbacktext = htmlentities($feedbacktext); + if ($bIsHTMLText) { + $feedbacktext = unhtmlentities($feedbacktext); // feedback as HTML text not supported by Moddle } - $question->feedback[$currentchoice] = trim($feedbacktext); + $question->feedback[$currentchoice] = addslashes(trim($feedbacktext)); unset($feedbacktext); } else { @@ -109,22 +137,30 @@ class quiz_file_format extends quiz_default_format { if (eregi("^:(TYPE|EOF):",$line)) { // New Question or End of File - if (isset($question)) { // if previous question exists, save it - $QuestionOK = TRUE; - if (strlen($question->name) == 0) { + if (isset($question)) { // if previous question exists, complete, check and save it + + // Setup default value of missing fields + if (!isset($question->name)) { $question->name = $question->questiontext; } if (strlen($question->name) > 255) { $question->name = substr($question->name,0,250)."..."; $warnings[] = get_string("questionnametoolong", "quiz", $nQuestionStartLine); } + if (!isset($question->defaultgrade)) { + $question->defaultgrade = 1; + } + if (!isset($question->image)) { + $question->image = ""; + } + // Perform sanity checks + $QuestionOK = TRUE; if (strlen($question->questiontext) == 0) { $errors[] = get_string("missingquestion", "quiz", $nQuestionStartLine); $QuestionOK = FALSE; } - - if (sizeof($question->answer) <= 1) { + if (sizeof($question->answer) <= 1) { // a question must have at last 2 answers $errors[] = get_string("missinganswer", "quiz", $nQuestionStartLine); $QuestionOK = FALSE; } @@ -150,7 +186,7 @@ class quiz_file_format extends quiz_default_format { case SHORTANSWER: if ($maxfraction != 1) { $maxfraction = $maxfraction * 100; - $errors[] = get_string("wronggrade", "quiz", $nLine).get_string("fractionsnomax", "quiz", $maxfraction); + $errors[] = get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsnomax", "quiz", $maxfraction); $QuestionOK = FALSE; } break; @@ -159,7 +195,7 @@ class quiz_file_format extends quiz_default_format { if ($question->single) { if ($maxfraction != 1) { $maxfraction = $maxfraction * 100; - $errors[] = get_string("wronggrade", "quiz", $nLine).get_string("fractionsnomax", "quiz", $maxfraction); + $errors[] = get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsnomax", "quiz", $maxfraction); $QuestionOK = FALSE; } } @@ -167,7 +203,7 @@ class quiz_file_format extends quiz_default_format { $totalfraction = round($totalfraction,2); if ($totalfraction != 1) { $totalfraction = $totalfraction * 100; - $errors[] = get_string("wronggrade", "quiz", $nLine).get_string("fractionsaddwrong", "quiz", $totalfraction); + $errors[] = get_string("wronggrade", "quiz", $nLineCounter).get_string("fractionsaddwrong", "quiz", $totalfraction); $QuestionOK = FALSE; } } @@ -175,83 +211,73 @@ class quiz_file_format extends quiz_default_format { } if ($QuestionOK) { + // a MULTIANSWER Question record use 'answers' variable instead of 'answer' (see lib.php) + foreach ($question->answer as $key => $dataanswer) { + $question->answers[$key] = $dataanswer; + } + $questions[] = $question; // store it unset($question); // and prepare a new one } } - $nQuestionStartLine = $nLine; + $nQuestionStartLine = $nLineCounter; } + // Processing Question Header + if (eregi("^:TYPE:MC:1(.*)",$line,$webct_options)) { // Multiple Choice Question with only one good answer $question->qtype = MULTICHOICE; - $question->name = ""; - $question->defaultgrade = 1; $question->single = 1; // Only one answer is allowed - $question->image = ""; // No images with this format - $ignore_lines = FALSE; + $ignore_rest_of_question = FALSE; continue; } if (eregi("^:TYPE:MC:N(.*)",$line,$webct_options)) { - // Multiple Choice Question with many good answers + // Multiple Choice Question with several good answers $question->qtype = MULTICHOICE; - $question->name = ""; - $question->defaultgrade = 1; $question->single = 0; // Many answers allowed - $question->image = ""; // No images with this format - $ignore_lines = FALSE; + $ignore_rest_of_question = FALSE; continue; } if (eregi("^:TYPE:S",$line)) { // Short Answer Question $question->qtype = SHORTANSWER; - $question->name = ""; - $question->defaultgrade = 1; $question->usecase = 0; // Ignore case - $question->image = ""; // No images with this format - $ignore_lines = FALSE; + $ignore_rest_of_question = FALSE; continue; } if (eregi("^:TYPE:M",$line)) { // Match Question $question->qtype = MATCH; - $question->name = ""; - $question->defaultgrade = 1; - $question->image = ""; // No images with this format - $ignore_lines = TRUE; // match question processing is not debugged + $ignore_rest_of_question = TRUE; // match question processing is not debugged continue; } if (eregi("^:TYPE:P",$line)) { // Paragraph Question - $warnings[] = get_string("paragraphquestion", "quiz", $nLine); - $ignore_lines = TRUE; // do not process lines until next question + $warnings[] = get_string("paragraphquestion", "quiz", $nLineCounter); + $ignore_rest_of_question = TRUE; // Question Type not handled by Moodle continue; } if (eregi("^:TYPE:C",$line)) { // Calculated Question - $warnings[] = get_string("calculatedquestion", "quiz", $nLine); - $ignore_lines = TRUE; // do not process lines until next question + $warnings[] = get_string("calculatedquestion", "quiz", $nLineCounter); + $ignore_rest_of_question = TRUE; // Question Type not handled by Moodle continue; } if (eregi("^:TYPE:",$line)) { // Unknow Question - $warnings[] = get_string("unknowntype", "quiz", $nLine); - $ignore_lines = TRUE; // do not process lines until next question + $warnings[] = get_string("unknowntype", "quiz", $nLineCounter); + $ignore_rest_of_question = TRUE; // Question Type not handled by Moodle continue; } - if (eregi("^:CAT:",$line)) { - // Category ignored - continue; - } - - if ($ignore_lines) { + if ($ignore_rest_of_question) { continue; } @@ -259,51 +285,50 @@ class quiz_file_format extends quiz_default_format { $name = trim($webct_options[1]); if (strlen($name) > 255) { $name = substr($name,0,250)."..."; - $warnings[] = get_string("questionnametoolong", "quiz", $nLine); + $warnings[] = get_string("questionnametoolong", "quiz", $nLineCounter); } - $question->name = $name; + $question->name = addslashes($name); continue; } if (eregi("^:IMAGE:(.*)",$line,$webct_options)) { $filename = trim($webct_options[1]); - if (file_exists("$CFG->dataroot\\$filename")) { + if (eregi("^http://",$filename)) { $question->image = $filename; } else { - $warnings[] = get_string("imagemissing", "quiz", $nLine); + $warnings[] = get_string("imagemissing", "quiz", $nLineCounter." ($filename)"); } continue; } - $bRawText = !eregi(":H$",$line); // false if next lines are coded in HTML - + $bIsHTMLText = eregi(":H$",$line); // True if next lines are coded in HTML if (eregi("^:QUESTION",$line)) { - $questiontext=""; // Grab next lines + $questiontext=""; // Start gathering next lines continue; } if (eregi("^:ANSWER([0-9]+):([0-9\.]+)",$line,$webct_options)) { - $answertext=""; // Grab next lines + $answertext=""; // Start gathering next lines $currentchoice=$webct_options[1]; - $question->fraction[$currentchoice]=1.0*$webct_options[2]; + $question->fraction[$currentchoice]=($webct_options[2]/100); continue; } if (eregi("^:L([0-9]+)",$line,$webct_options)) { - $answertext=""; // Grab next lines + $answertext=""; // Start gathering next lines $currentchoice=$webct_options[1]; continue; } if (eregi("^:R[0-9]+)",$line,$webct_options)) { - $responstext=""; // Grab next lines + $responstext=""; // Start gathering next lines $currentchoice=$webct_options[1]; continue; } if (eregi("^:REASON([0-9]+):?",$line,$webct_options)) { - $feedbacktext=""; // Grab next lines + $feedbacktext=""; // Start gathering next lines $currentchoice=$webct_options[1]; continue; } @@ -315,6 +340,7 @@ class quiz_file_format extends quiz_default_format { echo "
  • $error
  • "; } echo ""; + unset($questions); // no questions imported } if (sizeof($warnings) > 0) { -- 2.39.5