UNPKG

falcor-path-syntax

Version:
83 lines (65 loc) 2.24 kB
var TokenTypes = require('./../TokenTypes'); var E = require('./../exceptions'); var quoteE = E.quote; /** * quote is all the parse tree in between quotes. This includes the only * escaping logic. * * parse-tree: * <opening-quote>(.|(<escape><opening-quote>))*<opening-quote> */ module.exports = function quote(tokenizer, openingToken, state, out) { var token = tokenizer.next(); var innerToken = ''; var openingQuote = openingToken.token; var escaping = false; var done = false; while (!token.done) { switch (token.type) { case TokenTypes.token: case TokenTypes.space: case TokenTypes.dotSeparator: case TokenTypes.commaSeparator: case TokenTypes.openingBracket: case TokenTypes.closingBracket: case TokenTypes.openingBrace: case TokenTypes.closingBrace: if (escaping) { E.throwError(quoteE.illegalEscape, tokenizer); } innerToken += token.token; break; case TokenTypes.quote: // the simple case. We are escaping if (escaping) { innerToken += token.token; escaping = false; } // its not a quote that is the opening quote else if (token.token !== openingQuote) { innerToken += token.token; } // last thing left. Its a quote that is the opening quote // therefore we must produce the inner token of the indexer. else { done = true; } break; case TokenTypes.escape: escaping = true; break; default: E.throwError(E.unexpectedToken, tokenizer); } // If done, leave loop if (done) { break; } // Keep cycling through the tokenizer. token = tokenizer.next(); } if (innerToken.length === 0) { E.throwError(quoteE.empty, tokenizer); } state.indexer[state.indexer.length] = innerToken; };