Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ CI: `.github/workflows/tests.yml` runs the full suite headless (Playwright + Chr

## Architecture

Everything is in `index.html` (~2475 lines): CSS in `<style>`, HTML markup in `<body>`, and JavaScript in `<script>`. No modules, no bundler.
Everything is in `index.html` (~2510 lines): CSS in `<style>`, HTML markup in `<body>`, and JavaScript in `<script>`. No modules, no bundler.

**Size budget is exhausted** (~97KB of the 100KB hard limit, ~2475 of the ~2500-line ceiling): the v2.x line is in bugfix-only mode. Adding features requires an explicit maintainer decision on the limits.
Current size: ~2510 lines / ~99KB. Limits were raised in v2.11 (June 2026) to **~3000 lines and 120KB hard** — the previous ~2500/100KB budget was exhausted and blocked the search fix.

### Key JavaScript Functions

Expand All @@ -71,7 +71,7 @@ Everything is in `index.html` (~2475 lines): CSS in `<style>`, HTML markup in `<
| `xpathQuery(xml, expr)` | XPath via native `document.evaluate()`; returns string array |
| `diffXML(a, b)` | Semantic diff; returns lines `➕/➖/✏️ /path — detail` (max 1000) |
| `buildTreeHTML(text)` | Read-only collapsible tree view (XML or JSON) using native `<details>` |
| `applySearch()` | Highlights search matches in the highlighted view (max 500) |
| `applySearch()` / `findRanges(text, term)` | Searches the full output text, then maps hits onto the highlighted DOM (a match may span several color spans; max 500) |
| `applyTheme(name)` / `applyURLPreset()` | Visual themes and URL-based config presets |
| `gotoLine()` | Ctrl+G: jump to a specific line in the input editor |
| `loadFile(f)` | Shared file loader for drag & drop and the Open button |
Expand Down Expand Up @@ -110,7 +110,7 @@ CSS custom properties in `:root` control all colors. Dark mode adds the `.dark`

- **Single file:** All product code must stay in `index.html` (`tests.html` is dev-only and not distributed).
- **Zero external dependencies:** No CDN, npm, or third-party code.
- **Size limits:** Max ~2500 lines, max 100KB (hard limit).
- **Size limits:** Max ~3000 lines, max 120KB (hard limit; raised from ~2500/100KB in v2.11).
- **No Web Workers:** Would break the single-file constraint.

## Feature Evaluation
Expand Down
28 changes: 20 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

XMLShield es una herramienta de formateo y minificación de XML que funciona completamente en tu navegador, sin enviar datos a ningún servidor. Diseñada en respuesta a preocupaciones sobre la seguridad de herramientas online, XMLShield te da control total sobre tus archivos XML sensibles.

[![Version](https://img.shields.io/badge/version-2.10-blue.svg)](https://github.com/luisfemojica/xmlshield/releases)
[![Version](https://img.shields.io/badge/version-2.11-blue.svg)](https://github.com/luisfemojica/xmlshield/releases)
[![Tests](https://github.com/luisfemojica/xmlshield/actions/workflows/tests.yml/badge.svg)](https://github.com/luisfemojica/xmlshield/actions/workflows/tests.yml)
[![License](https://img.shields.io/badge/license-Public%20Domain-green.svg)](LICENSE)
[![Live Demo](https://img.shields.io/badge/demo-online-brightgreen.svg)](https://luisfemojica.github.io/xmlshield/)
Expand Down Expand Up @@ -165,7 +165,7 @@ XMLShield está diseñado para:
✅ **Sin telemetría** - No envía datos a ningún servidor
✅ **Sin cookies** - No almacena nada por defecto. Si activas "Recordar config" se guardan tus preferencias (sangría, tema, vista) en `localStorage` de tu navegador — nunca tu XML, nunca se envía a ningún lado, y se borra al desmarcar la casilla
✅ **Sin CDN** - No carga recursos externos que puedan ser comprometidos
✅ **Código auditable** - Todo el código está en un solo archivo visible (~1500 líneas)
✅ **Código auditable** - Todo el código está en un solo archivo visible (~2500 líneas)
✅ **Sin dependencias** - Cero librerías de terceros que puedan tener vulnerabilidades

### Consideraciones
Expand Down Expand Up @@ -198,8 +198,8 @@ Para mantener la simplicidad y auditabilidad:

| Aspecto | Estado Actual v2.3 | Límite Máximo v2.x |
|---------|-------------------|-------------------|
| **Líneas de código** | ~1470 | ~2500 |
| **Tamaño del archivo** | ~50KB | 100KB (límite duro) |
| **Líneas de código** | ~2510 | ~3000 |
| **Tamaño del archivo** | ~99KB | 120KB (límite duro) |
| **Tiempo de auditoría** | ~30 minutos | 45 minutos |
| **Dependencias externas** | 0 | 0 |

Expand Down Expand Up @@ -303,7 +303,13 @@ Refactorización completa con diseño moderno, panel dividido, gradientes, modo
- ✅ Formateo, minificado y resaltado de SQL básico con detección automática
- ✅ Validación ligera (balance de paréntesis/comillas) y descarga `.sql`

**🎉 Roadmap v2.x completado de principio a fin** — ~2474 líneas | ~97KB (límite duro: 100KB) | 106 tests de regresión con CI. **Presupuesto agotado: v2.x queda en modo solo-bugfixes.**
### v2.11 - "Search Fix" ✅ COMPLETADO
**Fecha:** Junio 2026

- ✅ Arreglo de tres bugs de la búsqueda (degradación progresiva, términos que cruzan colores, contadores inconsistentes)
- ✅ Límites ampliados a ~3000 líneas / 120KB por decisión del mantenedor

**🎉 Roadmap v2.x completado de principio a fin** — ~2510 líneas | ~99KB (límite duro: 120KB) | 112 tests de regresión con CI.

### v3.0+ - "XMLShield Extended" 🔮 2027+
**Proyecto separado** con features avanzadas:
Expand Down Expand Up @@ -417,12 +423,18 @@ Para features más avanzadas, considera XMLShield Extended (v3.0+) o herramienta

## 📝 Changelog

### v2.11 - Junio 2026
- 🐛 La búsqueda ya no se degrada: buscar un término y luego otro dejaba de encontrar el primero (faltaba re-unir los nodos de texto al quitar las marcas)
- 🐛 Ahora se pueden buscar frases que cruzan el resaltado de color (`<libro id="1"`), antes daban 0 coincidencias aunque estuvieran visibles
- 🐛 El contador de coincidencias ya coincide entre las vistas Resaltada y Texto
- ✅ Límites del proyecto ampliados a ~3000 líneas / 120KB (decisión del mantenedor)

### v2.10 - Junio 2026
- ✅ Formateo SQL básico: saltos por cláusula, sangría de subconsultas, `BETWEEN...AND` intacto, opción "Mayúsculas (SQL)"
- ✅ Minificado SQL (los comentarios `--` pasan a `/* */`; "Quitar comentarios" también aplica)
- ✅ Resaltado de sintaxis SQL en los 5 temas
- ✅ Detección automática de SQL, validación ligera de balance y descarga `.sql`
- ⚠️ Presupuesto v2.x agotado (~97KB de 100KB): la línea pasa a modo solo-bugfixes
- ⚠️ Presupuesto v2.x agotado (~97KB de 100KB): la línea pasa a modo solo-bugfixes *(revertido en v2.11 al ampliar los límites)*

### v2.9 - Junio 2026
- ✅ Botón "📤 Compartir doc": el documento viaja comprimido (gzip nativo) en el hash del enlace — nunca se envía a ningún servidor
Expand Down Expand Up @@ -537,7 +549,7 @@ Este proyecto valora las contribuciones que mantienen su filosofía de simplicid
- ✅ Mantener compatibilidad con navegadores modernos
- ✅ Documentar cambios en el código
- ✅ Actualizar el Changelog
- ✅ No exceder límites: ~2500 líneas, 100KB (duro)
- ✅ No exceder límites: ~3000 líneas, 120KB (duro)
- ✅ Los tests de `tests.html` deben pasar (servir con `python -m http.server`)

### Reconocimiento
Expand Down Expand Up @@ -582,7 +594,7 @@ Este proyecto está en el **dominio público**. Úsalo libremente para cualquier
## 💡 Preguntas Frecuentes (FAQ)

### ¿Es realmente seguro usar XMLShield con datos sensibles?
**Sí.** Todo el procesamiento ocurre en tu navegador. No se envía ningún dato a servidores externos. Puedes verificarlo auditando el código (son ~1500 líneas en un solo archivo) o monitoreando el tráfico de red (verás cero requests).
**Sí.** Todo el procesamiento ocurre en tu navegador. No se envía ningún dato a servidores externos. Puedes verificarlo auditando el código (son ~2500 líneas en un solo archivo) o monitoreando el tráfico de red (verás cero requests).

### ¿Por qué no usar herramientas online como prettydiff.com o xmlformatter.io?
Esas herramientas envían tu XML a sus servidores. Si trabajas con datos sensibles, regulados o confidenciales, esto puede violar políticas de privacidad o compliance.
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
XMLShield está diseñado con seguridad desde su núcleo:
- 100% local - Sin envío de datos
- Cero dependencias - Sin código de terceros
- Auditable - ~1500 líneas de código visible en un solo archivo
- Auditable - ~2500 líneas de código visible en un solo archivo

## Reportar Vulnerabilidades

Expand Down
4 changes: 2 additions & 2 deletions docs/GUIA_DOCUMENTACION.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Esta carpeta contiene la documentación completa que define el alcance, límites
**Lee este documento si:**
- Quieres entender la filosofía del proyecto
- Tienes una idea de feature y quieres saber si cabe
- Necesitas entender los límites técnicos (~1500 líneas, 100KB, etc.)
- Necesitas entender los límites técnicos (~3000 líneas, 120KB, etc.)
- Vas a contribuir al proyecto

**Secciones clave:**
Expand Down Expand Up @@ -145,7 +145,7 @@ Antes de abrir un PR, verifica:
✅ Verifiqué que no está en ROADMAP.md ya
✅ Seguí las guías de CONTRIBUTING.md
✅ El archivo final es <100KB
✅ El código total es <1500 líneas
✅ El código total es <3000 líneas
✅ No añadí dependencias externas
✅ Funciona 100% offline
✅ Testé en Chrome, Firefox, Safari
Expand Down
56 changes: 51 additions & 5 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

> **Documento vivo** - Se actualiza cada release
> **Última revisión:** Junio 2026
> **Versión actual:** v2.10 — 🎉 Roadmap v2.x COMPLETADO (v2.0 a v2.10) · ⚠️ presupuesto de tamaño agotado: v2.x queda en modo solo-bugfixes
> **Versión actual:** v2.11 — 🎉 Roadmap v2.x COMPLETADO (v2.0 a v2.11) · límites ampliados a ~3000 líneas / 120KB

---

Expand Down Expand Up @@ -464,15 +464,54 @@ Keywords, strings, números y comentarios con las clases de color existentes —
Detección por sentencia inicial (SELECT/INSERT/CREATE/WITH...), validación en vivo ligera (paréntesis y comillas balanceados — **no** hay parser SQL), descarga `.sql`, avisos claros en conversiones que no aplican (XML⇄JSON, CSV, árbol).

#### ⚠️ Nota de cierre
Con v2.10 el presupuesto v2.x queda agotado: ~2474 líneas (techo ~2500) y ~97KB (límite duro 100KB). **La línea v2.x pasa a modo solo-bugfixes**; cualquier feature nueva requiere una decisión explícita del mantenedor sobre los límites.
Con v2.10 el presupuesto v2.x quedó agotado: ~2474 líneas (techo ~2500) y ~97KB (límite duro 100KB), y la línea pasó a modo solo-bugfixes. **Revertido en v2.11**: el mantenedor amplió los límites a ~3000 líneas / 120KB.

#### Métricas Alcanzadas v2.10
- **Tamaño:** ~97KB (límite duro de 100KB)
- **Líneas:** ~2474 (techo de ~2500)
- **Tamaño:** ~97KB (límite duro de entonces: 100KB)
- **Líneas:** ~2474 (techo de entonces: ~2500)
- **Tests:** 106 casos pasando (14 nuevos)

---

### v2.11 - "Search Fix" ✅ COMPLETADO
**Fecha de release:** Junio 2026
**Esfuerzo:** 1 día
**Prioridad:** Alta (bug reportado por el mantenedor)

#### Contexto
El mantenedor reportó que la búsqueda "a veces dejaba de encontrar" cosas. La auditoría encontró **tres bugs encadenados**, todos con la misma raíz: la búsqueda operaba nodo de texto por nodo de texto sobre el DOM ya coloreado.

#### Bugs corregidos

##### 1. Degradación progresiva de la búsqueda 🔴 CRÍTICO
`clearSearchMarks()` reemplazaba cada `<mark>` por un nodo de texto pero **nunca fusionaba los nodos adyacentes** (faltaba `normalize()`). Cada búsqueda fragmentaba el DOM de forma permanente y las siguientes dejaban de encontrar términos que cruzaran esos cortes.

**Reproducción:** buscar `Rayuela` → 1 resultado; buscar `y` (parte el nodo en `Ra|y|uela`); buscar `Rayuela` otra vez → **0 resultados**. Solo se recuperaba re-formateando.

##### 2. Imposible buscar términos que cruzan colores
En la vista Resaltada el texto está partido en `<span>` por color, y la búsqueda solo miraba dentro de cada nodo. `<libro`, `libro id` o `id="1"` daban **0 coincidencias** aunque estuvieran visibles en pantalla.

##### 3. Contadores inconsistentes entre vistas
Consecuencia del anterior: `<libro` daba **0** en vista Resaltada y **2** en vista Texto, sin explicación visible para el usuario.

#### Solución
`applySearch()` ahora **busca sobre el texto completo de la salida y mapea las posiciones al DOM resaltado**:
1. Aplana el DOM a un string, guardando el offset de cada nodo de texto
2. Busca las coincidencias sobre ese texto (`findRanges()`, misma lógica que las vistas Texto/Árbol → contadores idénticos por construcción)
3. Marca cada coincidencia **por trozos**, uno por nodo que toque; todos los trozos comparten índice de coincidencia para la navegación ▲▼

Extras: `normalize()` al limpiar las marcas, y el `outline` de la coincidencia activa se cambió por un `box-shadow` inset — un borde por trozo la partía con líneas verticales.

#### Ampliación de límites
El arreglo no cabía en el presupuesto v2.10. **Decisión del mantenedor:** techo a **~3000 líneas y 120KB duros** (antes ~2500 / 100KB). Se levanta el modo solo-bugfixes.

#### Métricas Alcanzadas v2.11
- **Tamaño:** ~99KB (nuevo límite duro: 120KB)
- **Líneas:** ~2510 (nuevo techo: ~3000)
- **Tests:** 112 casos pasando (6 nuevos, uno por bug + navegación + `findRanges`)

---

## 🔮 Visión Futura (Post v2.6)

### v3.0 - "XMLShield Extended" — ❌ NO-GO (decisión: Junio 2026)
Expand All @@ -481,7 +520,7 @@ Con v2.10 el presupuesto v2.x queda agotado: ~2474 líneas (techo ~2500) y ~97KB

Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fueron promovidas e implementadas en v2.5 y v2.6.

**El desarrollo continúa en la línea v2.x** con mejoras incrementales de pulido, accesibilidad y UX que respeten los límites (~2500 líneas, 100KB duro).
**El desarrollo continúa en la línea v2.x** con mejoras incrementales de pulido, accesibilidad y UX que respeten los límites (~3000 líneas, 120KB duro — ampliados en v2.11).

---

Expand Down Expand Up @@ -567,6 +606,12 @@ Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fuer
- [x] Resaltado SQL en los 5 temas sin CSS nuevo
- [x] Archivo final <100KB y ≤~2500 líneas (~97KB, ~2474 — presupuesto agotado)

### v2.11 Success Criteria
- [x] Buscar el mismo término dos veces sigue encontrándolo (sin degradación)
- [x] Se pueden buscar frases que cruzan el resaltado (`<libro id="1"`)
- [x] El contador coincide entre vista Resaltada y Texto
- [x] Un test de regresión por cada bug corregido

---

## 🚫 Features Descartadas
Expand Down Expand Up @@ -595,6 +640,7 @@ Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fuer
| v2.8 | 100% | 4/4 | ~2177 | ~83KB | ✅ Released |
| v2.9 | 100% | 4/4 | ~2277 | ~88KB | ✅ Released |
| v2.10 | 100% | 4/4 | ~2474 | ~97KB | ✅ Released |
| v2.11 | 100% | 3 bugs | ~2510 | ~99KB | ✅ Released |

---

Expand Down
15 changes: 11 additions & 4 deletions docs/SCOPE.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,12 @@ El soporte JSON de v2.4-v2.7 (validar, formatear, minificar, convertir) se compl

- ✅ **Formateo SQL básico** — tokenizer propio + saltos por cláusula + sangría por paréntesis. Explícitamente **NO** es un parser SQL completo (eso serían miles de líneas): cubre consultas comunes de los dialectos mayores.
- ✅ **Minificado y resaltado SQL**, detección automática por sentencia inicial, validación ligera de balance, descarga `.sql`
- ⚠️ **Cierre de presupuesto**: con v2.10 el archivo queda en ~2474 líneas / ~97KB — al filo de los límites (~2500 / 100KB duro). La línea v2.x pasa a **modo solo-bugfixes**.
- ⚠️ **Cierre de presupuesto**: con v2.10 el archivo quedó en ~2474 líneas / ~97KB — al filo de los límites de entonces (~2500 / 100KB duro), y la línea pasó a modo solo-bugfixes. *Revertido en v2.11: el mantenedor amplió los límites a ~3000 líneas / 120KB.*

#### 🩹 v2.11 (Search Fix) ✅ COMPLETADO
**Estimado:** 1 día | **Complejidad:** Media | **Líneas:** +35

Corrección de tres bugs encadenados en la búsqueda de la salida (ver ROADMAP para el detalle). La búsqueda pasa a operar sobre el texto completo y mapear las posiciones al DOM resaltado.

---

Expand Down Expand Up @@ -232,12 +237,14 @@ El soporte JSON de v2.4-v2.7 (validar, formatear, minificar, convertir) se compl

| Métrica | Límite Actual | Límite v2.x | Límite v3.0+ |
|---------|---------------|-------------|--------------|
| **Líneas totales** | ~1470 | ~2500 máximo | 3000+ |
| **Tamaño archivo** | ~50KB | 100KB máximo (duro) | 150KB+ |
| **Líneas totales** | ~2510 | ~3000 máximo | 3500+ |
| **Tamaño archivo** | ~99KB | 120KB máximo (duro) | 150KB+ |
| **Tiempo auditoría** | 30 min | 45 min máximo | 60+ min |
| **Dependencias externas** | 0 | 0 | 0* |

> **Nota (Junio 2026):** El techo de líneas subió de ~1500 a ~2500 para dar cabida a v2.4-v2.6 (decisión del mantenedor). El límite **duro** sigue siendo el peso: 100KB. El producto distribuible sigue siendo un único `index.html`; `tests.html` es un artefacto de desarrollo que no se distribuye.
> **Nota (Junio 2026):** El techo de líneas subió de ~1500 a ~2500 para dar cabida a v2.4-v2.6 (decisión del mantenedor). El límite **duro** era el peso: 100KB.
>
> **Ampliación (Junio 2026, v2.11):** nueva decisión del mantenedor — el techo pasa a **~3000 líneas y 120KB duros**. Motivo: el arreglo de la búsqueda (v2.11) no cabía en el presupuesto anterior, y el proyecto sigue siendo auditable a este tamaño. Se levanta el "modo solo-bugfixes" declarado en v2.10. El producto distribuible sigue siendo un único `index.html`; `tests.html` es un artefacto de desarrollo que no se distribuye.

*Para v3.0+: Permitido código inline de bibliotecas específicas, pero siempre auditable

Expand Down
Loading
Loading