Normalizar indentación de texto
Las líneas con 2, 4 y 6 espacios se leen como niveles 1, 2 y 3 de una unidad de 2 espacios, y cada línea se reescribe para ajustarse exactamente a ella. Lo que va después de la sangría no se toca. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Texto
- def foo(): if True: bar() baz() return
- Entrada
- def foo(): if True: bar() baz() return
- Estilo de sangría
- spaces
- Unidad de sangría
- 2
- Unidad detectada
- 2
Los espacios en blanco iniciales inconsistentes son uno de los dolores de cabeza más habituales al pegar código en revisiones, volcados de configuración y bloques de documentación. Un fragmento puede mezclar pasos de dos y cuatro espacios o, peor aún, tabuladores en unas líneas y espacios en otras, hasta que un linter o un compañero rechaza el archivo. Este normalizador de indentación de texto acepta texto plano multilínea, clasifica cada línea no vacía según cómo está escrita su indentación inicial, detecta una única unidad base —el máximo común divisor de los recuentos de espacios, o un tabulador— y reescribe cada línea para que la indentación sea un múltiplo exacto de esa unidad.
Cómo funcionan la detección de la unidad base y la reescritura de niveles
El algoritmo primero normaliza los finales de línea Windows CRLF y CR heredados a una única forma LF, y después divide el documento en líneas. Las líneas totalmente en blanco permanecen en blanco y no aportan estilo de indentación. Para cada línea no vacía se mide la racha inicial de espacios y tabuladores: si ambos caracteres aparecen en esa racha, o si aparece otro espacio en blanco Unicode, la línea se trata como mixta y toda la solicitud falla con un mensaje claro que indica el número de línea.
Si algunas líneas no vacías están indentadas con espacios y otras con tabuladores, el documento no tiene un único estilo claro y también se rechaza: la conversión debe ser deliberada, no adivinada. Cuando toda línea indentada usa espacios, la unidad base es el máximo común divisor de todos los recuentos positivos de espacios iniciales; si nada está indentado, la unidad por defecto para el informe es de dos espacios. Cuando toda línea indentada usa tabuladores, la unidad base es un tabulador y cada tabulador inicial cuenta como un nivel.
El nivel de cada línea se recalcula entonces como recuento dividido por la unidad (exacto para el MCD de los recuentos de espacios observados, recuentos enteros de tabuladores en modo tab), y la línea se reescribe con un prefijo puro de espacios repetidos de longitud nivel por unidad de salida, o de tabuladores repetidos de longitud nivel. El contenido tras la indentación inicial nunca se altera: espacios interiores, espacios finales y tokens de código permanecen idénticos byte a byte.
Qué puede hacer con ella
Limpiar código y configuración pegados antes del commit
Los desarrolladores pegan fragmentos con pasos mezclados de dos y cuatro espacios; la herramienta reescribe cada línea a una unidad base y reporta la profundidad máxima de indentación para revisión.
Preguntas frecuentes
¿Cómo elige la herramienta la unidad base de indentación?
En líneas indentadas con espacios usa el máximo común divisor de todos los recuentos positivos de espacios iniciales (unidad de informe por defecto dos si nada está indentado). En líneas con tabuladores la unidad es un tabulador por nivel.
¿Qué ocurre si unas líneas usan tabuladores y otras espacios?
Una mezcla a nivel de documento de tabuladores y espacios no tiene un patrón único claro; convierta primero a un solo estilo y luego normalice.
¿Puedo convertir indentación de dos espacios a cuatro espacios?
Se conservan los niveles detectados y cada nivel se reescribe con cuatro espacios.
¿La normalización cambia el código dentro de una línea?
No. Solo se reescribe la racha de indentación inicial. El espaciado interior, los espacios finales y todos los caracteres que no son indentación permanecen sin cambios.
¿Qué pasa con las líneas en blanco y los saltos de línea de Windows?
Las líneas totalmente en blanco siguen en blanco y no cuentan al detectar el estilo de sangría. Los saltos de línea de Windows y de formatos antiguos se unifican en uno solo antes de medir, así que nunca provocan un desajuste.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/text/text-indentation-normalize \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"def foo():\n if True:\n bar()\n baz()"}'const res = await fetch("https://api.kit.forhosting.com/text/text-indentation-normalize", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "def foo():\n if True:\n bar()\n baz()"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/text-indentation-normalize",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "def foo():\n if True:\n bar()\n baz()"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/text-indentation-normalize", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"def foo():\\n if True:\\n bar()\\n baz()"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"def foo():\n if True:\n bar()\n baz()"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/text-indentation-normalize", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"text": "def foo():\n if True:\n bar()\n baz()"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.text_indentation_normalize",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_tokens | 20000 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Cuando la misma línea o el documento completo mezcla tabuladores y espacios sin un patrón claro, la tarea falla con invalid_input en lugar de adivinar en silencio. El parámetro opcional target_unit le permite reescalar niveles basados en espacios (por ejemplo de dos a cuatro) sin cambiar el árbol lógico de profundidad.
Cómo funcionan la detección de la unidad base y la reescritura de niveles
El target_unit opcional solo se aplica a documentos con estilo de espacios: se conservan los niveles y la salida usa esa cantidad de espacios por nivel, que es cómo convierte un árbol de dos espacios en uno de cuatro en una sola llamada. La entrada con estilo de tabuladores ignora target_unit para no expandir tabuladores en silencio.
Contrato de entrada, campos de respuesta y comportamiento de error
Prefiera enviar el cuerpo multilínea en bruto en lugar de colapsar saltos de línea de antemano cuando quiera semántica real de indentación por línea; una sola línea larga solo tiene una indentación que normalizar. Envíe por POST un cuerpo JSON con un campo de cadena obligatorio text (alias input, value, string, s, content y body). El valor debe ser una cadena no vacía tras recortar el espacio en blanco global y no debe superar cien mil caracteres, para que un solo pegado no agote la memoria del Worker o del navegador. El target_unit opcional es un entero positivo de uno a treinta y dos; los no enteros y los valores fuera de rango fallan la validación. En caso de éxito la respuesta devuelve input como la cadena original, text como el resultado multilínea reescrito unido con LF, indent_style como spaces, tabs o none, indent_unit como el tamaño efectivo de la unidad de salida, detected_unit como la unidad inferida antes de cualquier override de destino, line_count como el número de líneas incluidas las en blanco, indented_lines como cuántas líneas tenían un nivel positivo, max_level como el nivel de indentación más profundo, levels como la matriz de profundidad entera por línea alineada con lines, lines como la matriz ordenada de cadenas de línea reescritas, y message como un resumen breve del estilo, la unidad, el recuento de líneas y el nivel máximo. La validación fallida —text ausente, valores que no son cadena, contenido vacío, carga excesiva, target_unit inválido, mezcla de tabulador y espacio en la misma línea, o mezcla de estilos a nivel de documento— devuelve invalid_input y nunca se cobra. El precio es un fijo de $0.002 por solicitud exitosa con unidad item. Al integrar, afirme sobre text o lines para el contenido limpio, compare opcionalmente levels e indent_unit en regresiones, y trate invalid_input como un conflicto de estilo del cliente en pegados mixtos, no como un evento de facturación.
Cuándo usar esta herramienta y en qué se diferencia de búsquedas afines
Use esta capacidad cuando la intención de búsqueda sea normalizar niveles de indentación de texto, corregir indentación inconsistente en línea, convertir un pegado irregular de dos y cuatro espacios a una sola unidad, o detectar estilo de indentación por tabulador frente a espacio antes de un commit. Tenga en cuenta los espacios finales y las columnas de alineación interiores: esta herramienta solo reescribe la racha de indentación inicial, no los espacios de alineación dentro de la línea. No es un formateador de código completo, ni un pretty printer consciente del lenguaje, ni un eliminador de líneas en blanco, ni un String.trim global que destruiría la estructura intencional. Las comprobaciones de ida y vuelta en pruebas son sencillas: envíe un bloque de tres líneas con cero, dos y cuatro espacios iniciales y espere indent_unit dos con levels cero, uno y dos; envíe bloques anidados indentados solo con tabuladores y espere indent_style tabs con niveles enteros que coincidan con el recuento de tabuladores; envíe deliberadamente una línea que empiece con tabulador y luego espacios, o una línea con tabulador junto a otra con espacios, y confirme invalid_input mencionando la mezcla de tabuladores y espacios. Prefiera str.trim_lines cuando solo necesite quitar espacios al inicio y al final de cada línea sin conservar un árbol de profundidad; prefiera data.json_format cuando la carga sea JSON que deba imprimirse con indentación fija; prefiera esta capacidad cuando ya exista texto jerárquico plano o bloques similares a código y necesite una unidad base coherente. Las tareas fallidas que devuelven invalid_input no consumen saldo prepago, lo que mantiene barata la validación de formularios y las pruebas negativas de CI.
Casos de integración
Preprocesadores de CI y linters
Las tuberías rechazan pronto tabuladores y espacios mezclados con invalid_input, o normalizan árboles solo de espacios a un target_unit del proyecto antes de las comprobaciones de estilo.
Documentación, tutoriales y fixtures de ejercicios
Autores y docentes generan ejemplos multilínea indentados de referencia y casos de error de estilo mixto para editores, herramientas LMS y pruebas golden.
Preguntas técnicas
¿Cuánto cuesta normalizar la indentación de texto?
La herramienta en el navegador es gratuita. Las solicitudes API usan saldo KIT prepago a $0.002 por llamada exitosa; la entrada inválida no se factura.