UNPKG

@marko/prettyprint

Version:

Prettyprint Marko template files in the syntax of your choice

100 lines (91 loc) 1.74 kB
"use strict"; const TOKENS = {}; TOKENS["{"] = { tokens: TOKENS, end: "}" }; TOKENS["["] = { tokens: TOKENS, end: "]" }; TOKENS["("] = { tokens: TOKENS, end: ")" }; TOKENS["/"] = { noMatchPrevious: /[\]})A-Z0-9.]\s*$/i, tokens: { "[": { tokens: {}, skipEscaped: true, end: "]" } }, skipEscaped: true, end: "/" }; TOKENS['"'] = { tokens: {}, skipEscaped: true, end: '"' }; TOKENS["'"] = { tokens: {}, skipEscaped: true, end: "'" }; TOKENS["`"] = { tokens: { $: { fullToken: "${", tokens: TOKENS, end: "}" } }, skipEscaped: true, end: "`" }; function getUnenclosedAsString(string) { let stack = []; let current = { tokens: TOKENS }; let unenclosed = ""; for (let index = 0; index < string.length; index++) { const char = string[index]; let next; if (current.skipEscaped && char === "\\") { index++; continue; } if (next = current.tokens[char]) { if (next.fullToken) { if (string.slice(index, index + next.fullToken.length) === next.fullToken) { stack.push(current); current = next; index += next.fullToken.length - 1; continue; } } else if (next.noMatchPrevious) { if (!next.noMatchPrevious.test(string.slice(0, index))) { stack.push(current); current = next; continue; } } else { stack.push(current); current = next; continue; } } if (current.end === char) { current = stack.pop(); continue; } if (stack.length === 0) { unenclosed += char; } } return unenclosed; } module.exports = getUnenclosedAsString;