Make user input interpretation more forgiving

This commit is contained in:
Florine W. Dekker 2020-01-25 17:18:50 +01:00
parent 12986425ef
commit 6d44e7a1d5
Signed by: FWDekker
GPG Key ID: B1B567AF58D6EE0F
1 changed files with 54 additions and 6 deletions

View File

@ -94,6 +94,24 @@
return Math.floor(Math.random() * (max - min + 1) + min);
}
/**
* Given an expected value and an actual value, interprets the actual value as a weekday and returns `null` if they
* are equal; returns an empty string if they are not equal; and returns an error message otherwise.
*
* @param expected the weekday that `actual` should be equal to
* @param actual the weekday to compare to `expected`
*/
function compareWeekdays(expected, actual) {
switch (DoomsdayDate.expandDayString(actual)) {
case expected:
return null;
case undefined:
return "Unrecognized day of week";
default:
return "";
}
}
/**
* An input that can be validated.
@ -228,10 +246,10 @@
/**
* Returns the first year of this `DoomsdayDate`'s century.
* Returns the number of this `DoomsdayDate`'s century.
*/
getCentury() {
return Math.floor(this.date.getFullYear() / 100) * 100;
return Math.floor(this.date.getFullYear() / 100);
}
/**
@ -284,6 +302,33 @@
}
};
/**
* Returns the day of the week corresponding to the given string.
*
* This is a convenience method for interpreting (incomplete) user inputs.
*
* @param dayString the day of the week to expand
*/
static expandDayString(dayString) {
dayString = dayString.toLowerCase();
if (dayString.startsWith("m"))
return "Monday";
else if (dayString.startsWith("tu"))
return "Tuesday";
else if (dayString.startsWith("w"))
return "Wednesday";
else if (dayString.startsWith("th"))
return "Thursday";
else if (dayString.startsWith("f"))
return "Friday";
else if (dayString.startsWith("sa"))
return "Saturday";
else if (dayString.startsWith("su"))
return "Sunday";
else
return undefined;
}
/**
* Returns a random date in the range `0001-01-01` (inclusive) to `9999-12-31` (inclusive), wrapped inside a
* `DoomsdayDate` object.
@ -302,10 +347,11 @@
const centuryInput = new class extends ValidatableInput {
validate(value) {
return value === quizDate.getCenturyAnchorString() ? null : "";
return compareWeekdays(quizDate.getCenturyAnchorString(), value);
}
onValidInput() {
this.input.value = DoomsdayDate.expandDayString(this.input.value);
yearInput.selectInput();
}
@ -314,15 +360,16 @@
}
updateTitle() {
this.titleLabel.innerText = `Anchor day of century starting in ${quizDate.getCentury()}?`;
this.titleLabel.innerText = `Anchor day of century starting in ${quizDate.getCentury() * 100}?`;
}
}($("#century-input"), $("#century-title-label"), $("#century-error-label"));
const yearInput = new class extends ValidatableInput {
validate(value) {
return value === quizDate.getYearAnchorString() ? null : "";
return compareWeekdays(quizDate.getYearAnchorString(), value);
}
onValidInput() {
this.input.value = DoomsdayDate.expandDayString(this.input.value);
dayInput.selectInput();
}
@ -336,10 +383,11 @@
}($("#year-input"), $("#year-title-label"), $("#year-error-label"));
const dayInput = new class extends ValidatableInput {
validate(value) {
return value === quizDate.getWeekdayString() ? null : "";
return compareWeekdays(quizDate.getWeekdayString(), value);
}
onValidInput() {
this.input.value = DoomsdayDate.expandDayString(this.input.value);
reloadQuiz();
}