Skip to content

Commit

Permalink
MigrationMoodle: Fix transform for user question anserw gapselect - r…
Browse files Browse the repository at this point in the history
…efs BT#15992
  • Loading branch information
AngelFQC committed Mar 11, 2020
1 parent d4d6eb1 commit 5da6400
Showing 1 changed file with 101 additions and 23 deletions.
124 changes: 101 additions & 23 deletions plugin/migrationmoodle/src/Transformer/Property/UserQuestionAnswer.php
Expand Up @@ -29,9 +29,9 @@ public function transform(array $data)

switch ($mQType) {
case 'shortanswer':
return $this->shortAnswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark);
return $this->shortanswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark);
case 'gapselect':
return $this->gapSelect($mResponseSummary, $mFraction, $mDefaultMark, $mQuestionSummary);
return $this->gapselect($mRightAnswer, $mResponseSummary, $mDefaultMark, $mQuestionSummary);
default:
return '';
}
Expand All @@ -45,57 +45,135 @@ public function transform(array $data)
*
* @return string
*/
private function shortAnswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark)
private function shortanswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark)
{
$width = LessonAnswersShortAnswerLoader::INPUT_WIDTH;

return "[$mRightAnswer][$mResponseSummary][$mFraction]::$mDefaultMark:$width:0@";
}

/**
* @param string $mRightAnswer
* @param string $mResponseSummary
* @param float $mFraction
* @param float $mDefaultMark
* @param string $mQuestionSummary
*
* @return string
*/
private function gapSelect($mResponseSummary, $mFraction, $mDefaultMark, $mQuestionSummary)
private function gapselect($mRightAnswer, $mResponseSummary, $mDefaultMark, $mQuestionSummary)
{
$mRightAnswer = $this->gapselectGetRightAnswers($mRightAnswer);

$mResponseSummary = $this->gapselectGetResposeSummary($mResponseSummary);

$mQuestionSummary = explode(";", $mQuestionSummary);
$mQuestionSummary = array_map('trim', $mQuestionSummary);

$questionText = array_shift($mQuestionSummary);

$groupsAndOptions = $this->gapselectGetGroupsAndOptions($mQuestionSummary);

$blanks = $this->gapselectGetBlanks($mRightAnswer, $groupsAndOptions);

$count = 0;

foreach ($blanks as $placeholder => $blank) {
$userAnswer = empty($mResponseSummary[$count]) ? '' : $mResponseSummary[$count];
$replacement = $blank."[$userAnswer][0]";

$questionText = str_replace("[[$placeholder]]", $replacement, $questionText);

$count++;
}

$scorePerBlank = $mDefaultMark / count($mRightAnswer);

$optionsScores = array_fill(0, count($mRightAnswer), $scorePerBlank);
$width = array_fill(0, count($mRightAnswer), 300);

return "$questionText::".implode(',', $optionsScores).':'.implode(',', $width).':0@';
}

/**
* @param string $mRightAnswer
*
* @return array
*/
private function gapselectGetRightAnswers($mRightAnswer)
{
$rightAnswers = [];

$mRightAnswer = explode('} {', $mRightAnswer);

foreach ($mRightAnswer as $i0 => $item) {
$rightAnswers[$i0 + 1] = trim($item, "{} \t\n\r\x0B");
}

return $rightAnswers;
}

/**
* @param string $mResponseSummary
*
* @return array
*/
private function gapselectGetResposeSummary($mResponseSummary)
{
$mResponseSummary = explode('} {', $mResponseSummary);
$mResponseSummary = array_map(

return array_map(
function ($item) {
return trim($item, "{} \t\n\r\x0B");
},
$mResponseSummary
);
}

$mQuestionSummary = explode("\n;", $mQuestionSummary);
$mQuestionSummary = array_map('trim', $mQuestionSummary);
/**
* @param array $mQuestionSummary
*
* @return array
*/
private function gapselectGetGroupsAndOptions(array $mQuestionSummary)
{
$groupsAndOptions = [];

foreach ($mQuestionSummary as $groupAndOptions) {
list($group, $options) = explode(' -> ', $groupAndOptions);

list($questionText, $questionOptions) = $mQuestionSummary;
$group = str_replace(['[', ']'], '', $group);
$options = explode(' / ', trim($options, "{} \t\n\r\x0B"));

$questionOptions = explode('; ', $questionOptions);
$groupsAndOptions[$group] = $options;
}

$mDefaultMark = count($mQuestionSummary) > 0 ? $mDefaultMark / count($mQuestionSummary) : 0;
$userScore = count($mQuestionSummary) > 0 ? $mFraction / count($mQuestionSummary) : 0;
return $groupsAndOptions;
}

$width = [];
$score = [];
/**
* @param array $rightAnswers
* @param array $groupsAndOptions
*
* @return array
*/
private function gapselectGetBlanks(array $rightAnswers, array $groupsAndOptions)
{
$blanks = [];

foreach ($questionOptions as $i => $questionOption) {
list($position, $options) = explode(' -> ', $questionOption);
foreach ($rightAnswers as $i => $rightAnswer) {
foreach ($groupsAndOptions as $group => $options) {
if (in_array($rightAnswer, $options)) {
$optionIndex = array_search($rightAnswer, $options);

$options = str_replace(['{', '}', ' / '], ['[', ']', '|'], $options);
$options .= '['.$mResponseSummary[$i].']';
$options .= '['.$userScore.']';
unset($options[$optionIndex]);

$questionText = str_replace($position, $options, $questionText);
$options = array_merge([$rightAnswer], $options);

$width[] = 300;
$score[] = $mDefaultMark;
$blanks[$i] = '['.implode('|', $options).']';
}
}
}

return "$questionText::".implode(',', $score).':'.implode(',', $width).':0@';
return $blanks;
}
}

0 comments on commit 5da6400

Please sign in to comment.