Descargar

Textos, números, fechas y documentos

Textos

var t = "¡Programar en español es genial!"
print(t.removeAccents())                 // ¡Programar en espanol es genial!
print(t.slug())                          // programar-en-espanol-es-genial  (para direcciones web y archivos)
print("hola mundo".title())              // Hola Mundo
print("nombre del jugador".camelCase(), "nombre del jugador".snakeCase(), "Nombre Jugador".kebabCase())
print("Una frase muy larga".truncate(10))                 // Una frase…
print("uno dos tres cuatro cinco".wrap(10))               // reparte en líneas de 10
print("gato".distance("pato"), "Hola".similarity("hola"))  // 1 1
print("<b>negrita</b>".between("<b>", "</b>"), "   ".isBlank())
print("  a\n    b".dedent(), "x".indent(2))
print("a-b-c".indexOf("-", 2), chr(241), ord("A"), "Añ".codes())
▶ Probar en el editor

similarity (de 0 a 1) sirve para sugerir "¿quisiste decir...?" comparando lo que escribió el usuario con las opciones válidas.

Números

print((1234567.891).format(2))           // 1.234.567,89  (estilo español)
print((1234567).format(0, ",", "."))     // 1,234,567     (estilo inglés)
print((0.256).toPercent(1))              // 25,6 %
print((2026).toRoman(), (2026).digits(), (7).isOdd(), (15).clamp(0, 10), (5).between(1, 10))
(3).times(i => print("vuelta", i))
print(gcd(12, 18), lcm(4, 6), factorial(5), isPrime(97), primes(20), divisors(12))
print(cbrt(27), trunc(-2.7), fract(3.25), sinh(1), cosh(1), tanh(1))
randomSeed(1)
print(randomGaussian(170, 8))            // estatura aleatoria con distribución normal
print(noise(0.5), noise(0.6))            // ruido de Perlin: cambia suavemente (terrenos, nubes)
▶ Probar en el editor

Fechas

var t = Time.make(2026, 1, 31, 18, 30)
print(Time.format(Time.addDays(t, 1), "%d/%m/%Y"))     // 01/02/2026
print(Time.format(Time.addMonths(t, 1), "%d/%m/%Y"))   // 28/02/2026 (último día de febrero)
print(Time.daysBetween(Time.make(2026, 1, 1), t))      // 30
print(Time.monthName(11), Time.dayName(3), Time.isLeapYear(2028), Time.daysInMonth(2026, 2))
print(Time.parse("2026-11-04 18:30") != null, Time.parse("31/02/2026"))   // true null
print(Time.duration(3725), Time.ago(Time.now() - 300))                    // 1 h 2 min 5 s · hace 5 minutos
print(Time.today() <= Time.now())
▶ Probar en el editor

Plantillas: import template

Rellenan un texto con datos: correos, informes, páginas web...

import template

var t = "Hola, {{nombre}}. Tienes {{mensajes.length}} mensajes:\n{{#each mensajes}}\n- {{asunto}}{{#if @last}} (el último){{/if}}\n{{/each}}"
print(template.render(t, { nombre: "Ana", mensajes: [{ asunto: "Reunión" }, { asunto: "Fotos" }] }))
print(template.renderHtml("<p>{{texto}}</p>", { texto: "<script>" }))   // escapa para HTML
▶ Probar en el editor
Etiqueta
{{nombre}}, {{a.b.c}}, {{lista.length}}un valor (en renderHtml se escapa; {{{x}}} no)
{{#if x}} ... {{else}} ... {{/if}}condición: vacío, 0, false y null son falsos
{{#unless x}} ... {{/unless}}lo contrario
{{#each lista}} ... {{/each}}repite; dentro: {{this}}, {{@index}}, {{@first}}, {{@last}} y los campos de cada elemento. Con un mapa: {{key}} y {{value}}
{{! comentario }}no sale en el resultado

Una línea que solo tiene una etiqueta de bloque no deja una línea en blanco. template.renderFile(ruta, datos) lee la plantilla de un archivo.

Markdown a HTML: import markdown

import markdown

print(markdown.toHtml("# Título\n\nTexto con **negrita**, *cursiva*, `código` y [un enlace](https://ejemplo.es).\n\n- uno\n- dos"))
var pagina = markdown.page("Mi página", "# Hola\n\n| a | b |\n|---|---|\n| 1 | 2 |")
File.write("pagina.html", pagina)        // ábrela con el navegador
▶ Probar en el editor

Admite títulos, párrafos, negrita, cursiva, tachado, código (en línea y bloques con lenguaje), enlaces, imágenes, listas (también numeradas y de tareas [ ]/[x]), citas, tablas y líneas horizontales. markdown.page añade un estilo limpio.

Configuración: import ini

import ini

var ajustes = ini.parse("[pantalla]\nancho = 800\ncompleta = no\n\n[jugador]\nnombre = \"Ana López\"")
print(ajustes.pantalla.ancho + 1, ajustes.pantalla.completa, ajustes.jugador.nombre)
ajustes.jugador.nombre = "Luis"
ini.save("ajustes.ini", ajustes)
print(ini.load("ajustes.ini").jugador.nombre)
▶ Probar en el editor

Los números y sí/no/true/false se convierten solos (ini.parse(texto, false) lo deja todo como texto). Las líneas que empiezan por ; o # son comentarios.

Registro de mensajes: import log

import log

var registro = log.Logger("servidor", "info")      // niveles: debug, info, warn, error
registro.info("Arrancando en el puerto", 8080)
registro.warn("Queda poco espacio")
registro.debug("no se ve: el nivel es info")
var r = registro.time("calcular", () => range(100000).toList().sum())
print(registro.recent().length)
▶ Probar en el editor

Con un tercer argumento (log.Logger("juego", "debug", "registro.txt")) también escribe en un archivo, con fecha. En la consola los niveles salen en colores.

JSON en archivos

JSON.save("partida.json", { nivel: 3, vidas: 2 })    // con sangría, legible
print(JSON.load("partida.json").nivel)
▶ Probar en el editor