@dogsbay/minja 0.2.0-beta.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +603 -0
- package/bin/minja.js +1062 -0
- package/dist/browser.d.ts +11 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +10 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +97 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +47 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +112 -0
- package/dist/context.js.map +1 -0
- package/dist/evaluator.d.ts +20 -0
- package/dist/evaluator.d.ts.map +1 -0
- package/dist/evaluator.js +207 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +1026 -0
- package/dist/index.umd.js.map +7 -0
- package/dist/index.umd.min.js +9 -0
- package/dist/index.umd.min.js.map +7 -0
- package/dist/loader-fetch.d.ts +8 -0
- package/dist/loader-fetch.d.ts.map +1 -0
- package/dist/loader-fetch.js +15 -0
- package/dist/loader-fetch.js.map +1 -0
- package/dist/loader-memory.d.ts +11 -0
- package/dist/loader-memory.d.ts.map +1 -0
- package/dist/loader-memory.js +36 -0
- package/dist/loader-memory.js.map +1 -0
- package/dist/loader.d.ts +54 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +91 -0
- package/dist/loader.js.map +1 -0
- package/dist/parser.d.ts +12 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +501 -0
- package/dist/parser.js.map +1 -0
- package/dist/renderer.d.ts +13 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +415 -0
- package/dist/renderer.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
package/dist/loader.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File loaders for {% include %} statements
|
|
3
|
+
* Pluggable interface supporting different environments
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Fetch-based loader for browsers and service workers
|
|
7
|
+
* Uses the Fetch API to load files
|
|
8
|
+
*/
|
|
9
|
+
export class FetchLoader {
|
|
10
|
+
/**
|
|
11
|
+
* Load a file using fetch
|
|
12
|
+
* @param path - Path to load (relative or absolute URL)
|
|
13
|
+
* @param basePath - Base URL to resolve relative paths
|
|
14
|
+
* @returns File contents
|
|
15
|
+
*/
|
|
16
|
+
async load(path, basePath) {
|
|
17
|
+
const url = basePath ? new URL(path, basePath).href : path;
|
|
18
|
+
// Add cache busting parameter
|
|
19
|
+
const fetchUrl = `${url}?preventCache=${Date.now()}`;
|
|
20
|
+
const response = await fetch(fetchUrl);
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
return await response.text();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Filesystem loader for Node.js
|
|
29
|
+
* Uses fs.readFile to load files
|
|
30
|
+
*/
|
|
31
|
+
export class FileSystemLoader {
|
|
32
|
+
/**
|
|
33
|
+
* Create a filesystem loader
|
|
34
|
+
* @param basePath - Base directory for resolving relative paths
|
|
35
|
+
*/
|
|
36
|
+
constructor(basePath = process.cwd()) {
|
|
37
|
+
this.basePath = basePath;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Load a file from the filesystem
|
|
41
|
+
* @param path - Path to load (relative or absolute)
|
|
42
|
+
* @param basePath - Base path to resolve relative paths (overrides constructor basePath)
|
|
43
|
+
* @returns File contents
|
|
44
|
+
*/
|
|
45
|
+
async load(path, basePath) {
|
|
46
|
+
// Dynamic import to avoid bundling fs in browser builds
|
|
47
|
+
const fs = await import('fs/promises');
|
|
48
|
+
const pathModule = await import('path');
|
|
49
|
+
const resolvedBasePath = basePath || this.basePath;
|
|
50
|
+
const resolvedPath = pathModule.isAbsolute(path)
|
|
51
|
+
? path
|
|
52
|
+
: pathModule.resolve(resolvedBasePath, path);
|
|
53
|
+
try {
|
|
54
|
+
return await fs.readFile(resolvedPath, 'utf-8');
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
throw new Error(`Failed to load ${resolvedPath}: ${message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Memory-based loader for testing
|
|
64
|
+
* Stores files in a Map
|
|
65
|
+
*/
|
|
66
|
+
export class MemoryLoader {
|
|
67
|
+
constructor(files = {}) {
|
|
68
|
+
this.files = new Map(Object.entries(files));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Add a file to the memory loader
|
|
72
|
+
*/
|
|
73
|
+
addFile(path, content) {
|
|
74
|
+
this.files.set(path, content);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load a file from memory
|
|
78
|
+
*/
|
|
79
|
+
async load(path, basePath) {
|
|
80
|
+
// Simple path resolution for memory loader
|
|
81
|
+
const resolvedPath = basePath && !path.startsWith('/')
|
|
82
|
+
? `${basePath}/${path}`.replace(/\/+/g, '/')
|
|
83
|
+
: path;
|
|
84
|
+
const content = this.files.get(resolvedPath);
|
|
85
|
+
if (content === undefined) {
|
|
86
|
+
throw new Error(`File not found: ${resolvedPath}`);
|
|
87
|
+
}
|
|
88
|
+
return content;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template parser
|
|
3
|
+
* Converts template strings into AST (Abstract Syntax Tree)
|
|
4
|
+
*/
|
|
5
|
+
import type { ParseResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a template string into an AST
|
|
8
|
+
* @param template - Template string to parse
|
|
9
|
+
* @returns Parse result with AST and errors
|
|
10
|
+
*/
|
|
11
|
+
export declare function parse(template: string): ParseResult;
|
|
12
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAW,WAAW,EAAc,MAAM,YAAY,CAAA;AAGlE;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CA0hBnD"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template parser
|
|
3
|
+
* Converts template strings into AST (Abstract Syntax Tree)
|
|
4
|
+
*/
|
|
5
|
+
import { parseExpression } from './evaluator.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a template string into an AST
|
|
8
|
+
* @param template - Template string to parse
|
|
9
|
+
* @returns Parse result with AST and errors
|
|
10
|
+
*/
|
|
11
|
+
export function parse(template) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
const ast = [];
|
|
14
|
+
let position = 0;
|
|
15
|
+
let line = 1;
|
|
16
|
+
let column = 1;
|
|
17
|
+
/**
|
|
18
|
+
* Create a parse error
|
|
19
|
+
*/
|
|
20
|
+
function createError(message) {
|
|
21
|
+
return { message, position, line, column };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Advance position tracking
|
|
25
|
+
*/
|
|
26
|
+
function advance(count) {
|
|
27
|
+
for (let i = 0; i < count; i++) {
|
|
28
|
+
if (template[position + i] === '\n') {
|
|
29
|
+
line++;
|
|
30
|
+
column = 1;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
column++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
position += count;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Find the next occurrence of a string
|
|
40
|
+
*/
|
|
41
|
+
function findNext(str, from = position) {
|
|
42
|
+
return template.indexOf(str, from);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract text between current position and a target position
|
|
46
|
+
*/
|
|
47
|
+
function extractTo(target) {
|
|
48
|
+
const text = template.substring(position, target);
|
|
49
|
+
advance(target - position);
|
|
50
|
+
return text;
|
|
51
|
+
}
|
|
52
|
+
while (position < template.length) {
|
|
53
|
+
// Look for template tags
|
|
54
|
+
const varStart = findNext('{{', position);
|
|
55
|
+
const tagStart = findNext('{%', position);
|
|
56
|
+
const commentStart = findNext('{#', position);
|
|
57
|
+
// Find the nearest tag
|
|
58
|
+
const candidates = [
|
|
59
|
+
{ pos: varStart, type: 'var' },
|
|
60
|
+
{ pos: tagStart, type: 'tag' },
|
|
61
|
+
{ pos: commentStart, type: 'comment' },
|
|
62
|
+
].filter((c) => c.pos !== -1);
|
|
63
|
+
if (candidates.length === 0) {
|
|
64
|
+
// No more tags, rest is text
|
|
65
|
+
const text = template.substring(position);
|
|
66
|
+
if (text) {
|
|
67
|
+
ast.push({ type: 'text', value: text });
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
// Sort to find nearest
|
|
72
|
+
candidates.sort((a, b) => a.pos - b.pos);
|
|
73
|
+
const nearest = candidates[0];
|
|
74
|
+
// Add text before tag
|
|
75
|
+
if (nearest.pos > position) {
|
|
76
|
+
ast.push({ type: 'text', value: extractTo(nearest.pos) });
|
|
77
|
+
}
|
|
78
|
+
// Parse the tag
|
|
79
|
+
if (nearest.type === 'var') {
|
|
80
|
+
// Variable: {{ name }}
|
|
81
|
+
advance(2); // Skip {{
|
|
82
|
+
const endPos = findNext('}}', position);
|
|
83
|
+
if (endPos === -1) {
|
|
84
|
+
errors.push(createError('Unclosed variable tag'));
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
const varName = extractTo(endPos).trim();
|
|
88
|
+
advance(2); // Skip }}
|
|
89
|
+
ast.push({ type: 'variable', name: varName });
|
|
90
|
+
}
|
|
91
|
+
else if (nearest.type === 'comment') {
|
|
92
|
+
// Comment: {# ... #}
|
|
93
|
+
// Auto-strip newlines for comments (they produce no output)
|
|
94
|
+
// Only strip if the comment is on its own line
|
|
95
|
+
if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
|
|
96
|
+
const lastNode = ast[ast.length - 1];
|
|
97
|
+
// Only strip if previous text ends with newline (comment is on its own line)
|
|
98
|
+
if (/\n[ \t]*$/.test(lastNode.value)) {
|
|
99
|
+
lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t]*$/, '');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
advance(2); // Skip {#
|
|
103
|
+
const endPos = findNext('#}', position);
|
|
104
|
+
if (endPos === -1) {
|
|
105
|
+
errors.push(createError('Unclosed comment tag'));
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
const commentText = extractTo(endPos);
|
|
109
|
+
advance(2); // Skip #}
|
|
110
|
+
ast.push({ type: 'comment', value: commentText });
|
|
111
|
+
// Auto-strip following newline if comment is on its own line
|
|
112
|
+
if (position < template.length && template[position] === '\n') {
|
|
113
|
+
advance(1);
|
|
114
|
+
// Also skip any indentation on the next line
|
|
115
|
+
while (position < template.length && /[ \t]/.test(template[position])) {
|
|
116
|
+
advance(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (nearest.type === 'tag') {
|
|
121
|
+
// Statement tag: {% ... %}
|
|
122
|
+
advance(2); // Skip {%
|
|
123
|
+
const endPos = findNext('%}', position);
|
|
124
|
+
if (endPos === -1) {
|
|
125
|
+
errors.push(createError('Unclosed statement tag'));
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
let statement = extractTo(endPos).trim();
|
|
129
|
+
// Check for whitespace control characters
|
|
130
|
+
const hasLeftStrip = statement.startsWith('-');
|
|
131
|
+
const hasRightStrip = statement.endsWith('-');
|
|
132
|
+
// Strip whitespace control characters from statement
|
|
133
|
+
if (hasLeftStrip) {
|
|
134
|
+
statement = statement.substring(1).trim();
|
|
135
|
+
// Strip trailing whitespace from previous text node
|
|
136
|
+
if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
|
|
137
|
+
const lastNode = ast[ast.length - 1];
|
|
138
|
+
lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t\n]*$/, '');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (hasRightStrip) {
|
|
142
|
+
statement = statement.substring(0, statement.length - 1).trim();
|
|
143
|
+
}
|
|
144
|
+
advance(2); // Skip %}
|
|
145
|
+
// If right strip, consume following whitespace
|
|
146
|
+
if (hasRightStrip) {
|
|
147
|
+
while (position < template.length && /[ \t\n]/.test(template[position])) {
|
|
148
|
+
advance(1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Parse different statement types
|
|
152
|
+
if (statement.startsWith('set ')) {
|
|
153
|
+
// {% set var = value %}
|
|
154
|
+
const setMatch = /^set\s+(\w+)\s*=\s*(.+)$/.exec(statement);
|
|
155
|
+
if (setMatch) {
|
|
156
|
+
try {
|
|
157
|
+
const expr = parseExpression(setMatch[2]);
|
|
158
|
+
ast.push({
|
|
159
|
+
type: 'set',
|
|
160
|
+
name: setMatch[1],
|
|
161
|
+
value: expr,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
errors.push(createError(`Invalid set expression: ${error.message}`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
errors.push(createError('Invalid set syntax'));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (statement.startsWith('if ')) {
|
|
173
|
+
// {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}
|
|
174
|
+
const condition = statement.substring(3).trim();
|
|
175
|
+
try {
|
|
176
|
+
const expr = parseExpression(condition);
|
|
177
|
+
// Find the body and elif/else/endif blocks
|
|
178
|
+
const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock();
|
|
179
|
+
errors.push(...parseErrors);
|
|
180
|
+
ast.push({
|
|
181
|
+
type: 'if',
|
|
182
|
+
condition: expr,
|
|
183
|
+
trueBranch,
|
|
184
|
+
elifBranches: elifBranches.length > 0 ? elifBranches : undefined,
|
|
185
|
+
elseBranch: elseBranch.length > 0 ? elseBranch : undefined,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
errors.push(createError(`Invalid if expression: ${error.message}`));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (statement.startsWith('include ')) {
|
|
193
|
+
// {% include "path" %}
|
|
194
|
+
const includeMatch = /^include\s+["']([^"']+)["']/.exec(statement);
|
|
195
|
+
if (includeMatch) {
|
|
196
|
+
ast.push({
|
|
197
|
+
type: 'include',
|
|
198
|
+
path: includeMatch[1],
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
errors.push(createError('Invalid include syntax'));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (statement.startsWith('switch ')) {
|
|
206
|
+
// {% switch variable %} ... {% case "value" %} ... {% endswitch %}
|
|
207
|
+
const switchExpr = statement.substring(7).trim();
|
|
208
|
+
try {
|
|
209
|
+
const expr = parseExpression(switchExpr);
|
|
210
|
+
const { cases, parseErrors } = parseSwitchBlock();
|
|
211
|
+
errors.push(...parseErrors);
|
|
212
|
+
ast.push({
|
|
213
|
+
type: 'switch',
|
|
214
|
+
expression: expr,
|
|
215
|
+
cases,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
errors.push(createError(`Invalid switch expression: ${error.message}`));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (statement.startsWith('leveloffset ')) {
|
|
223
|
+
// {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}
|
|
224
|
+
const offsetMatch = /^leveloffset\s+([-+]?\d+)$/.exec(statement);
|
|
225
|
+
if (!offsetMatch) {
|
|
226
|
+
errors.push(createError('Invalid leveloffset syntax'));
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const offsetStr = offsetMatch[1];
|
|
230
|
+
const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-');
|
|
231
|
+
const offset = parseInt(offsetStr, 10);
|
|
232
|
+
if (isNaN(offset)) {
|
|
233
|
+
errors.push(createError('Invalid leveloffset value'));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
// Find matching endleveloffset accounting for nesting
|
|
237
|
+
let depth = 0;
|
|
238
|
+
let searchPos = position;
|
|
239
|
+
let endPos = -1;
|
|
240
|
+
while (searchPos < template.length) {
|
|
241
|
+
const leveloffsetMatch = /{%-?\s*leveloffset\s+[-+]?\d+\s*-?%}/.exec(template.substring(searchPos));
|
|
242
|
+
const endleveloffsetMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(searchPos));
|
|
243
|
+
const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity;
|
|
244
|
+
const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity;
|
|
245
|
+
if (leveloffsetPos < endleveloffsetPos) {
|
|
246
|
+
// Found nested leveloffset
|
|
247
|
+
depth++;
|
|
248
|
+
searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0);
|
|
249
|
+
}
|
|
250
|
+
else if (endleveloffsetPos < Infinity) {
|
|
251
|
+
// Found endleveloffset
|
|
252
|
+
if (depth === 0) {
|
|
253
|
+
// This is our matching endleveloffset
|
|
254
|
+
endPos = endleveloffsetPos;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
depth--;
|
|
259
|
+
searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// No more tags found
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (endPos === -1) {
|
|
268
|
+
errors.push(createError('Missing endleveloffset'));
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
const bodyTemplate = extractTo(endPos);
|
|
272
|
+
// Find and skip the endleveloffset tag
|
|
273
|
+
const endMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(position));
|
|
274
|
+
if (endMatch) {
|
|
275
|
+
advance(endMatch[0].length);
|
|
276
|
+
}
|
|
277
|
+
const bodyResult = parse(bodyTemplate);
|
|
278
|
+
errors.push(...bodyResult.errors);
|
|
279
|
+
ast.push({
|
|
280
|
+
type: 'leveloffset',
|
|
281
|
+
offset,
|
|
282
|
+
isRelative,
|
|
283
|
+
body: bodyResult.ast,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return { ast, errors };
|
|
293
|
+
/**
|
|
294
|
+
* Find an end tag like {% endif %}
|
|
295
|
+
*/
|
|
296
|
+
function findEndTag(tagName) {
|
|
297
|
+
const pattern = new RegExp(`{%\\s*${tagName}\\s*%}`);
|
|
298
|
+
const match = pattern.exec(template.substring(position));
|
|
299
|
+
if (match) {
|
|
300
|
+
return {
|
|
301
|
+
start: position + match.index,
|
|
302
|
+
length: match[0].length,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Parse an if block with elif and else support
|
|
309
|
+
*/
|
|
310
|
+
function parseIfBlock() {
|
|
311
|
+
const elifBranches = [];
|
|
312
|
+
const parseErrors = [];
|
|
313
|
+
let elseBranch = [];
|
|
314
|
+
// Find the next elif, else, or endif
|
|
315
|
+
let depth = 0;
|
|
316
|
+
let searchPos = position;
|
|
317
|
+
while (searchPos < template.length) {
|
|
318
|
+
const ifMatch = /{%-?\s*if\s+/.exec(template.substring(searchPos));
|
|
319
|
+
const elifMatch = /{%-?\s*elif\s+/.exec(template.substring(searchPos));
|
|
320
|
+
const elseMatch = /{%-?\s*else\s*-?%}/.exec(template.substring(searchPos));
|
|
321
|
+
const endifMatch = /{%-?\s*endif\s*-?%}/.exec(template.substring(searchPos));
|
|
322
|
+
// Find the nearest match
|
|
323
|
+
const matches = [
|
|
324
|
+
{ type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },
|
|
325
|
+
{ type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },
|
|
326
|
+
{ type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },
|
|
327
|
+
{ type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },
|
|
328
|
+
].sort((a, b) => a.pos - b.pos);
|
|
329
|
+
const nearest = matches[0];
|
|
330
|
+
if (!nearest.match || nearest.pos === Infinity) {
|
|
331
|
+
parseErrors.push(createError('Missing endif'));
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
if (nearest.type === 'if') {
|
|
335
|
+
depth++;
|
|
336
|
+
searchPos = nearest.pos + nearest.match[0].length;
|
|
337
|
+
}
|
|
338
|
+
else if (nearest.type === 'endif') {
|
|
339
|
+
if (depth === 0) {
|
|
340
|
+
// This is our endif
|
|
341
|
+
const bodyTemplate = extractTo(nearest.pos);
|
|
342
|
+
advance(nearest.match[0].length);
|
|
343
|
+
const bodyResult = parse(bodyTemplate);
|
|
344
|
+
parseErrors.push(...bodyResult.errors);
|
|
345
|
+
return {
|
|
346
|
+
trueBranch: bodyResult.ast,
|
|
347
|
+
elifBranches,
|
|
348
|
+
elseBranch,
|
|
349
|
+
parseErrors,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
depth--;
|
|
354
|
+
searchPos = nearest.pos + nearest.match[0].length;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {
|
|
358
|
+
// Parse the body before elif/else
|
|
359
|
+
const bodyTemplate = extractTo(nearest.pos);
|
|
360
|
+
const bodyResult = parse(bodyTemplate);
|
|
361
|
+
if (elifBranches.length === 0 && elseBranch.length === 0) {
|
|
362
|
+
// This is the trueBranch (before first elif/else)
|
|
363
|
+
parseErrors.push(...bodyResult.errors);
|
|
364
|
+
const trueBranch = bodyResult.ast;
|
|
365
|
+
// Now handle elif or else
|
|
366
|
+
if (nearest.type === 'elif') {
|
|
367
|
+
// Extract elif condition
|
|
368
|
+
advance(nearest.match[0].length);
|
|
369
|
+
const condMatch = /^([^%]+)%}/.exec(template.substring(position));
|
|
370
|
+
if (condMatch) {
|
|
371
|
+
const condStr = condMatch[1].trim();
|
|
372
|
+
advance(condMatch[0].length);
|
|
373
|
+
try {
|
|
374
|
+
const elifCondition = parseExpression(condStr);
|
|
375
|
+
const elifResult = parseIfBlock();
|
|
376
|
+
parseErrors.push(...elifResult.parseErrors);
|
|
377
|
+
elifBranches.push({
|
|
378
|
+
condition: elifCondition,
|
|
379
|
+
body: elifResult.trueBranch,
|
|
380
|
+
});
|
|
381
|
+
elifBranches.push(...(elifResult.elifBranches || []));
|
|
382
|
+
elseBranch = elifResult.elseBranch;
|
|
383
|
+
return {
|
|
384
|
+
trueBranch,
|
|
385
|
+
elifBranches,
|
|
386
|
+
elseBranch,
|
|
387
|
+
parseErrors,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
parseErrors.push(createError(`Invalid elif expression: ${error.message}`));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// else
|
|
397
|
+
advance(nearest.match[0].length);
|
|
398
|
+
// Find endif for else block
|
|
399
|
+
const endifMatch = findEndTag('endif');
|
|
400
|
+
if (!endifMatch) {
|
|
401
|
+
parseErrors.push(createError('Missing endif after else'));
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
const elseBodyTemplate = extractTo(endifMatch.start);
|
|
405
|
+
advance(endifMatch.length);
|
|
406
|
+
const elseBodyResult = parse(elseBodyTemplate);
|
|
407
|
+
parseErrors.push(...elseBodyResult.errors);
|
|
408
|
+
elseBranch = elseBodyResult.ast;
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
trueBranch,
|
|
412
|
+
elifBranches,
|
|
413
|
+
elseBranch,
|
|
414
|
+
parseErrors,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
searchPos = nearest.pos + nearest.match[0].length;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return {
|
|
424
|
+
trueBranch: [],
|
|
425
|
+
elifBranches,
|
|
426
|
+
elseBranch,
|
|
427
|
+
parseErrors,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Parse a switch block with case support
|
|
432
|
+
*/
|
|
433
|
+
function parseSwitchBlock() {
|
|
434
|
+
const cases = [];
|
|
435
|
+
const parseErrors = [];
|
|
436
|
+
while (position < template.length) {
|
|
437
|
+
// Find the next case or endswitch
|
|
438
|
+
const caseMatch = /{%-?\s*case\s+/.exec(template.substring(position));
|
|
439
|
+
const endswitchMatch = /{%-?\s*endswitch\s*-?%}/.exec(template.substring(position));
|
|
440
|
+
// Find which comes first
|
|
441
|
+
const casePos = caseMatch ? position + caseMatch.index : Infinity;
|
|
442
|
+
const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity;
|
|
443
|
+
if (endswitchPos < casePos) {
|
|
444
|
+
// Found endswitch before any case (or no case)
|
|
445
|
+
// Parse any remaining content before endswitch as the last case body
|
|
446
|
+
if (cases.length > 0 && position < endswitchPos) {
|
|
447
|
+
const bodyTemplate = extractTo(endswitchPos);
|
|
448
|
+
const bodyResult = parse(bodyTemplate);
|
|
449
|
+
parseErrors.push(...bodyResult.errors);
|
|
450
|
+
cases[cases.length - 1].body = bodyResult.ast;
|
|
451
|
+
}
|
|
452
|
+
// Skip endswitch
|
|
453
|
+
advance(endswitchPos - position + (endswitchMatch?.[0].length || 0));
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
else if (casePos < Infinity) {
|
|
457
|
+
// Found a case
|
|
458
|
+
// If there's a previous case, parse its body
|
|
459
|
+
if (cases.length > 0 && position < casePos) {
|
|
460
|
+
const bodyTemplate = extractTo(casePos);
|
|
461
|
+
const bodyResult = parse(bodyTemplate);
|
|
462
|
+
parseErrors.push(...bodyResult.errors);
|
|
463
|
+
cases[cases.length - 1].body = bodyResult.ast;
|
|
464
|
+
}
|
|
465
|
+
else if (position < casePos) {
|
|
466
|
+
// Content before first case - skip it
|
|
467
|
+
extractTo(casePos);
|
|
468
|
+
}
|
|
469
|
+
// Parse the case value
|
|
470
|
+
advance(caseMatch[0].length);
|
|
471
|
+
// Extract the case value (until %})
|
|
472
|
+
const valueMatch = /([^%]+)%}/.exec(template.substring(position));
|
|
473
|
+
if (valueMatch) {
|
|
474
|
+
const valueStr = valueMatch[1].trim();
|
|
475
|
+
advance(valueMatch[0].length);
|
|
476
|
+
try {
|
|
477
|
+
const caseValue = parseExpression(valueStr);
|
|
478
|
+
cases.push({
|
|
479
|
+
value: caseValue,
|
|
480
|
+
body: [], // Will be filled in next iteration or at endswitch
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
parseErrors.push(createError(`Invalid case value: ${error.message}`));
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
parseErrors.push(createError('Invalid case syntax'));
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
// No case or endswitch found
|
|
494
|
+
parseErrors.push(createError('Missing endswitch'));
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return { cases, parseErrors };
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template renderer
|
|
3
|
+
* Combines parser, evaluator, and loader to render templates
|
|
4
|
+
*/
|
|
5
|
+
import type { RenderOptions } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render a template string
|
|
8
|
+
* @param template - Template string to render
|
|
9
|
+
* @param options - Render options
|
|
10
|
+
* @returns Rendered output
|
|
11
|
+
*/
|
|
12
|
+
export declare function render(template: string, options?: RenderOptions): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAuB,aAAa,EAAU,MAAM,YAAY,CAAA;AA+D5E;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC3F"}
|