course-renderer
Version:
Manages CA School Courses file system storage and HTML conversion
134 lines (133 loc) • 4.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Token_1 = require("../Token");
const rules = require("../rules");
const MARKER_CODE = 0x2F; /* / */
function question(reader, tokens, silent = false, options) {
if (!rules.annotation(reader, true))
return false;
if (silent)
return true;
const parsedAnnotation = rules.annotation(reader, false);
reader.skipEmptyLines();
if (parsedAnnotation.type === 'CR') {
tokenizeCR(reader, tokens, parsedAnnotation, options);
}
else if (parsedAnnotation.type === 'SS' || parsedAnnotation.type === 'MS') {
tokenizeOption(reader, tokens, parsedAnnotation, options);
}
else if (parsedAnnotation.type === 'TI') {
tokenizeTI(reader, tokens, parsedAnnotation, options);
}
return true;
}
exports.question = question;
function tokenizeCR(reader, tokens, parsedAnnotation, options) {
if (rules.fence(reader, tokens, true, options))
throw new Error(`A CR question must not start with a fence markup at line ${reader.currentLine + 1}`);
const label = getLabel(reader, parsedAnnotation, options);
const token = new Token_1.default(parsedAnnotation.type);
token.setContent(label);
token.setAnswer(parsedAnnotation.answer);
token.setId(parsedAnnotation.id);
if (parsedAnnotation.init != null) {
token.setInitialization(parsedAnnotation.init);
}
if (parsedAnnotation.files != null) {
const files = parsedAnnotation.files.split(/,\s*/);
files.forEach((file) => {
token.addFile(file);
});
}
appendToken(tokens, token, options);
reader.nextNonEmptyLines();
rules.fence(reader, tokens, false, options);
// Let us check if there is another fence block after this.
while (true) {
reader.nextNonEmptyLines();
if (rules.fence(reader, tokens, true, options)) {
rules.fence(reader, tokens, false, options);
continue;
}
break;
}
//reader.nextNonEmptyLines()
}
function tokenizeOption(reader, tokens, parsedAnnotation, options) {
if (rules.option(reader, tokens, true, options))
throw new Error(`SS or MS question must not start with an option marker at line ${reader.currentLine + 1}`);
const label = getLabel(reader, parsedAnnotation, options);
const token = new Token_1.default(parsedAnnotation.type);
token.setContent(label);
token.setAnswer(parsedAnnotation.answer);
token.setId(parsedAnnotation.id);
token.setChoiceType(parsedAnnotation.choiceType);
if (parsedAnnotation.init != null) {
token.setInitialization(parsedAnnotation.init);
}
appendToken(tokens, token, options);
reader.nextNonEmptyLines();
while (!reader.isEnd()) {
if (rules.option(reader, tokens, true, options)) {
rules.option(reader, tokens, false, options);
reader.nextNonEmptyLines();
}
else {
break;
}
}
}
function tokenizeTI(reader, tokens, parsedAnnotation, options) {
const label = getLabel(reader, parsedAnnotation, options);
const token = new Token_1.default(parsedAnnotation.type);
token.setContent(label);
token.setAnswer(parsedAnnotation.answer);
token.setId(parsedAnnotation.id);
if (parsedAnnotation.init != null) {
token.setInitialization(parsedAnnotation.init);
}
appendToken(tokens, token, options);
reader.nextNonEmptyLines();
}
function getLabel(reader, parsedAnnotation, options) {
const start = reader.currentLine;
if (parsedAnnotation.type === 'CR') {
while (!reader.isEnd()) {
if (rules.fence(reader, [], true, options)) {
// we need to jump 2 lines up since that is the
reader.currentLine--;
break;
}
reader.nextLine();
}
}
else if (parsedAnnotation.type === 'SS' || parsedAnnotation.type === 'MS') {
while (!reader.isEnd()) {
if (rules.option(reader, [], true, options))
break;
reader.nextLine();
}
}
else if (parsedAnnotation.type === 'TI') {
while (!reader.isEnd()) {
if (reader.isEmpty(reader.currentLine))
break;
reader.nextLine();
}
}
return reader.getLines(start, reader.currentLine);
}
function appendToken(tokens, token, options) {
token.setChapter(options.chapter);
if (options.sectionMode && options.replMode) {
const sectionTokChildren = tokens[tokens.length - 1].children;
const replTok = sectionTokChildren[sectionTokChildren.length - 1];
replTok.addChild(token);
}
else if (options.sectionMode || options.replMode) {
tokens[tokens.length - 1].addChild(token);
}
else {
tokens.push(token);
}
}