UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

100 lines (83 loc) 2.49 kB
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); }