// tokenizeQuotes.js
(function () {
/* global adventurejs A */
var p = adventurejs.Parser.prototype;
/**
* Tokenize quoted substrings, as in 'type "foo" on keyboard'.
* @memberOf adventurejs.Parser
* @method adventurejs.Parser#tokenizeQuotes
* @param {String} input
* @returns {String|Boolean}
* @TODO escape $ in input
*/
p.tokenizeQuotes = function Parser_tokenizeQuotes(input) {
this.game.log(
"L1603",
"log",
"high",
`[tokenizeQuotes.js] tokenizeQuotes() receive: ${input}`,
"Parser"
);
const this_turn = this.input_history[0];
const replaceRange = function (str, start, end, replacement) {
this_turn.quote_tokens[replacement] = input.slice(start, end);
return str.slice(0, start) + replacement + str.slice(end);
};
let quoted = false;
let quoted_ranges = [];
let blocks = -1;
let success = true;
for (let i = 0; i < input.length; i++) {
const char = input[i];
if (char === '"') {
quoted = !quoted; // Toggle the flag when encountering quotes
if (quoted) {
blocks++;
quoted_ranges.push([]);
}
quoted_ranges[blocks].push(i);
}
}
// check for unbalanced quotes
for (let block in quoted_ranges) {
let pair = quoted_ranges[block];
if (pair.length !== 2) {
let msg = `There appears to be an unclosed double quote in that input. Please try again. `;
this.game.log(
"L1595",
"warn",
"high",
`[tokenizeQuotes.js] found uneven quotes in ${input}`,
"Parser"
);
this.game.display.printInput(input);
this.game.debug(
`D1632`,
`tokenizeQuotes.js `,
`found uneven quotes in ${input}`
);
this.game.print(msg);
return false;
}
}
for (let i = quoted_ranges.length - 1; i > -1; i--) {
input = replaceRange(
input,
quoted_ranges[i][0],
quoted_ranges[i][1] + 1,
`$${i}`
);
}
this.game.log(
"L1604",
"log",
"high",
`[tokenizeQuotes.js] tokenizeQuotes() return: ${input}`,
"Parser"
);
return input;
};
})();