📄 format.php
字号:
$name = "unknown"; } return $name; } /** * generates <text></text> tags, processing raw text therein * @param int ilev the current indent level * @param boolean short stick it on one line * @return string formatted text */ function writetext( $raw, $ilev=0, $short=true) { $indent = str_repeat( " ",$ilev ); // if required add CDATA tags if (!empty($raw) and (htmlspecialchars($raw)!=$raw)) { $raw = "<![CDATA[$raw]]>"; } if ($short) { $xml = "$indent<text>$raw</text>\n"; } else { $xml = "$indent<text>\n$raw\n$indent</text>\n"; } return $xml; } function xmltidy( $content ) { // can only do this if tidy is installed if (extension_loaded('tidy')) { $config = array( 'input-xml'=>true, 'output-xml'=>true, 'indent'=>true, 'wrap'=>0 ); $tidy = new tidy; $tidy->parseString($content, $config, 'utf8'); $tidy->cleanRepair(); return $tidy->value; } else { return $content; } } function presave_process( $content ) { // override method to allow us to add xml headers and footers // add the xml headers and footers $content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" . "<quiz>\n" . $content . "\n" . "</quiz>"; // make the xml look nice $content = $this->xmltidy( $content ); return $content; } /** * Include an image encoded in base 64 * @param string imagepath The location of the image file * @return string xml code segment */ function writeimage( $imagepath ) { global $CFG; if (empty($imagepath)) { return ''; } $courseid = $this->course->id; if (!$binary = file_get_contents( "{$CFG->dataroot}/$courseid/$imagepath" )) { return ''; } $content = " <image_base64>\n".addslashes(base64_encode( $binary ))."\n". "\n </image_base64>\n"; return $content; } /** * Turns question into an xml segment * @param array question question array * @return string xml segment */ function writequestion( $question ) { global $CFG,$QTYPES; // initial string; $expout = ""; // add comment $expout .= "\n\n<!-- question: $question->id -->\n"; // check question type if (!$question_type = $this->get_qtype( $question->qtype )) { // must be a plugin then, so just accept the name supplied $question_type = $question->qtype; } // add opening tag // generates specific header for Cloze and category type question if ($question->qtype == 'category') { $categorypath = $this->writetext( $question->category ); $expout .= " <question type=\"category\">\n"; $expout .= " <category>\n"; $expout .= " $categorypath\n"; $expout .= " </category>\n"; $expout .= " </question>\n"; return $expout; } elseif ($question->qtype != MULTIANSWER) { // for all question types except Close $name_text = $this->writetext( $question->name ); $qtformat = $this->get_format($question->questiontextformat); $question_text = $this->writetext( $question->questiontext ); $generalfeedback = $this->writetext( $question->generalfeedback ); $expout .= " <question type=\"$question_type\">\n"; $expout .= " <name>$name_text</name>\n"; $expout .= " <questiontext format=\"$qtformat\">\n"; $expout .= $question_text; $expout .= " </questiontext>\n"; $expout .= " <image>{$question->image}</image>\n"; $expout .= $this->writeimage($question->image); $expout .= " <generalfeedback>\n"; $expout .= $generalfeedback; $expout .= " </generalfeedback>\n"; $expout .= " <defaultgrade>{$question->defaultgrade}</defaultgrade>\n"; $expout .= " <penalty>{$question->penalty}</penalty>\n"; $expout .= " <hidden>{$question->hidden}</hidden>\n"; } else { // for Cloze type only $name_text = $this->writetext( $question->name ); $question_text = $this->writetext( $question->questiontext ); $generalfeedback = $this->writetext( $question->generalfeedback ); $expout .= " <question type=\"$question_type\">\n"; $expout .= " <name>$name_text</name>\n"; $expout .= " <questiontext>\n"; $expout .= $question_text; $expout .= " </questiontext>\n"; $expout .= " <generalfeedback>\n"; $expout .= $generalfeedback; $expout .= " </generalfeedback>\n"; } if (!empty($question->options->shuffleanswers)) { $expout .= " <shuffleanswers>{$question->options->shuffleanswers}</shuffleanswers>\n"; } else { $expout .= " <shuffleanswers>0</shuffleanswers>\n"; } // output depends on question type switch($question->qtype) { case 'category': // not a qtype really - dummy used for category switching break; case TRUEFALSE: foreach ($question->options->answers as $answer) { $fraction_pc = round( $answer->fraction * 100 ); if ($answer->id == $question->options->trueanswer) { $answertext = 'true'; } else { $answertext = 'false'; } $expout .= " <answer fraction=\"$fraction_pc\">\n"; $expout .= $this->writetext($answertext, 3) . "\n"; $expout .= " <feedback>\n"; $expout .= $this->writetext( $answer->feedback,4,false ); $expout .= " </feedback>\n"; $expout .= " </answer>\n"; } break; case MULTICHOICE: $expout .= " <single>".$this->get_single($question->options->single)."</single>\n"; $expout .= " <shuffleanswers>".$this->get_single($question->options->shuffleanswers)."</shuffleanswers>\n"; $expout .= " <correctfeedback>".$this->writetext($question->options->correctfeedback, 3)."</correctfeedback>\n"; $expout .= " <partiallycorrectfeedback>".$this->writetext($question->options->partiallycorrectfeedback, 3)."</partiallycorrectfeedback>\n"; $expout .= " <incorrectfeedback>".$this->writetext($question->options->incorrectfeedback, 3)."</incorrectfeedback>\n"; $expout .= " <answernumbering>{$question->options->answernumbering}</answernumbering>\n"; foreach($question->options->answers as $answer) { $percent = $answer->fraction * 100; $expout .= " <answer fraction=\"$percent\">\n"; $expout .= $this->writetext( $answer->answer,4,false ); $expout .= " <feedback>\n"; $expout .= $this->writetext( $answer->feedback,5,false ); $expout .= " </feedback>\n"; $expout .= " </answer>\n"; } break; case SHORTANSWER: $expout .= " <usecase>{$question->options->usecase}</usecase>\n "; foreach($question->options->answers as $answer) { $percent = 100 * $answer->fraction; $expout .= " <answer fraction=\"$percent\">\n"; $expout .= $this->writetext( $answer->answer,3,false ); $expout .= " <feedback>\n"; $expout .= $this->writetext( $answer->feedback,4,false ); $expout .= " </feedback>\n"; $expout .= " </answer>\n"; } break; case NUMERICAL: foreach ($question->options->answers as $answer) { $tolerance = $answer->tolerance; $percent = 100 * $answer->fraction; $expout .= "<answer fraction=\"$percent\">\n"; // <text> tags are an added feature, old filed won't have them $expout .= " <text>{$answer->answer}</text>\n"; $expout .= " <tolerance>$tolerance</tolerance>\n"; $expout .= " <feedback>".$this->writetext( $answer->feedback )."</feedback>\n"; // fraction tag is deprecated // $expout .= " <fraction>{$answer->fraction}</fraction>\n"; $expout .= "</answer>\n"; } $units = $question->options->units; if (count($units)) { $expout .= "<units>\n"; foreach ($units as $unit) { $expout .= " <unit>\n"; $expout .= " <multiplier>{$unit->multiplier}</multiplier>\n"; $expout .= " <unit_name>{$unit->unit}</unit_name>\n"; $expout .= " </unit>\n"; } $expout .= "</units>\n"; } break; case MATCH: foreach($question->options->subquestions as $subquestion) { $expout .= "<subquestion>\n"; $expout .= $this->writetext( $subquestion->questiontext ); $expout .= "<answer>".$this->writetext( $subquestion->answertext )."</answer>\n"; $expout .= "</subquestion>\n"; } break; case DESCRIPTION: // nothing more to do for this type break; case MULTIANSWER: $a_count=1; foreach($question->options->questions as $question) { $thispattern = addslashes("{#".$a_count."}"); $thisreplace = $question->questiontext; $expout=ereg_replace($thispattern, $thisreplace, $expout ); $a_count++; } break; case ESSAY: if (!empty($question->options->answers)) { foreach ($question->options->answers as $answer) { $percent = 100 * $answer->fraction; $expout .= "<answer fraction=\"$percent\">\n"; $expout .= " <feedback>".$this->writetext( $answer->feedback )."</feedback>\n"; // fraction tag is deprecated // $expout .= " <fraction>{$answer->fraction}</fraction>\n"; $expout .= "</answer>\n"; } } break; case CALCULATED: foreach ($question->options->answers as $answer) { $tolerance = $answer->tolerance; $tolerancetype = $answer->tolerancetype; $correctanswerlength= $answer->correctanswerlength ; $correctanswerformat= $answer->correctanswerformat; $percent = 100 * $answer->fraction; $expout .= "<answer fraction=\"$percent\">\n"; // "<text/>" tags are an added feature, old files won't have them $expout .= " <text>{$answer->answer}</text>\n"; $expout .= " <tolerance>$tolerance</tolerance>\n"; $expout .= " <tolerancetype>$tolerancetype</tolerancetype>\n"; $expout .= " <correctanswerformat>$correctanswerformat</correctanswerformat>\n"; $expout .= " <correctanswerlength>$correctanswerformat</correctanswerlength>\n"; $expout .= " <feedback>".$this->writetext( $answer->feedback )."</feedback>\n"; $expout .= "</answer>\n"; } $units = $question->options->units; if (count($units)) { $expout .= "<units>\n"; foreach ($units as $unit) { $expout .= " <unit>\n"; $expout .= " <multiplier>{$unit->multiplier}</multiplier>\n"; $expout .= " <unit_name>{$unit->unit}</unit_name>\n"; $expout .= " </unit>\n"; } $expout .= "</units>\n"; } //echo "<pre> question calc";print_r($question);echo "</pre>"; //First, we a new function to get all the data itmes in the database // $question_datasetdefs =$QTYPES['calculated']->get_datasets_for_export ($question); // echo "<pre> question defs";print_r($question_datasetdefs);echo "</pre>"; //If there are question_datasets if( isset($question->options->datasets)&&count($question->options->datasets)){// there should be $expout .= "<dataset_definitions>\n"; foreach ($question->options->datasets as $def) { $expout .= "<dataset_definition>\n"; $expout .= " <status>".$this->writetext($def->status)."</status>\n"; $expout .= " <name>".$this->writetext($def->name)."</name>\n"; $expout .= " <type>calculated</type>\n"; $expout .= " <distribution>".$this->writetext($def->distribution)."</distribution>\n"; $expout .= " <minimum>".$this->writetext($def->minimum)."</minimum>\n"; $expout .= " <maximum>".$this->writetext($def->maximum)."</maximum>\n"; $expout .= " <decimals>".$this->writetext($def->decimals)."</decimals>\n"; $expout .= " <itemcount>$def->itemcount</itemcount>\n"; if ($def->itemcount > 0 ) { $expout .= " <dataset_items>\n"; foreach ($def->items as $item ){ $expout .= " <dataset_item>\n"; $expout .= " <number>".$item->itemnumber."</number>\n"; $expout .= " <value>".$item->value."</value>\n"; $expout .= " </dataset_item>\n"; } $expout .= " </dataset_items>\n"; $expout .= " <number_of_items>".$def-> number_of_items."</number_of_items>\n"; } $expout .= "</dataset_definition>\n"; } $expout .= "</dataset_definitions>\n"; } break; default: // try support by optional plugin if (!$data = $this->try_exporting_using_qtypes( $question->qtype, $question )) { notify( get_string( 'unsupportedexport','qformat_xml',$QTYPES[$question->qtype]->menu_name() ) ); } $expout .= $data; } // close the question tag $expout .= "</question>\n"; return $expout; }}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -