@paroicms/server
Version:
The ParoiCMS server
88 lines • 3.43 kB
JavaScript
import { evalToken } from "liquidjs";
export function parseFunctionCallFromTokenizer(tokenizer) {
tokenizer.skipBlank();
const handlerId = tokenizer.readIdentifier();
tokenizer.assert(handlerId?.content, "Expected handler name");
const handlerName = handlerId?.content ? handlerId.content : undefined;
if (!handlerName)
throw new Error("Expected handler name");
tokenizer.skipBlank();
if (tokenizer.peek() !== "(") {
const pos = tokenizer.p;
tokenizer.skipBlank();
if (!tokenizer.end()) {
tokenizer.p = pos;
tokenizer.assert(false, "Syntax error, expected '('");
}
return { handlerName, positionalTokens: [], namedEntries: [] };
}
tokenizer.advance();
const positionalTokens = [];
const namedEntries = [];
tokenizer.skipBlank();
if (tokenizer.peek() === ")") {
tokenizer.advance();
return { handlerName, positionalTokens, namedEntries };
}
let namedStarted = false;
while (true) {
tokenizer.skipBlank();
const ch = tokenizer.peek();
if (ch === ")")
break;
if (!namedStarted) {
const begin = tokenizer.p;
const value = tokenizer.readValue();
tokenizer.assert(value, "Expected parameter value");
tokenizer.skipBlank();
if (tokenizer.peek() === ":") {
namedStarted = true;
tokenizer.p = begin;
}
else {
positionalTokens.push(value);
tokenizer.skipBlank();
if (tokenizer.peek() === ",") {
tokenizer.advance();
continue;
}
tokenizer.assert(tokenizer.peek() === ")", "Syntax error, expected ')'");
continue;
}
}
tokenizer.skipBlank();
const keyId = tokenizer.readIdentifier();
tokenizer.assert(keyId?.content, "Expected parameter name before ':'");
const key = keyId?.content ? keyId.content : undefined;
if (!key)
throw new Error("Expected parameter name before ':'");
tokenizer.skipBlank();
tokenizer.assert(tokenizer.peek() === ":", "Expected ':' after parameter name");
tokenizer.advance();
tokenizer.skipBlank();
const namedValue = tokenizer.readValue();
tokenizer.assert(namedValue, "Expected value after ':' in named parameter");
namedEntries.push({ key, value: namedValue });
tokenizer.skipBlank();
if (tokenizer.peek() === ",") {
tokenizer.advance();
continue;
}
tokenizer.assert(tokenizer.peek() === ")", "Syntax error, expected ')'");
}
tokenizer.assert(tokenizer.peek() === ")", "Syntax error, expected ')'");
tokenizer.advance();
return { handlerName, positionalTokens, namedEntries };
}
export function* evaluateFunctionCallArgs(ctx, positionalTokens, namedEntries) {
const positionedParameters = [];
for (const tok of positionalTokens) {
positionedParameters.push(yield evalToken(tok, ctx));
}
const namedParameters = {};
for (const { key, value } of namedEntries) {
namedParameters[key] = yield evalToken(value, ctx);
}
return { positionedParameters, namedParameters };
}
//# sourceMappingURL=liquid-function-call-args.js.map