Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| /** | |
| * @file Jinja templating engine | |
| * | |
| * A minimalistic JavaScript reimplementation of the [Jinja](https://github.com/pallets/jinja) templating engine, | |
| * to support the chat templates. Special thanks to [Tyler Laceby](https://github.com/tlaceby) for his amazing | |
| * ["Guide to Interpreters"](https://github.com/tlaceby/guide-to-interpreters-series) tutorial series, | |
| * which provided the basis for this implementation. | |
| * | |
| * See the [Transformers documentation](https://huggingface.co/docs/transformers/main/en/chat_templating) for more information. | |
| * | |
| * @module index | |
| */ | |
| import { tokenize } from "./lexer"; | |
| import { parse } from "./parser"; | |
| import { Environment, Interpreter } from "./runtime"; | |
| import type { Program } from "./ast"; | |
| import type { StringValue } from "./runtime"; | |
| import { range } from "./utils"; | |
| export class Template { | |
| parsed: Program; | |
| /** | |
| * @param {string} template The template string | |
| */ | |
| constructor(template: string) { | |
| const tokens = tokenize(template, { | |
| lstrip_blocks: true, | |
| trim_blocks: true, | |
| }); | |
| this.parsed = parse(tokens); | |
| } | |
| render(items: Record<string, unknown>): string { | |
| // Create a new environment for this template | |
| const env = new Environment(); | |
| // Declare global variables | |
| env.set("false", false); | |
| env.set("true", true); | |
| env.set("raise_exception", (args: string) => { | |
| throw new Error(args); | |
| }); | |
| env.set("range", range); | |
| // Add user-defined variables | |
| for (const [key, value] of Object.entries(items)) { | |
| env.set(key, value); | |
| } | |
| const interpreter = new Interpreter(env); | |
| const result = interpreter.run(this.parsed) as StringValue; | |
| return result.value; | |
| } | |
| } | |
| export { Environment, Interpreter, tokenize, parse }; | |