coffeehaml 0.1.0

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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/ast.d.ts +107 -0
  4. package/dist/ast.d.ts.map +1 -0
  5. package/dist/ast.js +125 -0
  6. package/dist/ast.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +53 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compiler.d.ts +10 -0
  12. package/dist/compiler.d.ts.map +1 -0
  13. package/dist/compiler.js +83 -0
  14. package/dist/compiler.js.map +1 -0
  15. package/dist/emitter.d.ts +4 -0
  16. package/dist/emitter.d.ts.map +1 -0
  17. package/dist/emitter.js +464 -0
  18. package/dist/emitter.js.map +1 -0
  19. package/dist/errors.d.ts +3 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +2 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/expressions.d.ts +10 -0
  24. package/dist/expressions.d.ts.map +1 -0
  25. package/dist/expressions.js +70 -0
  26. package/dist/expressions.js.map +1 -0
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lexer.d.ts +29 -0
  32. package/dist/lexer.d.ts.map +1 -0
  33. package/dist/lexer.js +315 -0
  34. package/dist/lexer.js.map +1 -0
  35. package/dist/parser.d.ts +4 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +408 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/types.d.ts +65 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +12 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/vite-plugin.d.ts +7 -0
  44. package/dist/vite-plugin.d.ts.map +1 -0
  45. package/dist/vite-plugin.js +44 -0
  46. package/dist/vite-plugin.js.map +1 -0
  47. package/docs/README.md +110 -0
  48. package/docs/architecture.md +619 -0
  49. package/docs/ast.md +413 -0
  50. package/docs/examples.md +719 -0
  51. package/docs/grammar.md +432 -0
  52. package/docs/index.html +129 -0
  53. package/package.json +61 -0
package/dist/lexer.js ADDED
@@ -0,0 +1,315 @@
1
+ // ─── Token Types ───────────────────────────────────────────
2
+ export var TokenType;
3
+ (function (TokenType) {
4
+ TokenType["TAG"] = "TAG";
5
+ TokenType["CLASS"] = "CLASS";
6
+ TokenType["ID"] = "ID";
7
+ TokenType["ATTRS_PAREN"] = "ATTRS_PAREN";
8
+ TokenType["ATTRS_BRACE"] = "ATTRS_BRACE";
9
+ TokenType["OUTPUT"] = "OUTPUT";
10
+ TokenType["OUTPUT_UNESC"] = "OUTPUT_UNESC";
11
+ TokenType["CONTROL"] = "CONTROL";
12
+ TokenType["COMMENT"] = "COMMENT";
13
+ TokenType["HTML_COMMENT"] = "HTML_COMMENT";
14
+ TokenType["FILTER"] = "FILTER";
15
+ TokenType["DOCTYPE"] = "DOCTYPE";
16
+ TokenType["TEXT"] = "TEXT";
17
+ TokenType["INDENT"] = "INDENT";
18
+ TokenType["DEDENT"] = "DEDENT";
19
+ TokenType["NEWLINE"] = "NEWLINE";
20
+ TokenType["SELF_CLOSE"] = "SELF_CLOSE";
21
+ })(TokenType || (TokenType = {}));
22
+ // ─── Lexer ─────────────────────────────────────────────────
23
+ export function tokenize(source, filename) {
24
+ const tokens = [];
25
+ const lines = source.split('\n');
26
+ const indentStack = [0]; // level 0 is always on the stack
27
+ let offset = 0;
28
+ for (const rawLine of lines) {
29
+ const line = rawLine.replace(/\r$/, '');
30
+ const lineLength = rawLine.length + 1; // +1 for \n (used only for offset)
31
+ // Skip empty lines (but preserve their space for offset tracking)
32
+ if (line.trim() === '') {
33
+ offset += lineLength;
34
+ continue;
35
+ }
36
+ const indent = countIndent(line);
37
+ const content = line.slice(indent);
38
+ // Skip blank lines
39
+ if (content === '') {
40
+ offset += lineLength;
41
+ continue;
42
+ }
43
+ // Handle indentation changes
44
+ const currentIndent = indentStack[indentStack.length - 1];
45
+ if (indent > currentIndent) {
46
+ indentStack.push(indent);
47
+ tokens.push(indentToken(indent, offset, indent, filename));
48
+ }
49
+ else if (indent < currentIndent) {
50
+ while (indentStack.length > 1 && indent < indentStack[indentStack.length - 1]) {
51
+ indentStack.pop();
52
+ tokens.push(dedentToken(offset, filename));
53
+ }
54
+ if (indent !== indentStack[indentStack.length - 1]) {
55
+ // Misaligned indent — still emit what we can
56
+ indentStack.push(indent);
57
+ tokens.push(indentToken(indent, offset, indent, filename));
58
+ }
59
+ }
60
+ // Parse the line content
61
+ const lineStartOffset = offset + indent;
62
+ const lineTokens = tokenizeLine(content, lineStartOffset, lineLength - indent, filename);
63
+ tokens.push(...lineTokens);
64
+ offset += lineLength;
65
+ }
66
+ // Emit remaining DEDENT tokens at EOF
67
+ while (indentStack.length > 1) {
68
+ indentStack.pop();
69
+ tokens.push(dedentToken(offset, filename));
70
+ }
71
+ return tokens;
72
+ }
73
+ // ─── Line Tokenization ─────────────────────────────────────
74
+ function tokenizeLine(content, lineStartOffset, _lineLength, filename) {
75
+ const tokens = [];
76
+ let pos = 0;
77
+ function loc(start, end) {
78
+ return {
79
+ start: { line: 0, column: lineStartOffset + start }, // line filled by tokenize() context
80
+ end: { line: 0, column: lineStartOffset + end },
81
+ offset: lineStartOffset + start,
82
+ length: end - start,
83
+ file: filename,
84
+ };
85
+ }
86
+ const firstChar = content[0];
87
+ // ── %tag ──
88
+ if (firstChar === '%') {
89
+ let end = 1;
90
+ // Read tag name: letters, digits, hyphens, underscores
91
+ while (end < content.length && /[\w-]/.test(content[end])) {
92
+ end++;
93
+ }
94
+ const tagName = content.slice(1, end);
95
+ tokens.push({ type: TokenType.TAG, value: tagName, location: loc(0, end) });
96
+ pos = end;
97
+ // Check for self-closing /
98
+ if (content[pos] === '/') {
99
+ tokens.push({ type: TokenType.SELF_CLOSE, value: '/', location: loc(pos, pos + 1) });
100
+ pos++;
101
+ }
102
+ // Parse modifiers and attributes on the rest of the line
103
+ const modResult = parseModifiersAndAttrs(content, pos, lineStartOffset, filename);
104
+ tokens.push(...modResult.tokens);
105
+ pos = modResult.pos;
106
+ // Parse inline output or text after tag and attributes
107
+ const remaining = content.slice(pos).trimStart();
108
+ const trimmedOffset = content.length - remaining.length;
109
+ if (remaining) {
110
+ if (remaining.startsWith('= ') || remaining === '=') {
111
+ tokens.push({ type: TokenType.OUTPUT, value: remaining.slice(1).trimStart(), location: loc(trimmedOffset + 1, content.length) });
112
+ }
113
+ else if (remaining.startsWith('!= ')) {
114
+ tokens.push({ type: TokenType.OUTPUT_UNESC, value: remaining.slice(2).trimStart(), location: loc(trimmedOffset + 2, content.length) });
115
+ }
116
+ else if (!remaining.startsWith('{') && !remaining.startsWith('(')) {
117
+ tokens.push({
118
+ type: TokenType.TEXT,
119
+ value: remaining,
120
+ location: loc(trimmedOffset, content.length),
121
+ });
122
+ }
123
+ }
124
+ return tokens;
125
+ }
126
+ // ── .class / #id (implicit div) ──
127
+ // Only match if the modifier is immediately followed by a valid identifier char.
128
+ // This prevents `# Hello` (Markdown heading) or `. something` from being
129
+ // mistakenly parsed as modifiers inside filter blocks.
130
+ if ((firstChar === '.' || firstChar === '#') && /^[.#][\w-]/.test(content)) {
131
+ const modResult = parseModifiersAndAttrs(content, 0, lineStartOffset, filename);
132
+ tokens.push(...modResult.tokens);
133
+ return tokens;
134
+ }
135
+ // ── = expression ──
136
+ if (firstChar === '=' && content[1] !== '=') {
137
+ const expr = content.slice(1).trimStart();
138
+ return [{ type: TokenType.OUTPUT, value: expr, location: loc(1, content.length) }];
139
+ }
140
+ // ── != expression ──
141
+ if (firstChar === '!' && content[1] === '=') {
142
+ const expr = content.slice(2).trimStart();
143
+ return [{ type: TokenType.OUTPUT_UNESC, value: expr, location: loc(2, content.length) }];
144
+ }
145
+ // ── - control / comment ──
146
+ if (firstChar === '-') {
147
+ if (content[1] === '#') {
148
+ // Haml comment
149
+ return [{ type: TokenType.COMMENT, value: content.slice(2).trimStart(), location: loc(2, content.length) }];
150
+ }
151
+ // Control flow or code
152
+ const expr = content.slice(1).trimStart();
153
+ return [{ type: TokenType.CONTROL, value: expr, location: loc(1, content.length) }];
154
+ }
155
+ // ── / HTML comment ──
156
+ if (firstChar === '/') {
157
+ return [{ type: TokenType.HTML_COMMENT, value: content.slice(1).trimStart(), location: loc(1, content.length) }];
158
+ }
159
+ // ── :filter ──
160
+ if (firstChar === ':') {
161
+ const spaceIdx = content.search(/\s/);
162
+ const filterName = spaceIdx === -1 ? content.slice(1) : content.slice(1, spaceIdx);
163
+ const filterContent = spaceIdx === -1 ? '' : content.slice(spaceIdx + 1);
164
+ return [{ type: TokenType.FILTER, value: `${filterName}\n${filterContent}`, location: loc(0, content.length) }];
165
+ }
166
+ // ── !!! doctype ──
167
+ if (content.startsWith('!!!')) {
168
+ const val = content.slice(3).trimStart();
169
+ return [{ type: TokenType.DOCTYPE, value: val || 'html', location: loc(0, content.length) }];
170
+ }
171
+ // ── Plain text ──
172
+ return [{ type: TokenType.TEXT, value: content, location: loc(0, content.length) }];
173
+ }
174
+ // ─── Modifiers and Attributes Parser ───────────────────────
175
+ function parseModifiersAndAttrs(content, startPos, lineStartOffset, filename) {
176
+ const tokens = [];
177
+ let pos = startPos;
178
+ function loc(start, end) {
179
+ return {
180
+ start: { line: 0, column: lineStartOffset + start },
181
+ end: { line: 0, column: lineStartOffset + end },
182
+ offset: lineStartOffset + start,
183
+ length: end - start,
184
+ file: filename,
185
+ };
186
+ }
187
+ while (pos < content.length) {
188
+ const ch = content[pos];
189
+ // Whitespace
190
+ if (ch === ' ' || ch === '\t') {
191
+ pos++;
192
+ continue;
193
+ }
194
+ // .class
195
+ if (ch === '.') {
196
+ let end = pos + 1;
197
+ while (end < content.length && /[\w-]/.test(content[end])) {
198
+ end++;
199
+ }
200
+ const className = content.slice(pos + 1, end);
201
+ tokens.push({ type: TokenType.CLASS, value: className, location: loc(pos, end) });
202
+ pos = end;
203
+ continue;
204
+ }
205
+ // #id
206
+ if (ch === '#') {
207
+ let end = pos + 1;
208
+ while (end < content.length && /[\w-]/.test(content[end])) {
209
+ end++;
210
+ }
211
+ const idName = content.slice(pos + 1, end);
212
+ tokens.push({ type: TokenType.ID, value: idName, location: loc(pos, end) });
213
+ pos = end;
214
+ continue;
215
+ }
216
+ // {attribute block}
217
+ if (ch === '{') {
218
+ const block = extractBracketed(content, pos, '{', '}');
219
+ if (block) {
220
+ tokens.push({ type: TokenType.ATTRS_BRACE, value: block, location: loc(pos, pos + block.length + 2) });
221
+ pos += block.length + 2;
222
+ }
223
+ else {
224
+ // Unterminated — consume rest
225
+ tokens.push({ type: TokenType.ATTRS_BRACE, value: content.slice(pos + 1), location: loc(pos, content.length) });
226
+ pos = content.length;
227
+ }
228
+ continue;
229
+ }
230
+ // (attribute block)
231
+ if (ch === '(') {
232
+ const block = extractBracketed(content, pos, '(', ')');
233
+ if (block) {
234
+ tokens.push({ type: TokenType.ATTRS_PAREN, value: block, location: loc(pos, pos + block.length + 2) });
235
+ pos += block.length + 2;
236
+ }
237
+ else {
238
+ tokens.push({ type: TokenType.ATTRS_PAREN, value: content.slice(pos + 1), location: loc(pos, content.length) });
239
+ pos = content.length;
240
+ }
241
+ continue;
242
+ }
243
+ // Anything else → stop, it's inline text
244
+ break;
245
+ }
246
+ return { tokens, pos };
247
+ }
248
+ // ─── Helpers ───────────────────────────────────────────────
249
+ function countIndent(line) {
250
+ let count = 0;
251
+ for (const ch of line) {
252
+ if (ch === ' ')
253
+ count++;
254
+ else if (ch === '\t')
255
+ count += 2; // tab = 2 spaces
256
+ else
257
+ break;
258
+ }
259
+ return count;
260
+ }
261
+ function indentToken(_indent, offset, level, filename) {
262
+ return {
263
+ type: TokenType.INDENT,
264
+ value: '',
265
+ indent: level,
266
+ location: {
267
+ start: { line: 0, column: 0 },
268
+ end: { line: 0, column: 0 },
269
+ offset,
270
+ length: 0,
271
+ file: filename,
272
+ },
273
+ };
274
+ }
275
+ function dedentToken(offset, filename) {
276
+ return {
277
+ type: TokenType.DEDENT,
278
+ value: '',
279
+ indent: undefined,
280
+ location: {
281
+ start: { line: 0, column: 0 },
282
+ end: { line: 0, column: 0 },
283
+ offset,
284
+ length: 0,
285
+ file: filename,
286
+ },
287
+ };
288
+ }
289
+ /** Extract content between balanced open/close brackets. Returns inner content or null. */
290
+ function extractBracketed(content, start, open, close) {
291
+ let depth = 0;
292
+ let pos = start;
293
+ while (pos < content.length) {
294
+ if (content[pos] === open)
295
+ depth++;
296
+ else if (content[pos] === close) {
297
+ depth--;
298
+ if (depth === 0)
299
+ return content.slice(start + 1, pos);
300
+ }
301
+ // Handle string literals — skip over them
302
+ if (content[pos] === '"' || content[pos] === "'") {
303
+ const q = content[pos];
304
+ pos++;
305
+ while (pos < content.length && content[pos] !== q) {
306
+ if (content[pos] === '\\')
307
+ pos++; // skip escape
308
+ pos++;
309
+ }
310
+ }
311
+ pos++;
312
+ }
313
+ return null; // unbalanced
314
+ }
315
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Token } from './lexer.js';
2
+ import { Document } from './ast.js';
3
+ export declare function parse(tokens: Token[], filename?: string): Document;
4
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,QAAQ,EAGT,MAAM,UAAU,CAAC;AA0DlB,wBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAIlE"}