UNPKG

jora

Version:

JavaScript object query engine

81 lines (72 loc) 1.79 kB
export function suggest(node, ctx) { for (const [idx, v] of Object.entries(node.values)) { if (v === null) { ctx.queryRoot(node.values[Number(idx) - 1].range[1]); } } } export function compile(node, ctx) { for (const [k, v] of Object.entries(node.values)) { const idx = Number(k); if (v === null) { continue; } if (idx !== 0) { ctx.put('+'); } if (idx % 2 === 0) { ctx.put('"' + encodeString(v.value, compileEscape) + '"'); } else { ctx.put('('); ctx.node(v); ctx.put(')'); } } } export function walk(node, ctx) { for (const v of node.values) { if (v !== null) { ctx.node(v); } } } export function stringify(node, ctx) { const lastIdx = node.values.length - 1; for (const [k, v] of Object.entries(node.values)) { const idx = Number(k); if (idx % 2 === 0) { ctx.put(idx === 0 ? '`' : '}'); ctx.put(encodeString(v.value, stringifyEscape)); ctx.put(idx === lastIdx ? '`' : '${'); } else if (v !== null) { ctx.node(v); } } } const compileEscape = new Map([ ['\b', '\\b'], ['\n', '\\n'], ['\r', '\\r'], ['\f', '\\f'], ['\t', '\\t'], ['\v', '\\v'], ['\u2028', '\\u2028'], ['\u2029', '\\u2029'], ['\\', '\\\\'], ['"', '\\"'] ]); const stringifyEscape = new Map([ ['\b', '\\b'], ['\f', '\\f'], ['\t', '\\t'], ['\v', '\\v'], ['\\', '\\\\'], ['$', '\\$'] ]); function encodeString(s, map) { let result = ''; for (let i = 0; i < s.length; i++) { result += map.get(s[i]) || s[i]; } return result; }