xonecode 0.31.0 → 0.33.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.
- package/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-H_kGeZt2.js} +1 -1
- package/apps/web/dist/assets/{index-IptObD2z.css → index-CWBaotdZ.css} +1 -1
- package/apps/web/dist/assets/index-DnGuOvbb.js +499 -0
- package/apps/web/dist/assets/{php-B91ZcS-9.js → php-CMFQiZgk.js} +1 -1
- package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-Dj3BOBHc.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/modelosDeMotor.js +4 -2
- package/dist/agent/config/modelosDeMotor.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +26 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/cajasDeMaqueta.js +130 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js +25 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +84 -3
- package/dist/agent/dispositivos/juezVisual.js.map +1 -1
- package/dist/agent/grafo/criticaVisual.js +240 -11
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/lectorDeReferencias.js +21 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
- package/dist/agent/motores/motoresLocales.js +429 -0
- package/dist/agent/motores/motoresLocales.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +30 -3
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/sesiones/adjuntosDeSesion.js +125 -5
- package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
- package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
- package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js +7 -2
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
- package/dist/agent/subagentes/subagenteOpencode.js +12 -5
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
- package/dist/core/adjuntos.js +10 -2
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/descripcionDePantalla.js +354 -0
- package/dist/core/descripcionDePantalla.js.map +1 -0
- package/dist/core/estiloMedido.js +332 -0
- package/dist/core/estiloMedido.js.map +1 -0
- package/dist/core/geometriaDePantalla.js +437 -0
- package/dist/core/geometriaDePantalla.js.map +1 -0
- package/dist/core/motoresLocales.js +128 -0
- package/dist/core/motoresLocales.js.map +1 -0
- package/dist/core/nucleoXone.js +6 -6
- package/dist/core/nucleoXone.js.map +1 -1
- package/dist/core/settings.js +5 -0
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +13 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/zipDeAdjunto.js +79 -0
- package/dist/core/zipDeAdjunto.js.map +1 -0
- package/dist/web/servidor/arranque.js +84 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/package.json +1 -1
- package/skills/xone-development/SKILL.md +2 -1
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
- package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +81 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
- package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
- package/skills/xone-development/references/indice-completo.md +1 -0
- package/skills/xone-hotswap/lib/geometria.mjs +147 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
- package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
- package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El DESCRIPTOR DE PANTALLA: lo que el modelo ve en UNA imagen —la maqueta o la captura, cada una SOLA— con el
|
|
3
|
+
* MISMO esquema y el MISMO vocabulario cerrado, para que la comparación la haga el CÓDIGO. Puro.
|
|
4
|
+
*
|
|
5
|
+
* Existe por la calculadora de MyAllXOne. El crítico comparaba las dos imágenes a la vez y contestaba en prosa
|
|
6
|
+
* libre: vio el visor roto, pero en la misma lista dijo que el «0» de la maqueta era una píldora ancha y que la
|
|
7
|
+
* «=» era más grande que las demás, las dos cosas falsas, y no había forma de separar lo cierto de lo inventado.
|
|
8
|
+
* La maqueta ya se describía con un esquema; la captura, no. Ahora hablan el mismo idioma.
|
|
9
|
+
*
|
|
10
|
+
* Cuatro reglas:
|
|
11
|
+
*
|
|
12
|
+
* - **Cada imagen se describe SOLA.** Con las dos delante el modelo compara de memoria y lo que ve en una se
|
|
13
|
+
* contagia a la otra.
|
|
14
|
+
* - **En la captura, la ESTRUCTURA la pone el árbol de controles** (`filasDelAparato`): se le dice qué controles
|
|
15
|
+
* existen y en qué fila, y solo describe cómo se ve cada uno. Así no puede inventarse una fila ni un botón.
|
|
16
|
+
* - **Vocabulario CERRADO** (formas, tamaños de letra, alineación, colores en `#RRGGBB`): lo que no está en la
|
|
17
|
+
* lista se tira, no se interpreta.
|
|
18
|
+
* - **La comparación es de CÓDIGO** (`compararDescripciones`), control a control y siempre con la misma frase,
|
|
19
|
+
* agrupada por diferencia: «forma píldora → círculo en «7», «8»…». Un texto RECORTADO se dice siempre.
|
|
20
|
+
*
|
|
21
|
+
* Las filas descritas de una maqueta sin `code.html` se comparan además contra el árbol medido
|
|
22
|
+
* (`compararConMaqueta` en modo `aproximada`, vía `maquetaDeLaDescripcion`).
|
|
23
|
+
*/
|
|
24
|
+
import { textoParaEmparejar } from "./geometriaDePantalla.js";
|
|
25
|
+
export const FORMAS = ["pildora", "redondeada", "recta", "circulo"];
|
|
26
|
+
export const LETRAS = ["pequena", "normal", "grande", "enorme"];
|
|
27
|
+
export const ALINEACIONES = ["izquierda", "centro", "derecha"];
|
|
28
|
+
const TOPE_DE_FILAS = 30;
|
|
29
|
+
const TOPE_POR_FILA = 12;
|
|
30
|
+
const TOPE_DE_UNIDADES = 6;
|
|
31
|
+
const TOPE_DE_EXTRAS = 8;
|
|
32
|
+
const TOPE_DE_EXTRA = 160;
|
|
33
|
+
/**
|
|
34
|
+
* El prompt, el MISMO para la maqueta y para la captura. `controlesQueExisten` (de la captura, del árbol): las
|
|
35
|
+
* filas con sus textos, que el modelo tiene que usar tal cual.
|
|
36
|
+
*/
|
|
37
|
+
export function promptDescribirPantalla(controlesQueExisten) {
|
|
38
|
+
return [
|
|
39
|
+
"Te doy UNA imagen: una pantalla de app móvil. NO la compares con nada: descríbela, en DOS FASES y en este orden.",
|
|
40
|
+
"",
|
|
41
|
+
"FASE 1, GEOMETRÍA. Las filas de controles de ARRIBA ABAJO, cada una con su `zona` (cabecera, visor, teclado…); en",
|
|
42
|
+
"cada fila, los controles de IZQUIERDA A DERECHA, cada uno con:",
|
|
43
|
+
"- `texto`: el texto visible EXACTO (respeta los signos: «÷», «×», «−», «√»). Un icono sin texto, su nombre entre",
|
|
44
|
+
" corchetes: «[borrar]», «[historial]».",
|
|
45
|
+
"- `unidades`: su ancho respecto al control MÁS ESTRECHO de su fila (1, 2, 3…). Si todos miden igual, todos 1.",
|
|
46
|
+
"Un bloque que ocupa la fila entera (un visor, un título) es una fila de un solo elemento.",
|
|
47
|
+
...(controlesQueExisten === undefined || controlesQueExisten.length === 0
|
|
48
|
+
? []
|
|
49
|
+
: [
|
|
50
|
+
"",
|
|
51
|
+
"Estos son los controles que EXISTEN en esta pantalla, fila a fila (medidos, no los adivines): usa ESTAS filas y",
|
|
52
|
+
"ESTOS textos, sin añadir ni quitar. Si uno no se ve en la imagen, ponle `\"noVisible\": true`.",
|
|
53
|
+
...controlesQueExisten.map((f) => ` ${f}`),
|
|
54
|
+
]),
|
|
55
|
+
"",
|
|
56
|
+
"FASE 2, ESTILO. Para CADA control de la fase 1, en el mismo objeto:",
|
|
57
|
+
`- \`forma\`: una de ${FORMAS.join(", ")} (un círculo es tan alto como ancho; una píldora es más ancha que alta con`,
|
|
58
|
+
" los extremos redondos).",
|
|
59
|
+
"- `fondo`: el color de su fondo, como #RRGGBB. `colorTexto`: el color de su texto o icono, como #RRGGBB.",
|
|
60
|
+
`- \`letra\`: el tamaño del texto, uno de ${LETRAS.join(", ")}.`,
|
|
61
|
+
"- `borde`: true si tiene un contorno o una línea visible alrededor.",
|
|
62
|
+
"- `recortado`: true si su texto se ve CORTADO por algún borde (le falta un trozo de las letras).",
|
|
63
|
+
`- \`alineacion\`: dónde va su texto dentro del control, una de ${ALINEACIONES.join(", ")}.`,
|
|
64
|
+
"",
|
|
65
|
+
"Y en `extras`, en frases cortas, lo que SE VE y no es ningún control: cajas vacías, rectángulos con borde, líneas,",
|
|
66
|
+
"marcos. Si no hay nada así, lista vacía.",
|
|
67
|
+
"",
|
|
68
|
+
"Describe SOLO lo que se ve. No inventes controles.",
|
|
69
|
+
"",
|
|
70
|
+
'Contesta SOLO este JSON: {"filas":[{"zona":"teclado","controles":[{"texto":"7","unidades":1,"forma":"circulo","fondo":"#2A2E36","colorTexto":"#FFFFFF","letra":"grande","borde":false,"recortado":false,"alineacion":"centro"}, …]}, …],"extras":["…"]}',
|
|
71
|
+
].join("\n");
|
|
72
|
+
}
|
|
73
|
+
/** La fila de la captura como se le da al modelo: los textos, y un control sin texto por su nombre entre corchetes. */
|
|
74
|
+
export function filasParaElDescriptor(filas) {
|
|
75
|
+
return filas.map((fila, i) => `fila ${i + 1}: ${fila.map((c) => `«${c.texto ?? `[${c.nombre ?? "sin nombre"}]`}»`).join(" ")}`);
|
|
76
|
+
}
|
|
77
|
+
const esTexto = (x) => typeof x === "string" && x.trim() !== "";
|
|
78
|
+
const color = (x) => (typeof x === "string" && /^#[0-9a-fA-F]{6}$/.test(x) ? x.toUpperCase() : undefined);
|
|
79
|
+
const booleano = (x) => (typeof x === "boolean" ? x : undefined);
|
|
80
|
+
function controlVisto(c) {
|
|
81
|
+
if (!esTexto(c["texto"]) || c["noVisible"] === true)
|
|
82
|
+
return undefined;
|
|
83
|
+
const u = c["unidades"];
|
|
84
|
+
const campos = { texto: c["texto"].trim() };
|
|
85
|
+
if (typeof u === "number" && Number.isFinite(u) && u >= 1 && u <= TOPE_DE_UNIDADES)
|
|
86
|
+
campos.unidades = u;
|
|
87
|
+
const forma = FORMAS.find((f) => f === c["forma"]);
|
|
88
|
+
if (forma !== undefined)
|
|
89
|
+
campos.forma = forma;
|
|
90
|
+
const fondo = color(c["fondo"]);
|
|
91
|
+
if (fondo !== undefined)
|
|
92
|
+
campos.fondo = fondo;
|
|
93
|
+
const colorTexto = color(c["colorTexto"]);
|
|
94
|
+
if (colorTexto !== undefined)
|
|
95
|
+
campos.colorTexto = colorTexto;
|
|
96
|
+
const letra = LETRAS.find((l) => l === c["letra"]);
|
|
97
|
+
if (letra !== undefined)
|
|
98
|
+
campos.letra = letra;
|
|
99
|
+
const borde = booleano(c["borde"]);
|
|
100
|
+
if (borde !== undefined)
|
|
101
|
+
campos.borde = borde;
|
|
102
|
+
const recortado = booleano(c["recortado"]);
|
|
103
|
+
if (recortado !== undefined)
|
|
104
|
+
campos.recortado = recortado;
|
|
105
|
+
const alineacion = ALINEACIONES.find((a) => a === c["alineacion"]);
|
|
106
|
+
if (alineacion !== undefined)
|
|
107
|
+
campos.alineacion = alineacion;
|
|
108
|
+
return campos;
|
|
109
|
+
}
|
|
110
|
+
/** La descripción que devolvió el modelo, o `undefined` si no trae al menos una fila. Lo que no encaja se tira. */
|
|
111
|
+
export function interpretarDescripcion(objeto) {
|
|
112
|
+
if (objeto === undefined || !Array.isArray(objeto["filas"]))
|
|
113
|
+
return undefined;
|
|
114
|
+
const filas = objeto["filas"]
|
|
115
|
+
.slice(0, TOPE_DE_FILAS)
|
|
116
|
+
.map((f) => {
|
|
117
|
+
// Se acepta también la fila como lista suelta de controles.
|
|
118
|
+
const fila = Array.isArray(f) ? { controles: f } : typeof f === "object" && f !== null ? f : undefined;
|
|
119
|
+
if (fila === undefined || !Array.isArray(fila["controles"]))
|
|
120
|
+
return undefined;
|
|
121
|
+
const controles = fila["controles"]
|
|
122
|
+
.filter((c) => typeof c === "object" && c !== null)
|
|
123
|
+
.map(controlVisto)
|
|
124
|
+
.filter((c) => c !== undefined)
|
|
125
|
+
.slice(0, TOPE_POR_FILA);
|
|
126
|
+
return controles.length === 0 ? undefined : { ...(esTexto(fila["zona"]) ? { zona: fila["zona"].trim().slice(0, 30) } : {}), controles };
|
|
127
|
+
})
|
|
128
|
+
.filter((f) => f !== undefined);
|
|
129
|
+
if (filas.length === 0)
|
|
130
|
+
return undefined;
|
|
131
|
+
const extras = (Array.isArray(objeto["extras"]) ? objeto["extras"] : [])
|
|
132
|
+
.filter(esTexto)
|
|
133
|
+
.map((e) => (e.length > TOPE_DE_EXTRA ? `${e.slice(0, TOPE_DE_EXTRA - 1)}…` : e.trim()))
|
|
134
|
+
.slice(0, TOPE_DE_EXTRAS);
|
|
135
|
+
return { filas, extras };
|
|
136
|
+
}
|
|
137
|
+
const UNIDAD = 10;
|
|
138
|
+
/**
|
|
139
|
+
* La descripción como cajas de una REJILLA: cada fila a su altura, cada control a lo ancho de sus unidades. Solo
|
|
140
|
+
* sirven para decir fila, orden y ancho relativo (`compararConMaqueta` en modo `aproximada`); un control sin
|
|
141
|
+
* unidades —o todos, con `conAnchos: false`— va marcado `sinAncho`.
|
|
142
|
+
*/
|
|
143
|
+
export function maquetaDeLaDescripcion(d, conAnchos = true) {
|
|
144
|
+
const elementos = [];
|
|
145
|
+
let anchoMaximo = 0;
|
|
146
|
+
d.filas.forEach((fila, f) => {
|
|
147
|
+
let x = 0;
|
|
148
|
+
for (const c of fila.controles) {
|
|
149
|
+
const unidades = c.unidades ?? 1;
|
|
150
|
+
elementos.push({
|
|
151
|
+
texto: c.texto,
|
|
152
|
+
caja: { x, y: f * UNIDAD, ancho: unidades * UNIDAD, alto: UNIDAD * 0.8 },
|
|
153
|
+
...(conAnchos && c.unidades !== undefined ? {} : { sinAncho: true }),
|
|
154
|
+
});
|
|
155
|
+
x += unidades * UNIDAD;
|
|
156
|
+
}
|
|
157
|
+
anchoMaximo = Math.max(anchoMaximo, x);
|
|
158
|
+
});
|
|
159
|
+
return { ancho: Math.max(anchoMaximo, UNIDAD), alto: d.filas.length * UNIDAD, elementos };
|
|
160
|
+
}
|
|
161
|
+
/** La maqueta MEDIDA (las cajas del `code.html`) vista como si fuera un aparato, para compararla con la descrita. */
|
|
162
|
+
export function htmlComoAparato(m) {
|
|
163
|
+
return {
|
|
164
|
+
pantalla: { ancho: m.ancho, alto: m.alto },
|
|
165
|
+
controles: m.elementos.map((e) => ({ ...(textoParaEmparejar(e.texto) === "" ? {} : { texto: e.texto }), caja: e.caja })),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ---------------------------------------------------------------- comparar dos descripciones
|
|
169
|
+
const NOMBRE_DE_FORMA = { pildora: "píldora", redondeada: "redondeada", recta: "recta", circulo: "círculo" };
|
|
170
|
+
const NOMBRE_DE_LETRA = { pequena: "pequeña", normal: "normal", grande: "grande", enorme: "enorme" };
|
|
171
|
+
/**
|
|
172
|
+
* Cuánto se separan dos colores para contarlo: una distancia en RGB. El modelo ESTIMA el color de una imagen y
|
|
173
|
+
* varía de una vez a otra en la misma; por debajo de esto es la misma tinta descrita dos veces.
|
|
174
|
+
*/
|
|
175
|
+
const DISTANCIA_DE_COLOR = 90;
|
|
176
|
+
/** Un color redondeado a pasos de 16 por canal: para AGRUPAR, que «#BDF3FE» y «#BDF4FF» son la misma tinta. */
|
|
177
|
+
const redondo = (h) => `#${[1, 3, 5].map((i) => Math.min(255, Math.round(parseInt(h.slice(i, i + 2), 16) / 16) * 16).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
178
|
+
function distanciaDeColor(a, b) {
|
|
179
|
+
const rgb = (h) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
|
|
180
|
+
const [x, y] = [rgb(a), rgb(b)];
|
|
181
|
+
return Math.sqrt(x.reduce((s, v, i) => s + (v - y[i]) ** 2, 0));
|
|
182
|
+
}
|
|
183
|
+
const ICONO = "\u0000icono";
|
|
184
|
+
/** La clave con que se emparejan: el texto (con sus alias). Todos los iconos comparten clave y se emparejan por cercanía. */
|
|
185
|
+
function clave(c) {
|
|
186
|
+
const t = textoParaEmparejar(c.texto);
|
|
187
|
+
return t !== "" ? t : ICONO;
|
|
188
|
+
}
|
|
189
|
+
/** Hasta dónde se busca pareja a un icono, o a un texto que en la captura dice otra cosa (un DEG que está en RAD). */
|
|
190
|
+
const CERCA = 0.12;
|
|
191
|
+
const MUY_CERCA = 0.06;
|
|
192
|
+
/** Un texto con letras o cifras: en uno solo de signos («−», «.»), la altura de la tinta no es el tamaño de la letra. */
|
|
193
|
+
const conLetras = (t) => /[0-9A-Za-zÁÉÍÓÚáéíóúÑñ]/.test(textoParaEmparejar(t));
|
|
194
|
+
const decimal = (x, d = 1) => x.toFixed(d).replace(".", ",");
|
|
195
|
+
/**
|
|
196
|
+
* Dos formas VECINAS (recta ↔ redondeada ↔ píldora/círculo) con casi la misma proporción, medida en los dos: el radio
|
|
197
|
+
* está en el límite entre dos nombres. Sin cifras (una descripción), no se sabe, y no es menor.
|
|
198
|
+
*/
|
|
199
|
+
function formaVecina(m, a) {
|
|
200
|
+
// Las DOS cifras casi iguales: un cuadrado redondeado de 1,2:1 frente a un círculo de 1,0:1 (radio parecido, otra
|
|
201
|
+
// proporción) es una diferencia que se ve —la de las teclas de la calculadora—, no un límite entre nombres.
|
|
202
|
+
if (m.proporcion === undefined || a.proporcion === undefined || Math.abs(m.proporcion - a.proporcion) > 0.1)
|
|
203
|
+
return false;
|
|
204
|
+
if (m.radio === undefined || a.radio === undefined || Math.abs(m.radio - a.radio) > 0.1)
|
|
205
|
+
return false;
|
|
206
|
+
const nivel = (f) => (f === "recta" ? 0 : f === "redondeada" ? 1 : 2);
|
|
207
|
+
return Math.abs(nivel(m.forma) - nivel(a.forma)) === 1;
|
|
208
|
+
}
|
|
209
|
+
/** El texto de un control en un hallazgo. */
|
|
210
|
+
const nombrar = (c) => `«${c.texto}»`;
|
|
211
|
+
/**
|
|
212
|
+
* La comparación, control a control y con la misma frase siempre. Se empareja por TEXTO en orden de lectura
|
|
213
|
+
* (el segundo «±» de la maqueta con el segundo de la captura). Las diferencias iguales se AGRUPAN: dieciséis
|
|
214
|
+
* teclas que pasan de píldora a círculo son una línea, no dieciséis.
|
|
215
|
+
*/
|
|
216
|
+
export function compararDescripciones(maqueta, captura) {
|
|
217
|
+
/**
|
|
218
|
+
* Cada control con su SITIO: su centro medido si lo trae (fracción de la pantalla), o su fila y columna relativas
|
|
219
|
+
* si viene descrito. Se empareja por TEXTO y, entre los del mismo texto, por cercanía: por texto solo, el «0» del
|
|
220
|
+
* visor de la maqueta se emparejaba con la tecla «0» de la captura.
|
|
221
|
+
*/
|
|
222
|
+
const situar = (d) => d.filas.flatMap((f, i) => f.controles.map((c, j) => ({
|
|
223
|
+
c,
|
|
224
|
+
fila: i,
|
|
225
|
+
y: c.centro?.y ?? (d.filas.length > 1 ? i / (d.filas.length - 1) : 0),
|
|
226
|
+
x: c.centro?.x ?? (f.controles.length > 1 ? j / (f.controles.length - 1) : 0.5),
|
|
227
|
+
})));
|
|
228
|
+
const ms = situar(maqueta);
|
|
229
|
+
const as = situar(captura);
|
|
230
|
+
const lejania = (i, j) => Math.abs(ms[i].y - as[j].y) + Math.abs(ms[i].x - as[j].x) / 4;
|
|
231
|
+
const pareja = new Map();
|
|
232
|
+
const usadas = new Set();
|
|
233
|
+
const emparejar = (candidatas) => {
|
|
234
|
+
for (const { i, j } of candidatas.sort((x, y) => x.d - y.d)) {
|
|
235
|
+
if (pareja.has(i) || usadas.has(j))
|
|
236
|
+
continue;
|
|
237
|
+
pareja.set(i, j);
|
|
238
|
+
usadas.add(j);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
const todas = [];
|
|
242
|
+
ms.forEach((m, i) => as.forEach((a, j) => clave(m.c) === clave(a.c) && todas.push({ i, j, d: lejania(i, j) })));
|
|
243
|
+
emparejar(todas.filter(({ i, d }) => clave(ms[i].c) !== ICONO || d <= CERCA));
|
|
244
|
+
const grupos = new Map();
|
|
245
|
+
const anotar = (que, quien) => grupos.set(que, [...(grupos.get(que) ?? []), nombrar(quien)]);
|
|
246
|
+
const gruposMenores = new Map();
|
|
247
|
+
// La letra se agrupa aparte: la de UN solo control que discrepa es un glifo (el «1» es estrecho y bajo en unas
|
|
248
|
+
// fuentes), no el tamaño de la fuente. Si son varios, es el tamaño.
|
|
249
|
+
const gruposDeLetra = new Map();
|
|
250
|
+
const anotarLetra = (que, quien) => gruposDeLetra.set(que, [...(gruposDeLetra.get(que) ?? []), nombrar(quien)]);
|
|
251
|
+
const anotarMenor = (que, quien) => gruposMenores.set(que, [...(gruposMenores.get(que) ?? []), nombrar(quien)]);
|
|
252
|
+
// Un texto que en la captura dice OTRA cosa en el mismo sitio (un interruptor DEG que está en RAD): no falta. Solo
|
|
253
|
+
// con los dos sitios MEDIDOS: con la fila y la columna de una descripción, el «0» de muestra del visor «estaba en
|
|
254
|
+
// el mismo sitio» que el «12 + 3» de la captura.
|
|
255
|
+
const otroTexto = [];
|
|
256
|
+
ms.forEach((m, i) => {
|
|
257
|
+
if (pareja.has(i) || clave(m.c) === ICONO || m.c.centro === undefined)
|
|
258
|
+
return;
|
|
259
|
+
as.forEach((a, j) => !usadas.has(j) && clave(a.c) !== ICONO && a.c.centro !== undefined && lejania(i, j) <= MUY_CERCA && otroTexto.push({ i, j, d: lejania(i, j) }));
|
|
260
|
+
});
|
|
261
|
+
const antes = new Set(pareja.keys());
|
|
262
|
+
emparejar(otroTexto);
|
|
263
|
+
for (const i of pareja.keys())
|
|
264
|
+
if (!antes.has(i))
|
|
265
|
+
anotar(`dice «${as[pareja.get(i)].c.texto}» donde la maqueta dice`, ms[i].c);
|
|
266
|
+
// Lo que no está solo es noticia si su FILA existe en la captura (algún vecino se emparejó): los datos de ejemplo
|
|
267
|
+
// de un visor («1,240 × 15%…», un «0» de muestra) no tienen por qué estar.
|
|
268
|
+
const filasConPareja = new Set([...pareja.keys()].map((i) => ms[i].fila));
|
|
269
|
+
const faltan = [];
|
|
270
|
+
ms.forEach(({ c: m, fila }, i) => {
|
|
271
|
+
const j = pareja.get(i);
|
|
272
|
+
if (j === undefined) {
|
|
273
|
+
if (filasConPareja.has(fila) && clave(m) !== ICONO)
|
|
274
|
+
faltan.push(nombrar(m));
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const a = as[j].c;
|
|
278
|
+
if (m.forma !== undefined && a.forma !== undefined && m.forma !== a.forma) {
|
|
279
|
+
const cifra = (c) => (c.proporcion === undefined ? "" : ` (${decimal(c.proporcion)}:1)`);
|
|
280
|
+
const que = `forma ${NOMBRE_DE_FORMA[m.forma]}${cifra(m)} → ${NOMBRE_DE_FORMA[a.forma]}${cifra(a)}`;
|
|
281
|
+
if (formaVecina(m, a))
|
|
282
|
+
anotarMenor(que, m);
|
|
283
|
+
else
|
|
284
|
+
anotar(que, m);
|
|
285
|
+
}
|
|
286
|
+
if (conLetras(m.texto)) {
|
|
287
|
+
if (m.alturaDeLetra !== undefined && a.alturaDeLetra !== undefined) {
|
|
288
|
+
const veces = a.alturaDeLetra / m.alturaDeLetra;
|
|
289
|
+
if (veces > 1.3 || veces < 0.77)
|
|
290
|
+
anotarLetra(`letra ${decimal(veces)} veces la de la maqueta`, m);
|
|
291
|
+
}
|
|
292
|
+
else if (m.letra !== undefined && a.letra !== undefined && m.letra !== a.letra) {
|
|
293
|
+
anotar(`letra ${NOMBRE_DE_LETRA[m.letra]} → ${NOMBRE_DE_LETRA[a.letra]}`, m);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (m.borde !== undefined && a.borde !== undefined && m.borde !== a.borde)
|
|
297
|
+
anotar(a.borde ? "lleva un BORDE que la maqueta no tiene" : "le falta el borde de la maqueta", m);
|
|
298
|
+
if (m.alineacion !== undefined && a.alineacion !== undefined && m.alineacion !== a.alineacion)
|
|
299
|
+
anotar(`texto alineado a ${m.alineacion} → a ${a.alineacion}`, m);
|
|
300
|
+
if (m.fondo !== undefined && a.fondo !== undefined && distanciaDeColor(m.fondo, a.fondo) > DISTANCIA_DE_COLOR)
|
|
301
|
+
anotar(`fondo ${redondo(m.fondo)} → ${redondo(a.fondo)}`, m);
|
|
302
|
+
if (m.colorTexto !== undefined && a.colorTexto !== undefined && distanciaDeColor(m.colorTexto, a.colorTexto) > DISTANCIA_DE_COLOR) {
|
|
303
|
+
anotar(`color del texto ${redondo(m.colorTexto)} → ${redondo(a.colorTexto)}`, m);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
// Un BORDE en la captura cuando la maqueta no tiene ninguno: también en lo que no tiene pareja (el visor).
|
|
307
|
+
if (!ms.some(({ c }) => c.borde === true)) {
|
|
308
|
+
as.forEach(({ c }, j) => {
|
|
309
|
+
if (!usadas.has(j) && c.borde === true)
|
|
310
|
+
anotar("lleva un BORDE, y en la maqueta nada lo lleva", c);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
const deLetra = [...gruposDeLetra.values()].reduce((n, q) => n + q.length, 0);
|
|
314
|
+
for (const [que, quienes] of gruposDeLetra)
|
|
315
|
+
(deLetra > 1 ? grupos : gruposMenores).set(que, quienes);
|
|
316
|
+
const lineas = (g) => [...g.entries()].sort((x, y) => y[1].length - x[1].length).map(([que, quienes]) => `${que} en ${quienes.join(", ")}${quienes.length > 3 ? ` (${quienes.length} controles)` : ""}.`);
|
|
317
|
+
const menores = lineas(gruposMenores);
|
|
318
|
+
const diferencias = [...grupos.entries()]
|
|
319
|
+
.sort((x, y) => y[1].length - x[1].length)
|
|
320
|
+
.map(([que, quienes]) => que.endsWith("donde la maqueta dice")
|
|
321
|
+
? `${que.replace(" donde la maqueta dice", "")} donde la maqueta dice ${quienes.join(", ")} (¿un estado distinto?).`
|
|
322
|
+
: `${que} en ${quienes.join(", ")}${quienes.length > 3 ? ` (${quienes.length} controles)` : ""}.`);
|
|
323
|
+
const recortes = as
|
|
324
|
+
.map((x) => x.c)
|
|
325
|
+
.filter((c) => c.recortado === true)
|
|
326
|
+
.map((c) => `${nombrar(c)} se ve RECORTADO (le falta un trozo de las letras).`);
|
|
327
|
+
return { diferencias, faltan, recortes, extras: { maqueta: maqueta.extras, captura: captura.extras }, ...(menores.length === 0 ? {} : { menores }) };
|
|
328
|
+
}
|
|
329
|
+
/** El bloque que ve el agente. `medida`: las dos salen de los píxeles de cada control, no de un modelo. */
|
|
330
|
+
export function informeDeComparacion(c, como = "descrita") {
|
|
331
|
+
const lineas = [
|
|
332
|
+
como === "medida"
|
|
333
|
+
? "COMPARACIÓN CONTROL A CONTROL, MEDIDA en los píxeles de cada control (la caja del árbol en la captura, la del code.html en la maqueta; en cada línea, maqueta → aparato):"
|
|
334
|
+
: "COMPARACIÓN CONTROL A CONTROL (la maqueta y la captura descritas POR SEPARADO, con el mismo esquema; en cada línea, maqueta → aparato):",
|
|
335
|
+
];
|
|
336
|
+
for (const r of c.recortes)
|
|
337
|
+
lineas.push(`- ${r}`);
|
|
338
|
+
if (c.faltan.length > 0)
|
|
339
|
+
lineas.push(`- No los encuentro en la captura: ${c.faltan.join(", ")}.`);
|
|
340
|
+
for (const d of c.diferencias)
|
|
341
|
+
lineas.push(`- ${d}`);
|
|
342
|
+
if (c.extras.captura.length > 0) {
|
|
343
|
+
lineas.push(`- Lo que se ve y no es un control, en la captura: ${c.extras.captura.join("; ")}.` +
|
|
344
|
+
(c.extras.maqueta.length > 0 ? ` En la maqueta: ${c.extras.maqueta.join("; ")}.` : " En la maqueta, nada así."));
|
|
345
|
+
}
|
|
346
|
+
if (lineas.length === 1)
|
|
347
|
+
lineas.push(c.menores === undefined ? "- Nada: cada control se ve como en la maqueta." : "- Nada que arreglar.");
|
|
348
|
+
for (const m of c.menores ?? [])
|
|
349
|
+
lineas.push(`- (menor, no hace falta arreglarlo) ${m}`);
|
|
350
|
+
return lineas;
|
|
351
|
+
}
|
|
352
|
+
/** Hay algo que arreglar según la comparación. */
|
|
353
|
+
export const hayQueArreglar = (c) => c.recortes.length + c.faltan.length + c.diferencias.length > 0;
|
|
354
|
+
//# sourceMappingURL=descripcionDePantalla.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descripcionDePantalla.js","sourceRoot":"","sources":["../../src/core/descripcionDePantalla.ts"],"names":[],"mappings":"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"}
|