modaq
Version:
Quiz Bowl Reader using TypeScript, React, and MobX
125 lines • 5.64 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadPacket = void 0;
const he = __importStar(require("he"));
const AppState_1 = require("../state/AppState");
require("../state/IPacket");
const PacketState_1 = require("../state/PacketState");
require("../state/UIState");
const minExpectedQuestionLength = 100;
function loadPacket(parsedPacket, existingPacketName) {
const appState = AppState_1.AppState.instance;
const uiState = appState.uiState;
if (parsedPacket.tossups == undefined) {
uiState.setPacketStatus({
isError: true,
status: "Error loading packet: Packet doesn't have a tossups field.",
});
return;
}
const tossups = parsedPacket.tossups.map((tossup) => new PacketState_1.Tossup(he.decode(tossup.question), he.decode(tossup.answer), tossup.metadata ? he.decode(tossup.metadata) : tossup.metadata));
const bonuses = [];
if (parsedPacket.bonuses) {
for (let i = 0; i < parsedPacket.bonuses.length; i++) {
const bonus = parsedPacket.bonuses[i];
if (bonus.answers.length !== bonus.parts.length || bonus.answers.length !== bonus.values.length) {
const errorMessage = `Error loading packet: Unequal number of parts, answers, and values for bonus ${i + 1}. Answers #: ${bonus.answers.length}, Parts #: ${bonus.parts.length}, Values #: ${bonus.values.length}`;
uiState.setPacketStatus({
isError: true,
status: errorMessage,
});
return;
}
const parts = [];
for (let i = 0; i < bonus.answers.length; i++) {
parts.push({
answer: he.decode(bonus.answers[i]),
question: he.decode(bonus.parts[i]),
value: bonus.values[i],
difficultyModifier: bonus.difficultyModifiers ? bonus.difficultyModifiers[i] : undefined,
});
}
bonuses.push(new PacketState_1.Bonus(he.decode(bonus.leadin), parts, bonus.metadata ? he.decode(bonus.metadata) : bonus.metadata));
}
}
const packet = new PacketState_1.PacketState();
packet.setTossups(tossups);
packet.setBonuses(bonuses);
const packetName = uiState.packetFilename != undefined ? `"${uiState.packetFilename}"` : "";
uiState.setPacketStatus({
isError: false,
status: `Packet ${packetName} loaded. ${tossups.length} tossup(s), ${bonuses.length} bonus(es).`,
}, findWarnings(packet));
// If we have an existing packet, don't overwrite the name
if (existingPacketName) {
packet.setName(existingPacketName);
}
else if (uiState.packetFilename) {
packet.setName(uiState.packetFilename);
}
return packet;
}
exports.loadPacket = loadPacket;
function findWarnings(packet) {
var _a, _b;
const warnings = [];
// Unexpected number of bonus parts
const maxPartsCount = new Map();
for (const bonus of packet.bonuses) {
const partsCount = bonus.parts.length;
maxPartsCount.set(partsCount, 1 + ((_a = maxPartsCount.get(partsCount)) !== null && _a !== void 0 ? _a : 0));
}
if (maxPartsCount.size > 1) {
let maxCountCount = 0;
let maxCountCandidate = 3;
for (const candidate of maxPartsCount.keys()) {
const candidateCount = (_b = maxPartsCount.get(candidate)) !== null && _b !== void 0 ? _b : 0;
if (candidateCount > maxCountCount) {
maxCountCount = candidateCount;
maxCountCandidate = candidate;
}
}
const badBonusNumbers = [];
for (let i = 0; i < packet.bonuses.length; i++) {
const bonus = packet.bonuses[i];
if (bonus.parts.length != maxCountCandidate) {
badBonusNumbers.push(i + 1);
}
}
if (badBonusNumbers.length > 0) {
warnings.push(`Bonuses that aren't ${maxCountCandidate} parts long found at bonus(es) ${badBonusNumbers.join(", ")}.`);
}
}
// Unexpectedly short question
const shortQuestionNumbers = [];
for (let i = 0; i < packet.tossups.length; i++) {
const tossup = packet.tossups[i];
if (tossup.question.length < minExpectedQuestionLength) {
shortQuestionNumbers.push(i + 1);
}
}
if (shortQuestionNumbers.length > 0) {
warnings.push(`Suspiciously short questions found at tossup(s) ${shortQuestionNumbers.join(", ")}.`);
}
return warnings;
}
//# sourceMappingURL=PacketLoaderController.js.map