@davidbc01/telar 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.
@@ -0,0 +1,28 @@
1
+ import { NodoAplicacion } from './tipos';
2
+ export interface ArchivoGenerado {
3
+ nombre: string;
4
+ contenido: string;
5
+ }
6
+ export declare class Generador {
7
+ private app;
8
+ constructor(app: NodoAplicacion);
9
+ generar(): ArchivoGenerado[];
10
+ private generarPagina;
11
+ private generarNodo;
12
+ private generarTitulo;
13
+ private generarDescripcion;
14
+ private generarMostrar;
15
+ private generarBoton;
16
+ private generarCampo;
17
+ private generarSi;
18
+ private generarReintentar;
19
+ private generarCSS;
20
+ private condicionAAtributo;
21
+ private extraerTitulo;
22
+ private extraerDescripcion;
23
+ private rutaANombre;
24
+ private textoAId;
25
+ private escapar;
26
+ private indentar;
27
+ }
28
+ //# sourceMappingURL=generador.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generador.d.ts","sourceRoot":"","sources":["../src/generador.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,cAAc,EAIjB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,GAAG,CAAgB;gBAEf,GAAG,EAAE,cAAc;IAI/B,OAAO,IAAI,eAAe,EAAE;IAqB5B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,UAAU;IA4HlB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,QAAQ;CAInB"}
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ // ---
3
+ // generador.ts
4
+ // Convierte el AST en HTML + CSS + JS básico
5
+ // ---
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Generador = void 0;
8
+ class Generador {
9
+ constructor(app) {
10
+ this.app = app;
11
+ }
12
+ generar() {
13
+ const archivos = [];
14
+ // Generar una página HTML por cada página Telar
15
+ for (const pagina of this.app.paginas) {
16
+ const nombreArchivo = this.rutaANombre(pagina.ruta);
17
+ const contenido = this.generarPagina(pagina);
18
+ archivos.push({ nombre: nombreArchivo, contenido });
19
+ }
20
+ // Generar CSS compartido
21
+ archivos.push({
22
+ nombre: 'telar.css',
23
+ contenido: this.generarCSS()
24
+ });
25
+ return archivos;
26
+ }
27
+ // --- Página completa ---
28
+ generarPagina(pagina) {
29
+ const titulo = this.extraerTitulo(pagina) ?? this.app.nombre;
30
+ const descripcion = this.extraerDescripcion(pagina) ?? '';
31
+ const cuerpo = pagina.hijos.map(h => this.generarNodo(h)).join('\n');
32
+ const tieneCache = pagina.hijos.some(h => h.tipo === 'cache');
33
+ const esMovil = pagina.hijos.some(h => h.tipo === 'optimizar');
34
+ return `<!DOCTYPE html>
35
+ <html lang="es">
36
+ <head>
37
+ <meta charset="UTF-8">
38
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
39
+ <title>${this.escapar(titulo)}</title>
40
+ ${descripcion ? `<meta name="description" content="${this.escapar(descripcion)}">` : ''}
41
+ ${tieneCache ? '<meta http-equiv="Cache-Control" content="max-age=600">' : ''}
42
+ ${esMovil ? '<meta name="mobile-web-app-capable" content="yes">' : ''}
43
+ <link rel="stylesheet" href="telar.css">
44
+ </head>
45
+ <body>
46
+ <main role="main">
47
+ ${this.indentar(cuerpo, 4)}
48
+ </main>
49
+ <script src="telar.js" defer></script>
50
+ </body>
51
+ </html>`;
52
+ }
53
+ // --- Nodos ---
54
+ generarNodo(nodo) {
55
+ switch (nodo.tipo) {
56
+ case 'titulo': return this.generarTitulo(nodo);
57
+ case 'descripcion': return this.generarDescripcion(nodo);
58
+ case 'mostrar': return this.generarMostrar(nodo);
59
+ case 'boton': return this.generarBoton(nodo);
60
+ case 'campo': return this.generarCampo(nodo);
61
+ case 'si': return this.generarSi(nodo);
62
+ case 'optimizar': return ''; // ya procesado en el head
63
+ case 'cache': return ''; // ya procesado en el head
64
+ case 'reintentar': return this.generarReintentar(nodo);
65
+ default: return '';
66
+ }
67
+ }
68
+ // título "Bienvenido"
69
+ generarTitulo(nodo) {
70
+ return `<h1>${this.escapar(nodo.texto)}</h1>`;
71
+ }
72
+ // descripción "..."
73
+ generarDescripcion(nodo) {
74
+ return `<p class="descripcion">${this.escapar(nodo.texto)}</p>`;
75
+ }
76
+ // mostrar Producto recientes
77
+ generarMostrar(nodo) {
78
+ const maximo = nodo.modificadores.find(m => m.tipo === 'maximo');
79
+ const ordenados = nodo.modificadores.find(m => m.tipo === 'ordenados');
80
+ const recientes = nodo.modificadores.find(m => m.tipo === 'recientes');
81
+ // Si es un campo simple (producto.nombre)
82
+ if (nodo.modelo.includes('.')) {
83
+ return `<p class="campo" data-campo="${nodo.modelo}">{${nodo.modelo}}</p>`;
84
+ }
85
+ const atributos = [
86
+ `data-modelo="${nodo.modelo}"`,
87
+ maximo ? `data-maximo="${maximo.cantidad}"` : '',
88
+ ordenados ? `data-ordenar="${ordenados.campo}"` : '',
89
+ recientes ? `data-recientes="true"` : '',
90
+ ].filter(Boolean).join(' ');
91
+ const siFallaHTML = nodo.siFalla
92
+ ? `\n <div class="error" role="alert" hidden>\n${this.indentar(nodo.siFalla.map(n => this.generarNodo(n)).join('\n'), 4)}\n </div>`
93
+ : '';
94
+ return `<section class="lista" ${atributos}>
95
+ <div class="cargando" aria-live="polite">Cargando...</div>${siFallaHTML}
96
+ </section>`;
97
+ }
98
+ // botón "Entrar" ir a login
99
+ generarBoton(nodo) {
100
+ if (nodo.accion === 'ir') {
101
+ const href = nodo.destino.startsWith('http') ? nodo.destino : `/${nodo.destino}`;
102
+ return `<a href="${href}" class="boton" role="button">${this.escapar(nodo.texto)}</a>`;
103
+ }
104
+ const siFallaHTML = nodo.siFalla
105
+ ? `\n<div class="error" role="alert" hidden>\n${this.indentar(nodo.siFalla.map(n => this.generarNodo(n)).join('\n'), 2)}\n</div>`
106
+ : '';
107
+ return `<button class="boton" data-accion="${nodo.destino}" type="button">
108
+ ${this.escapar(nodo.texto)}
109
+ </button>${siFallaHTML}`;
110
+ }
111
+ // campo "Correo" tipo email
112
+ generarCampo(nodo) {
113
+ const id = this.textoAId(nodo.etiqueta);
114
+ const tipo = nodo.tipoCampo === 'área de texto' ? null : nodo.tipoCampo;
115
+ if (!tipo) {
116
+ return `<div class="campo-grupo">
117
+ <label for="${id}">${this.escapar(nodo.etiqueta)}</label>
118
+ <textarea id="${id}" name="${id}" rows="4"></textarea>
119
+ </div>`;
120
+ }
121
+ return `<div class="campo-grupo">
122
+ <label for="${id}">${this.escapar(nodo.etiqueta)}</label>
123
+ <input type="${tipo}" id="${id}" name="${id}" ${tipo === 'email' ? 'autocomplete="email"' : ''}>
124
+ </div>`;
125
+ }
126
+ // si el usuario está conectado
127
+ generarSi(nodo) {
128
+ const condicionAttr = this.condicionAAtributo(nodo.condicion);
129
+ const entonces = nodo.entonces.map(n => this.generarNodo(n)).join('\n');
130
+ const siNo = nodo.siNo ? nodo.siNo.map(n => this.generarNodo(n)).join('\n') : null;
131
+ const entoncesHTML = `<div data-si="${condicionAttr}">\n${this.indentar(entonces, 2)}\n</div>`;
132
+ const siNoHTML = siNo
133
+ ? `\n<div data-si-no="${condicionAttr}">\n${this.indentar(siNo, 2)}\n</div>`
134
+ : '';
135
+ return entoncesHTML + siNoHTML;
136
+ }
137
+ // reintentar en 5 segundos
138
+ generarReintentar(nodo) {
139
+ return `<button class="reintentar" data-reintentar="${nodo.segundos}" type="button">
140
+ Reintentar
141
+ </button>`;
142
+ }
143
+ // --- CSS ---
144
+ generarCSS() {
145
+ return `/* Telar — estilos base generados automáticamente */
146
+
147
+ *, *::before, *::after {
148
+ box-sizing: border-box;
149
+ margin: 0;
150
+ padding: 0;
151
+ }
152
+
153
+ :root {
154
+ --color-fondo: #ffffff;
155
+ --color-texto: #1a1a1a;
156
+ --color-primario: #5B4AB7;
157
+ --color-borde: #e0e0e0;
158
+ --color-error: #dc2626;
159
+ --radio: 8px;
160
+ --espacio: 1rem;
161
+ font-size: 16px;
162
+ }
163
+
164
+ body {
165
+ font-family: system-ui, -apple-system, sans-serif;
166
+ background: var(--color-fondo);
167
+ color: var(--color-texto);
168
+ line-height: 1.6;
169
+ padding: var(--espacio);
170
+ }
171
+
172
+ main {
173
+ max-width: 680px;
174
+ margin: 0 auto;
175
+ padding: var(--espacio);
176
+ }
177
+
178
+ h1 {
179
+ font-size: 2rem;
180
+ font-weight: 700;
181
+ margin-bottom: var(--espacio);
182
+ }
183
+
184
+ .descripcion {
185
+ color: #555;
186
+ margin-bottom: var(--espacio);
187
+ }
188
+
189
+ .boton {
190
+ display: inline-block;
191
+ padding: 0.6rem 1.2rem;
192
+ background: var(--color-primario);
193
+ color: white;
194
+ border: none;
195
+ border-radius: var(--radio);
196
+ font-size: 1rem;
197
+ cursor: pointer;
198
+ text-decoration: none;
199
+ margin: 0.25rem 0;
200
+ }
201
+
202
+ .boton:hover {
203
+
204
+ }
205
+
206
+ .campo-grupo {
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 0.4rem;
210
+ margin-bottom: var(--espacio);
211
+ }
212
+
213
+ label {
214
+ font-weight: 500;
215
+ font-size: 0.9rem;
216
+ }
217
+
218
+ input, textarea {
219
+ padding: 0.6rem 0.8rem;
220
+ border: 1px solid var(--color-borde);
221
+ border-radius: var(--radio);
222
+ font-size: 1rem;
223
+ width: 100%;
224
+ }
225
+
226
+ input:focus, textarea:focus {
227
+ outline: 2px solid var(--color-primario);
228
+ border-color: transparent;
229
+ }
230
+
231
+ .lista {
232
+ margin: var(--espacio) 0;
233
+ }
234
+
235
+ .cargando {
236
+ color: #888;
237
+ font-size: 0.9rem;
238
+ }
239
+
240
+ .error {
241
+ color: var(--color-error);
242
+ font-size: 0.9rem;
243
+ padding: 0.5rem;
244
+ border: 1px solid var(--color-error);
245
+ border-radius: var(--radio);
246
+ margin: 0.5rem 0;
247
+ }
248
+
249
+ .reintentar {
250
+ background: none;
251
+ border: 1px solid var(--color-borde);
252
+ border-radius: var(--radio);
253
+ padding: 0.4rem 0.8rem;
254
+ cursor: pointer;
255
+ font-size: 0.85rem;
256
+ }
257
+
258
+ /* Responsive — optimizar para móvil */
259
+ @media (max-width: 600px) {
260
+ h1 { font-size: 1.5rem; }
261
+ main { padding: 0.5rem; }
262
+ }
263
+ `;
264
+ }
265
+ // --- Helpers ---
266
+ condicionAAtributo(condicion) {
267
+ switch (condicion.tipo) {
268
+ case 'usuario_conectado': return 'usuario-conectado';
269
+ case 'usuario_admin': return 'usuario-admin';
270
+ case 'hay_resultados': return 'hay-resultados';
271
+ case 'campo_mayor': return `${condicion.campo}-mayor-${condicion.valor}`;
272
+ case 'campo_igual': return `${condicion.campo}-igual-${condicion.valor}`;
273
+ default: return 'desconocido';
274
+ }
275
+ }
276
+ extraerTitulo(pagina) {
277
+ const nodo = pagina.hijos.find(h => h.tipo === 'titulo');
278
+ return nodo?.texto ?? null;
279
+ }
280
+ extraerDescripcion(pagina) {
281
+ const nodo = pagina.hijos.find(h => h.tipo === 'descripcion');
282
+ return nodo?.texto ?? null;
283
+ }
284
+ rutaANombre(ruta) {
285
+ if (ruta === '/')
286
+ return 'index.html';
287
+ return ruta.replace(/^\//, '').replace(/\//g, '-') + '.html';
288
+ }
289
+ textoAId(texto) {
290
+ return texto.toLowerCase()
291
+ .replace(/\s+/g, '-')
292
+ .replace(/[^a-z0-9-]/g, '');
293
+ }
294
+ escapar(texto) {
295
+ return texto
296
+ .replace(/&/g, '&amp;')
297
+ .replace(/</g, '&lt;')
298
+ .replace(/>/g, '&gt;')
299
+ .replace(/"/g, '&quot;');
300
+ }
301
+ indentar(texto, espacios) {
302
+ const pad = ' '.repeat(espacios);
303
+ return texto.split('\n').map(l => l ? pad + l : l).join('\n');
304
+ }
305
+ }
306
+ exports.Generador = Generador;
307
+ //# sourceMappingURL=generador.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generador.js","sourceRoot":"","sources":["../src/generador.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ // ---
3
+ // index.ts
4
+ // Punto de entrada del compilador de Telar.
5
+ // Uso: ts-node src/index.ts archivo.telar
6
+ // ---
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const lexer_1 = require("./lexer");
44
+ const parser_1 = require("./parser");
45
+ const generador_1 = require("./generador");
46
+ const tipos_1 = require("./tipos");
47
+ const args = process.argv.slice(2);
48
+ if (args.length === 0) {
49
+ console.log(`
50
+ Telar v0.1 — Compilador
51
+ Uso: ts-node src/index.ts <archivo.telar> [carpeta-salida]
52
+ Ejemplo: ts-node src/index.ts examples/tienda/app.telar dist/
53
+ `);
54
+ process.exit(0);
55
+ }
56
+ const rutaArchivo = args[0];
57
+ const carpetaSalida = args[1] ?? 'dist';
58
+ if (!fs.existsSync(rutaArchivo)) {
59
+ console.error(`\n✗ No se encontró el archivo: ${rutaArchivo}\n`);
60
+ process.exit(1);
61
+ }
62
+ const nombreArchivo = path.basename(rutaArchivo);
63
+ const contenido = fs.readFileSync(rutaArchivo, 'utf-8');
64
+ console.log(`\nTelar — compilando ${nombreArchivo}...\n`);
65
+ try {
66
+ const lexer = new lexer_1.Lexer(contenido);
67
+ const tokens = lexer.tokenizar();
68
+ console.log(`✓ Lexer — ${tokens.length} tokens`);
69
+ const parser = new parser_1.Parser(tokens);
70
+ const arbol = parser.parsear();
71
+ console.log(`✓ Parser — ${arbol.paginas.length} páginas, ${arbol.datos.length} modelos`);
72
+ const generador = new generador_1.Generador(arbol);
73
+ const archivos = generador.generar();
74
+ if (!fs.existsSync(carpetaSalida)) {
75
+ fs.mkdirSync(carpetaSalida, { recursive: true });
76
+ }
77
+ for (const archivo of archivos) {
78
+ const ruta = path.join(carpetaSalida, archivo.nombre);
79
+ fs.writeFileSync(ruta, archivo.contenido, 'utf-8');
80
+ console.log(`✓ Generado — ${ruta}`);
81
+ }
82
+ console.log(`\n✓ Compilación completada — ${archivos.length} archivos en ${carpetaSalida}/\n`);
83
+ }
84
+ catch (error) {
85
+ if (error instanceof tipos_1.TelarError) {
86
+ console.error(error.formatear(nombreArchivo));
87
+ }
88
+ else {
89
+ console.error(error);
90
+ }
91
+ process.exit(1);
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Token } from './tipos';
2
+ export declare class Lexer {
3
+ private texto;
4
+ private posicion;
5
+ private linea;
6
+ private columna;
7
+ private nivelIndentacion;
8
+ constructor(texto: string);
9
+ tokenizar(): Token[];
10
+ private siguienteToken;
11
+ private procesarIndentacion;
12
+ private leerTexto;
13
+ private leerNumero;
14
+ private leerPalabra;
15
+ private actual;
16
+ private avanzar;
17
+ private finArchivo;
18
+ private esDigito;
19
+ private esLetra;
20
+ private crearToken;
21
+ }
22
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAY,MAAM,SAAS,CAAC;AAoD1C,qBAAa,KAAK;IACd,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,gBAAgB,CAAY;gBAExB,KAAK,EAAE,MAAM;IAIzB,SAAS,IAAI,KAAK,EAAE;IAYpB,OAAO,CAAC,cAAc;IA8EtB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,SAAS;IAyBjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,UAAU;CAGrB"}