@semanticintent/recall 0.2.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.
@@ -0,0 +1,353 @@
1
+ // ─────────────────────────────────────────────────────────
2
+ // RECALL Parser — .rcl source → ReclProgram AST
3
+ // ─────────────────────────────────────────────────────────
4
+ // ─────────────────────────────────────────────────────────
5
+ // Tokenisation helpers
6
+ // ─────────────────────────────────────────────────────────
7
+ function stripComment(line) {
8
+ // Column 7 indicator: if 7th char is *, it's a comment line
9
+ if (line.length >= 7 && line[6] === '*')
10
+ return '';
11
+ // Inline * comments after a period
12
+ return line;
13
+ }
14
+ function cleanLine(raw) {
15
+ const stripped = stripComment(raw);
16
+ return stripped.trim();
17
+ }
18
+ function extractString(token) {
19
+ // Remove surrounding quotes
20
+ if ((token.startsWith('"') && token.endsWith('"')) ||
21
+ (token.startsWith("'") && token.endsWith("'"))) {
22
+ return token.slice(1, -1);
23
+ }
24
+ return token;
25
+ }
26
+ function parsePicValue(tokens) {
27
+ // e.g. PIC X(60) VALUE "hello"
28
+ const picIdx = tokens.indexOf('PIC');
29
+ const valueIdx = tokens.indexOf('VALUE');
30
+ const pic = picIdx >= 0 && picIdx + 1 < tokens.length ? tokens[picIdx + 1] : 'X';
31
+ const value = valueIdx >= 0 && valueIdx + 1 < tokens.length
32
+ ? extractString(tokens.slice(valueIdx + 1).join(' '))
33
+ : '';
34
+ return { pic, value };
35
+ }
36
+ // ─────────────────────────────────────────────────────────
37
+ // Division detection
38
+ // ─────────────────────────────────────────────────────────
39
+ function detectDivision(line) {
40
+ const t = line.trim();
41
+ if (t.startsWith('IDENTIFICATION DIVISION'))
42
+ return 'IDENTIFICATION';
43
+ if (t.startsWith('ENVIRONMENT DIVISION'))
44
+ return 'ENVIRONMENT';
45
+ if (t.startsWith('DATA DIVISION'))
46
+ return 'DATA';
47
+ if (t.startsWith('PROCEDURE DIVISION'))
48
+ return 'PROCEDURE';
49
+ return null;
50
+ }
51
+ // ─────────────────────────────────────────────────────────
52
+ // Division parsers
53
+ // ─────────────────────────────────────────────────────────
54
+ function parseIdentification(lines) {
55
+ const result = {};
56
+ for (const raw of lines) {
57
+ const line = cleanLine(raw);
58
+ if (!line)
59
+ continue;
60
+ const tokens = line.replace(/\.$/, '').split(/\s+/);
61
+ const kw = tokens[0];
62
+ const val = extractString(tokens.slice(1).join(' '));
63
+ if (kw === 'PROGRAM-ID.')
64
+ result.programId = val || tokens[1];
65
+ if (kw === 'AUTHOR.')
66
+ result.author = val;
67
+ if (kw === 'DATE-WRITTEN.')
68
+ result.dateWritten = val;
69
+ if (kw === 'PAGE-TITLE.')
70
+ result.pageTitle = val;
71
+ if (kw === 'DESCRIPTION.')
72
+ result.description = val;
73
+ if (kw === 'FAVICON.')
74
+ result.favicon = val;
75
+ }
76
+ return {
77
+ programId: result.programId ?? 'RECALL-PROGRAM',
78
+ pageTitle: result.pageTitle ?? 'RECALL Page',
79
+ author: result.author,
80
+ dateWritten: result.dateWritten,
81
+ description: result.description,
82
+ favicon: result.favicon,
83
+ };
84
+ }
85
+ function parseEnvironment(lines) {
86
+ const result = { palette: {} };
87
+ for (const raw of lines) {
88
+ const line = cleanLine(raw);
89
+ if (!line || line.endsWith('SECTION.') || line === 'CONFIGURATION SECTION' || line === 'PALETTE SECTION')
90
+ continue;
91
+ const tokens = line.replace(/\.$/, '').split(/\s+/);
92
+ const kw = tokens[0];
93
+ if (kw === 'VIEWPORT')
94
+ result.viewport = tokens[1];
95
+ if (kw === 'COLOR-MODE')
96
+ result.colorMode = tokens[1];
97
+ if (kw === 'FONT-PRIMARY')
98
+ result.fontPrimary = extractString(tokens.slice(1).join(' '));
99
+ if (kw === 'FONT-SECONDARY')
100
+ result.fontSecondary = extractString(tokens.slice(1).join(' '));
101
+ if (kw === 'LANGUAGE')
102
+ result.language = tokens[1];
103
+ // Palette: 01 COLOR-ACCENT PIC X(7) VALUE "#..."
104
+ if (kw === '01') {
105
+ const name = tokens[1];
106
+ const { value } = parsePicValue(tokens.slice(2));
107
+ if (name && value)
108
+ result.palette[name] = value;
109
+ }
110
+ }
111
+ return {
112
+ viewport: result.viewport ?? 'RESPONSIVE',
113
+ colorMode: result.colorMode ?? 'DARK',
114
+ fontPrimary: result.fontPrimary,
115
+ fontSecondary: result.fontSecondary,
116
+ language: result.language ?? 'EN',
117
+ palette: result.palette ?? {},
118
+ };
119
+ }
120
+ function parseDataField(tokens) {
121
+ const level = parseInt(tokens[0], 10);
122
+ const name = tokens[1];
123
+ const rest = tokens.slice(2);
124
+ const { pic, value } = parsePicValue(rest);
125
+ return { level, name, pic, value, children: [] };
126
+ }
127
+ function parseData(lines) {
128
+ const workingStorage = [];
129
+ const items = [];
130
+ let section = null;
131
+ let stack = [];
132
+ for (const raw of lines) {
133
+ const line = cleanLine(raw);
134
+ if (!line)
135
+ continue;
136
+ if (line.startsWith('WORKING-STORAGE SECTION')) {
137
+ section = 'WORKING-STORAGE';
138
+ stack = [];
139
+ continue;
140
+ }
141
+ if (line.startsWith('ITEMS SECTION')) {
142
+ section = 'ITEMS';
143
+ stack = [];
144
+ continue;
145
+ }
146
+ if (!section)
147
+ continue;
148
+ const tokens = line.replace(/\.$/, '').split(/\s+/);
149
+ const level = parseInt(tokens[0], 10);
150
+ if (isNaN(level))
151
+ continue;
152
+ const field = parseDataField(tokens);
153
+ const target = section === 'WORKING-STORAGE' ? workingStorage : items;
154
+ if (level === 1) {
155
+ target.push(field);
156
+ stack = [field];
157
+ }
158
+ else if (level === 5) {
159
+ const parent = stack.find(f => f.level === 1);
160
+ parent?.children.push(field);
161
+ stack = stack.filter(f => f.level === 1);
162
+ stack.push(field);
163
+ }
164
+ else if (level === 10) {
165
+ const parent = stack.find(f => f.level === 5);
166
+ parent?.children.push(field);
167
+ }
168
+ }
169
+ return { workingStorage, items };
170
+ }
171
+ function tokeniseLine(line) {
172
+ // Tokenise respecting quoted strings
173
+ const tokens = [];
174
+ let current = '';
175
+ let inQuote = false;
176
+ let quoteChar = '';
177
+ for (const ch of line) {
178
+ if (!inQuote && (ch === '"' || ch === "'")) {
179
+ inQuote = true;
180
+ quoteChar = ch;
181
+ current += ch;
182
+ }
183
+ else if (inQuote && ch === quoteChar) {
184
+ inQuote = false;
185
+ current += ch;
186
+ tokens.push(current);
187
+ current = '';
188
+ }
189
+ else if (!inQuote && ch === ' ') {
190
+ if (current) {
191
+ tokens.push(current);
192
+ current = '';
193
+ }
194
+ }
195
+ else {
196
+ current += ch;
197
+ }
198
+ }
199
+ if (current)
200
+ tokens.push(current);
201
+ return tokens;
202
+ }
203
+ function parseDisplayStatement(rawTokens) {
204
+ // Re-tokenise the joined line respecting quoted strings
205
+ const line = rawTokens.join(' ');
206
+ const tokens = tokeniseLine(line);
207
+ const element = tokens[1];
208
+ let value;
209
+ const clauses = [];
210
+ let i = 2;
211
+ // Next token might be a value (not a keyword)
212
+ if (i < tokens.length && !['WITH', 'ON-CLICK', 'USING', 'HREF', 'ID'].includes(tokens[i])) {
213
+ value = extractString(tokens[i]);
214
+ i++;
215
+ }
216
+ while (i < tokens.length) {
217
+ const kw = tokens[i];
218
+ if (kw === 'WITH' && i + 2 < tokens.length) {
219
+ clauses.push({ key: tokens[i + 1], value: extractString(tokens[i + 2]) });
220
+ i += 3;
221
+ }
222
+ else if (kw === 'ID' && i + 1 < tokens.length) {
223
+ clauses.push({ key: 'ID', value: extractString(tokens[i + 1]) });
224
+ i += 2;
225
+ }
226
+ else if (kw === 'USING' && i + 1 < tokens.length) {
227
+ clauses.push({ key: 'USING', value: tokens[i + 1] });
228
+ i += 2;
229
+ }
230
+ else if (kw === 'ON-CLICK' && i + 2 < tokens.length) {
231
+ // ON-CLICK GOTO "#href"
232
+ clauses.push({ key: 'ON-CLICK', value: extractString(tokens[i + 2]) });
233
+ i += 3;
234
+ }
235
+ else if (kw === 'HREF' && i + 1 < tokens.length) {
236
+ clauses.push({ key: 'HREF', value: extractString(tokens[i + 1]) });
237
+ i += 2;
238
+ }
239
+ else {
240
+ i++;
241
+ }
242
+ }
243
+ return { element, value, clauses, children: [] };
244
+ }
245
+ function joinContinuationLines(lines) {
246
+ // Merge lines that are continuation of a DISPLAY statement
247
+ // A DISPLAY statement continues as long as the next line doesn't start
248
+ // a new keyword (section header, STOP, another DISPLAY)
249
+ const joined = [];
250
+ let current = '';
251
+ for (const raw of lines) {
252
+ const line = cleanLine(raw);
253
+ if (!line)
254
+ continue;
255
+ const isNewStatement = line.startsWith('DISPLAY') ||
256
+ line.startsWith('STOP') ||
257
+ line.startsWith('COPY FROM') ||
258
+ (!line.includes(' ') && line.endsWith('.')); // section header
259
+ if (isNewStatement) {
260
+ if (current)
261
+ joined.push(current);
262
+ current = line;
263
+ }
264
+ else {
265
+ // continuation — append to current
266
+ current = current ? `${current} ${line}` : line;
267
+ }
268
+ }
269
+ if (current)
270
+ joined.push(current);
271
+ return joined;
272
+ }
273
+ function parseProcedure(lines) {
274
+ const sections = [];
275
+ let current = null;
276
+ let currentSection = null;
277
+ const joined = joinContinuationLines(lines);
278
+ for (const line of joined) {
279
+ if (!line || line === 'STOP RUN.')
280
+ continue;
281
+ // Section header: single word ending with .
282
+ if (!line.startsWith('DISPLAY') && line.endsWith('.') && !line.startsWith('STOP') && !line.includes(' ')) {
283
+ const name = line.replace(/\.$/, '').trim();
284
+ if (name) {
285
+ current = { name, statements: [] };
286
+ currentSection = null;
287
+ sections.push(current);
288
+ continue;
289
+ }
290
+ }
291
+ if (line === 'STOP SECTION.') {
292
+ currentSection = null;
293
+ continue;
294
+ }
295
+ if (line.startsWith('DISPLAY') && current) {
296
+ const tokens = line.replace(/\.$/, '').split(/\s+/);
297
+ const stmt = parseDisplayStatement(tokens);
298
+ if (stmt.element === 'SECTION') {
299
+ current.statements.push(stmt);
300
+ currentSection = stmt;
301
+ }
302
+ else if (currentSection) {
303
+ currentSection.children.push(stmt);
304
+ }
305
+ else {
306
+ current.statements.push(stmt);
307
+ }
308
+ }
309
+ else if (line.startsWith('COPY FROM') && current) {
310
+ // COPY FROM "path/to/component.rcl"
311
+ const tokens = line.replace(/\.$/, '').split(/\s+/);
312
+ const filePath = extractString(tokens.slice(2).join(' '));
313
+ const stmt = { element: 'COPY', value: filePath, clauses: [], children: [] };
314
+ if (currentSection) {
315
+ currentSection.children.push(stmt);
316
+ }
317
+ else {
318
+ current.statements.push(stmt);
319
+ }
320
+ }
321
+ }
322
+ return { sections };
323
+ }
324
+ // ─────────────────────────────────────────────────────────
325
+ // Main parse entry point
326
+ // ─────────────────────────────────────────────────────────
327
+ export function parse(source) {
328
+ const rawLines = source.split('\n');
329
+ // Split into division buckets
330
+ const buckets = {
331
+ IDENTIFICATION: [],
332
+ ENVIRONMENT: [],
333
+ DATA: [],
334
+ PROCEDURE: [],
335
+ };
336
+ let currentDivision = null;
337
+ for (const line of rawLines) {
338
+ const div = detectDivision(line);
339
+ if (div) {
340
+ currentDivision = div;
341
+ continue;
342
+ }
343
+ if (currentDivision)
344
+ buckets[currentDivision].push(line);
345
+ }
346
+ return {
347
+ identification: parseIdentification(buckets.IDENTIFICATION),
348
+ environment: parseEnvironment(buckets.ENVIRONMENT),
349
+ data: parseData(buckets.DATA),
350
+ procedure: parseProcedure(buckets.PROCEDURE),
351
+ };
352
+ }
353
+ //# sourceMappingURL=rcl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rcl.js","sourceRoot":"","sources":["../../src/parser/rcl.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@semanticintent/recall",
3
+ "version": "0.2.0",
4
+ "description": "RECALL — a declarative web interface language with COBOL-inspired syntax. The source is the artifact.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "recall": "./bin/recall.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "test": "vitest run",
14
+ "dev": "tsc --watch"
15
+ },
16
+ "keywords": [
17
+ "cobol",
18
+ "recall",
19
+ "transpiler",
20
+ "html",
21
+ "language",
22
+ "web"
23
+ ],
24
+ "author": "semanticintent",
25
+ "license": "MIT",
26
+ "devDependencies": {
27
+ "@types/node": "^25.5.2",
28
+ "commander": "^14.0.3",
29
+ "typescript": "^6.0.2",
30
+ "vitest": "^4.1.2"
31
+ },
32
+ "dependencies": {
33
+ "commander": "^14.0.3"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/semanticintent/recall.git"
38
+ },
39
+ "homepage": "https://recall.cormorantforaging.dev",
40
+ "bugs": {
41
+ "url": "https://github.com/semanticintent/recall/issues"
42
+ }
43
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": true,
12
+ "esModuleInterop": true,
13
+ "types": ["node"]
14
+ },
15
+ "include": ["src/**/*"],
16
+ "exclude": ["node_modules", "dist", "tests"]
17
+ }