@paroicms/server
Version:
The ParoiCMS server
51 lines • 2.4 kB
JavaScript
import { Tag, } from "liquidjs";
import { isPromise } from "node:util/types";
import { extractRenderingContext } from "../../liquidjs-tools/liquidjs-utils.js";
import { evaluateFunctionCallArgs, parseFunctionCallFromTokenizer, } from "./liquid-function-call-args.js";
import { consumeGenerator, isGeneratorObject, wrapLiquidTagPromise } from "./liquid-tag-helpers.js";
export function createOutLiquidTag() {
const handlers = new Map();
return {
tagClass: class OutTag extends Tag {
#handlerName;
#positionalTokens = [];
#namedEntries = [];
constructor(token, remainTokens, liquid) {
super(token, remainTokens, liquid);
const parsed = parseFunctionCallFromTokenizer(this.tokenizer);
this.#handlerName = parsed.handlerName;
this.#positionalTokens = parsed.positionalTokens;
this.#namedEntries = parsed.namedEntries;
}
*render(ctx, emitter) {
const renderingContext = extractRenderingContext(ctx);
const { logger } = renderingContext.siteContext;
const handler = handlers.get(this.#handlerName);
if (!handler)
throw new Error(`Unknown handler '${this.#handlerName}'`);
const { positionedParameters, namedParameters } = (yield* evaluateFunctionCallArgs(ctx, this.#positionalTokens, this.#namedEntries));
const result = handler(renderingContext, { positionedParameters, namedParameters, ctx });
let val;
try {
if (isGeneratorObject(result)) {
val = consumeGenerator(result);
}
else if (isPromise(result)) {
val = yield wrapLiquidTagPromise(renderingContext, result, `out:${this.#handlerName}`);
}
else {
val = result;
}
emitter.write(String(val));
}
catch (error) {
logger.error(`Error in {% out ${this.#handlerName}(...) %}"`, error);
}
}
},
registerHandler(name, handler) {
handlers.set(name, handler);
},
};
}
//# sourceMappingURL=out-liquid-tag.js.map