El encargo cabía en un ticket: la intranet de contenidos de una consultora migraba de un gestor viejo a uno propio y hacía falta una función slugify. Entra un título, sale kebab-case sin acentos, listo para la URL. Diez líneas. Eso dijimos todos.
La primera versión salió casi sola: pasar a minúsculas, normalize("NFD"), quitar los diacríticos con un rango de Unicode, cambiar lo que no sea alfanumérico por guiones, colapsar los guiones repetidos, recortar los de los extremos. Con «Análisis de márgenes» funcionaba perfecto.
El caso que rompe la fiesta
La ñ. NFD la descompone en n + tilde, y el filtro de diacríticos se lleva la tilde por delante. Así que «El año de la reforma» se convertía en un slug que no vas a publicar en la intranet de nadie. Y detrás venía media plantilla de títulos: «Diseño», «Compañía», «Cataluña», «Peñíscola».
La lista de casos raros creció rápido cuando le pasé títulos de verdad al modelo:
- La ç de los apellidos y topónimos catalanes, mismo problema.
- «Nº 3», «I+D», «AT&T», «C++»: símbolos que significan algo y no puedes tirar sin pensarlo.
- Títulos que solo tienen signos y emoji, y acaban produciendo una cadena vacía.
- Dos títulos distintos que colisionan en el mismo slug y hay que desempatar.
Lo caro no era la función
Había cuatrocientas y pico URLs vivas, indexadas y enlazadas desde correos internos. Arreglar el algoritmo significaba cambiar el slug de artículos ya publicados. Es decir: la función buena rompía más de lo que arreglaba.
Así que lo que había que escribir no era una función, sino dos piezas. Un generador nuevo, correcto, para lo que venga. Y un congelador: una tabla de slugs históricos que gana siempre, más un test que la recorre entera y falla si algún título antiguo produce hoy un resultado distinto al que ya está en producción. El desempate de colisiones, además, tenía que ser determinista y no depender del orden de inserción, o el test fallaría un día sí y otro también.
Ese es el matiz que cambió el prompt entero:
No cambies ningún slug de esta lista. Es la especificación, no un ejemplo. Si tu función produce otro, la que está mal es tu función.
Por qué esto se quedó en el portátil
Para probarlo de verdad hay que meterle la lista real. Y la lista real eran títulos sin publicar, nombres de clientes y el calendario editorial de los tres meses siguientes. El código de slugify no le importa a nadie; esos títulos sí. Pegarlos en un chat es enseñar por dónde va la empresa.
Con el modelo corriendo dentro del navegador la pregunta ni se plantea: la tabla de casos, los títulos y la función se quedan en la pestaña. Iteras con los datos buenos, que es la única forma de que salga bien.
Elffuss Code corre el modelo dentro de tu navegador, sobre tu propia GPU: abre una pestaña, pégale tus títulos reales y tu tabla de casos, y escribe la función con los datos de verdad sin subir nada a ningún sitio.
Abrir Code →