silverbullet/common/space_lua/stdlib/template.ts

39 lines
1.0 KiB
TypeScript
Raw Normal View History

2025-01-15 03:26:47 +08:00
import {
type ILuaFunction,
jsToLuaValue,
2025-01-15 03:26:47 +08:00
LuaBuiltinFunction,
LuaTable,
} from "$common/space_lua/runtime.ts";
import { interpolateLuaString } from "$common/space_lua/stdlib/space_lua.ts";
2025-01-15 03:26:47 +08:00
export const templateApi = new LuaTable({
each: new LuaBuiltinFunction(
async (sf, tbl: LuaTable | any[], fn: ILuaFunction): Promise<string> => {
const result = [];
if (tbl instanceof LuaTable) {
tbl = tbl.toJSArray();
}
for (const item of tbl) {
result.push(await fn.call(sf, item));
}
return result.join("");
},
),
new: new LuaBuiltinFunction(
(_sf, template: string): ILuaFunction => {
const lines = template.split("\n").map((line) =>
line.replace(/^\s{4}/, "")
);
const processed = lines.join("\n");
return new LuaBuiltinFunction(
async (sf, env: LuaTable | any) => {
if (!(env instanceof LuaTable)) {
env = jsToLuaValue(env);
}
return await interpolateLuaString(sf, processed, env);
},
);
},
),
2025-01-15 03:26:47 +08:00
});