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
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ CI: `.github/workflows/tests.yml` runs the full suite headless (Playwright + Chr

## Architecture

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

### Key JavaScript Functions

Expand All @@ -66,6 +66,8 @@ Everything is in `index.html` (~2180 lines): CSS in `<style>`, HTML markup in `<
| `savePrefs()` / `loadPrefs()` | Opt-in config persistence in localStorage (`xmlshield-prefs`) |
| `fmtBytes(n)` | Human-readable sizes for the KPI row (B/KB/MB) |
| `markGutterErrorLine(line)` | Paints the live-validation error line red in the input gutter |
| `gzipB64(text)` / `gunzipB64(b64)` | Native gzip + base64url for the share-by-URL hash (`#doc=`) |
| `loadDocFromHash()` | Loads a shared document from `location.hash` on startup |

### Browser APIs Used

Expand Down
21 changes: 19 additions & 2 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.8-blue.svg)](https://github.com/luisfemojica/xmlshield/releases)
[![Version](https://img.shields.io/badge/version-2.9-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 @@ -39,6 +39,9 @@ XMLShield es una herramienta de formateo y minificación de XML que funciona com
- 📋 **Copiar al portapapeles** como texto o string escapado (JS, Python, Java)
- 🎨 **5 temas visuales** - Claro, Oscuro, Alto Contraste, Solarized y Monokai (+ tema automático según el sistema)
- 🔗 **Presets de configuración vía URL** compartibles
- 📤 **Compartir documento por enlace** - gzip nativo + hash que nunca viaja al servidor
- ♻️ **Reemplazo con regex** - grupos `$1, $2...` en el reemplazo (opcional)
- ♿ **Accesible** - roles ARIA, foco visible por teclado en los 5 temas
- ✓ **Validación en vivo** - Indicador ✓/✗ con línea del error mientras escribes
- ⬆️ **Encadenar operaciones** - Botón "Reusar salida" (formatear → convertir → minificar)
- ⌨️ **Atajos de teclado** para flujo de trabajo rápido (incluye Ctrl+G ir a línea)
Expand Down Expand Up @@ -285,7 +288,15 @@ Refactorización completa con diseño moderno, panel dividido, gradientes, modo
- ✅ Estadísticas para JSON en los KPIs
- ✅ Descarga con extensión correcta (.json/.csv/.txt)

**🎉 Roadmap v2.x completado de principio a fin** — ~2177 líneas | ~83KB (límite duro: 100KB) | 85 tests de regresión con CI.
### v2.9 - "Share & Power Input" ✅ COMPLETADO
**Fecha:** Junio 2026

- ✅ Compartir documento por URL (gzip nativo en el hash, 100% local)
- ✅ Regex con grupos en buscar y reemplazar
- ✅ JSONPath al hacer click en el árbol JSON
- ✅ Accesibilidad: ARIA + foco visible por teclado

**🎉 Roadmap v2.x completado de principio a fin** — ~2277 líneas | ~88KB (límite duro: 100KB) | 92 tests de regresión con CI.

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

## 📝 Changelog

### 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
- ✅ Checkbox "regex" en buscar y reemplazar, con grupos `$1, $2...`
- ✅ Click en una clave del árbol JSON copia su ruta JSONPath (`$.tienda.libros[0]`)
- ✅ Accesibilidad: `role="alert"` en errores, `aria-live` en la validación, `aria-label` en iconos, foco visible por teclado

### v2.8 - Junio 2026
- ✅ Resaltado de sintaxis para JSON: claves, strings, números y booleanos con colores (5 temas)
- ✅ Vista de árbol para JSON: objetos y arrays colapsables con contador de claves/elementos
Expand Down
47 changes: 46 additions & 1 deletion 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.8 — 🎉 Roadmap v2.x COMPLETADO (v2.0 a v2.8)
> **Versión actual:** v2.9 — 🎉 Roadmap v2.x COMPLETADO (v2.0 a v2.9)

---

Expand Down Expand Up @@ -393,6 +393,43 @@ El botón Descargar elegía siempre `.xml`: ahora `.json` para salidas JSON, `.c

---

### v2.9 - "Share & Power Input" ✅ COMPLETADO
**Fecha de release:** Junio 2026
**Esfuerzo:** 3-4 días
**Prioridad:** Media

#### Features Implementadas

##### 1. Compartir documento por URL ✅ IMPLEMENTADO
**Complejidad:** Media | **Líneas:** ~55

Botón "📤 Compartir doc": comprime el documento con `CompressionStream` (**gzip nativo del navegador**, cero dependencias) y lo codifica en base64url dentro del **hash** de la URL — que nunca se envía a ningún servidor: privacidad intacta. Al abrir el enlace, `loadDocFromHash()` descomprime y carga el documento con validación en vivo. Límite ~45KB comprimido; aviso claro en navegadores sin soporte.

##### 2. Regex en buscar y reemplazar ✅ IMPLEMENTADO
**Complejidad:** Baja | **Líneas:** ~25

Checkbox "regex" en la fila de reemplazo: expresiones regulares con grupos `$1, $2...` en el reemplazo, tanto para "Reemplazar" (siguiente desde el cursor) como para "Todo". Regex inválida muestra aviso sin romper.

##### 3. JSONPath en el árbol JSON ✅ IMPLEMENTADO
**Complejidad:** Baja | **Líneas:** ~10

Paridad con el árbol XML: click en una clave copia su ruta JSONPath (`$.tienda.libros[0].titulo`) al portapapeles. Las rutas XML siguen rellenando además el campo XPath (hay motor de consulta); las JSON solo se copian.

##### 4. Accesibilidad ✅ IMPLEMENTADO
**Complejidad:** Baja | **Líneas:** ~15

Primera pasada WCAG: `role="alert"` en errores, `aria-live="polite"` en la validación en vivo, `aria-label` en botones de icono y selects, `aria-hidden` en los gutters decorativos, y **foco visible por teclado** (outline ámbar de 3px) en todos los controles y temas.

#### Descartado en esta versión
- **UI bilingüe ES/EN**: ~100+ strings a tocar con riesgo de regresiones; se reconsiderará como versión propia si el proyecto gana tracción internacional.

#### Métricas Alcanzadas v2.9
- **Tamaño:** ~88KB (dentro del límite duro de 100KB)
- **Líneas:** ~2277 (bajo el techo de ~2500)
- **Tests:** 92 casos pasando (7 nuevos)

---

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

### v3.0 - "XMLShield Extended" — ❌ NO-GO (decisión: Junio 2026)
Expand Down Expand Up @@ -420,6 +457,7 @@ Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fuer
│ │ v2.6 ✅ │ │ │
│ │ v2.7 ✅ │ │ │
│ │ v2.8 ✅ │ │ │
│ │ v2.9 ✅ │ │ │
└──────────┴──────────┴──────────┴──────────┘
```

Expand Down Expand Up @@ -473,6 +511,12 @@ Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fuer
- [x] KPIs de estadísticas pobladas también para JSON
- [x] Descargar produce .json/.csv/.txt según el tipo real de la salida

### v2.9 Success Criteria
- [x] Enlace compartido restaura el documento exacto (roundtrip con unicode verificado)
- [x] El hash nunca viaja al servidor (compresión y descompresión 100% locales)
- [x] Regex con grupos $1/$2 funcional en Reemplazar y Todo; inválidas no rompen
- [x] Roles ARIA en estados dinámicos y foco visible por teclado en los 5 temas

---

## 🚫 Features Descartadas
Expand All @@ -499,6 +543,7 @@ Las dos features de v3.0 que sí cabían en la filosofía (XPath y Diff) ya fuer
| v2.6 | 100% | 1/1 | ~1955 | ~72KB | ✅ Released |
| v2.7 | 100% | 11/11 | ~2100 | ~80KB | ✅ Released |
| v2.8 | 100% | 4/4 | ~2177 | ~83KB | ✅ Released |
| v2.9 | 100% | 4/4 | ~2277 | ~88KB | ✅ Released |

---

Expand Down
9 changes: 9 additions & 0 deletions docs/SCOPE.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,15 @@ El soporte JSON de v2.4-v2.7 (validar, formatear, minificar, convertir) se compl
- ✅ **Estadísticas para JSON** en los KPIs existentes
- ✅ **Descarga con extensión correcta** (.json/.csv/.txt según la salida)

#### 🟡 v2.9 (Share & Power Input) ✅ COMPLETADO
**Estimado:** 3-4 días | **Complejidad:** Media | **Líneas:** +105

- ✅ **Compartir documento por URL** — `CompressionStream` (gzip **nativo** del navegador, 4/4 en el Test de 4 Preguntas) + base64url en el hash, que nunca se envía al servidor. Límite ~45KB comprimido.
- ✅ **Regex en buscar y reemplazar** con grupos `$1, $2...`
- ✅ **JSONPath en el árbol JSON** (click en clave → portapapeles)
- ✅ **Accesibilidad WCAG (primera pasada)**: ARIA en estados dinámicos, foco visible por teclado
- ❌ **UI bilingüe ES/EN**: descartada por ahora (~100+ strings, riesgo de regresiones); se reconsiderará si el proyecto gana tracción internacional

---

## ❌ Fuera del Alcance (v2.x)
Expand Down
Loading
Loading