package uk.co.bytemark.vm.enigma.inquisition.questions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MultipleChoiceRenderingHelper {
private final static String[] LETTER_SEQUENCE = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
public static int maximumNumberOfOptions() {
return LETTER_SEQUENCE.length;
}
public static String getOptionLabel(int i) {
return LETTER_SEQUENCE[i];
}
public static String optionsTitle(MultipleChoiceQuestion question, boolean stateNumberOfOptionsNeeded) {
if (question.isSingleOptionMode()) {
return "Choose one option";
} else {
if (stateNumberOfOptionsNeeded) {
int optionsNeeded = question.numberOfCorrectOptions();
return "Choose " + optionsNeeded + " option" + (optionsNeeded == 1 ? "" : "s");
} else {
return "Choose all that apply";
}
}
}
public static String getExplanationText(String questionText, String explanationText, List<Option> orderedOptions) {
Map<String, String> idToLetterMap = makeIdToLetterMap(orderedOptions);
String substitutedExplanationText = AbstractQuestion.substituteExplanationText(questionText, explanationText);
String text = QuestionRenderingHelper.syntaxHighlightForJava(substitutedExplanationText);
return substituteOptionReferences(text, orderedOptions, idToLetterMap);
}
public static String getExplanationText(MultipleChoiceQuestionInstance questionInstance) {
List<Option> orderedOptions = questionInstance.getOrderedOptions();
MultipleChoiceQuestion question = questionInstance.getQuestion();
Map<String, String> idToLetterMap = makeIdToLetterMap(orderedOptions);
String text = question.getSubstitutedExplanationText();
text = QuestionRenderingHelper.syntaxHighlightForJava(text);
return substituteOptionReferences(text, orderedOptions, idToLetterMap);
}
private static String substituteOptionReferences(String explanationText, List<Option> orderedOptions,
Map<String, String> idToLetterMap) {
String resultText = explanationText;
for (String id : idToLetterMap.keySet())
resultText = resultText.replaceAll("@" + id + "@", idToLetterMap.get(id));
resultText = resultText.replaceAll("@allcorrect@", allCorrectString(orderedOptions));
return resultText;
}
private static Map<String, String> makeIdToLetterMap(List<Option> orderedOptions) {
Map<String, String> idToLetterMap = new HashMap<String, String>();
int optionCount = 0;
for (Option option : orderedOptions) {
idToLetterMap.put(Integer.toString(option.getId()), LETTER_SEQUENCE[optionCount]);
optionCount++;
}
return idToLetterMap;
}
/**
* Returns a string containing all the labels of the correct options joined appropriately by commas and "and"
*/
private static String allCorrectString(List<Option> orderedOptions) {
List<String> correctLabels = new ArrayList<String>();
for (int i = 0; i < orderedOptions.size(); i++) {
Option option = orderedOptions.get(i);
if (option.isCorrect()) {
correctLabels.add(getOptionLabel(i));
}
}
int numberOfCorrectLabels = correctLabels.size();
if (numberOfCorrectLabels == 0)
return "";
else if (numberOfCorrectLabels == 1)
return correctLabels.get(0);
else {
String s = "";
for (int j = 0; j < numberOfCorrectLabels - 2; j++)
s += correctLabels.get(j) + ", ";
s += correctLabels.get(numberOfCorrectLabels - 2) + " and ";
s += correctLabels.get(numberOfCorrectLabels - 1);
return s;
}
}
}