@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
100 lines (83 loc) • 2.49 kB
JavaScript
import { assert } from "../../assert.js";
import DataType from "./DataType.js";
import ParserError from "./ParserError.js";
import Token from "./Token.js";
import TokenType from "./TokenType.js";
/**
*
* @param {string} text
* @param {number} cursor
* @returns {string}
*/
function readQuote(text, cursor) {
const char = text.charAt(cursor);
if (char !== '"' && char !== '\'') {
throw new ParserError(cursor, "Expected \", found " + char + " instead", text);
}
return char;
}
/**
*
* @param {string} text
* @param {number} cursor
* @param {number} length
* @returns {Token}
*/
export function readStringToken(text, cursor, length) {
assert.isString(text, 'text');
assert.isNonNegativeInteger(cursor, 'cursor');
assert.isNonNegativeInteger(length, 'length');
let i = cursor;
const openingQuote = readQuote(text, i);
i++;
let char;
let value = '';
const lastPossibleChar = length - 1;
for (; i < lastPossibleChar; i++) {
char = text.charAt(i);
if (char === '\\') {
i++;
//read escape sequence
char = text.charAt(i);
switch (char) {
case 'n':
value += '\n';
break;
case 't':
value += '\t';
break;
case 'r':
value += '\r';
break;
case 'b':
value += '\b';
break;
case 'f':
value += '\f';
break;
case 'v':
value += '\v';
break;
case '0':
value += '\0';
break;
case '\\':
case "'":
case '"':
default:
value += char;
break;
}
} else if (char !== openingQuote) {
value += char;
} else {
break;
}
}
char = text.charAt(i);
if (char !== openingQuote) {
throw new ParserError(cursor, "Expected string terminator : " + openingQuote + ", but found '" + char + "' instead", text);
}
i++;
return new Token(value, cursor, i, TokenType.LiteralString, DataType.String);
}