Referencia de sintaxis Spintax
Referencia completa del marcado de plantillas spintax.
Enumeraciones { }
Selecciona aleatoriamente una opción de la lista.
{option1|option2|option3}
Ejemplos
{blue|grey|clear}
{|free|paid} plan ← empty option = sometimes nothing
{Acme {Pro|Lite}} ← nested enumerations
{order {|#42-A} confirmed} ← nesting with empty option
Reglas
- Delimitadores:
{y} - Separador:
| - Soporta anidamiento a profundidad arbitraria
- Las opciones vacías son válidas (producen cadena vacía)
- La resolución va desde la expresión más interna hacia afuera
Permutaciones [ ]
Selecciona N elementos, los mezcla y los une con separadores.
Permutaciones simples
Todos los elementos incluidos, separados por espacios:
[1|2|3|4]
Ejemplos de salida: 1 4 3 2, 2 3 4 1, 3 2 4 1
Con separador
Separador uniforme especificado en < > al inicio:
[<, > 1|2|3|4]
Ejemplos de salida: 2, 1, 4, 3, 4, 3, 2, 1
Importante: Sin espacio entre [ y <separador>.
Separadores por elemento
Cada opción puede tener su propio separador definido con <sep> antes del | precedente. El separador viaja con su elemento durante la mezcla.
[<, > 1|2|3 < and >|4]
Ejemplos de salida: 1, 3, 2 and 4, 3, 1, 2 and 4
Espaciado automático: Los separadores de palabras como <and> o <or> se rellenan automáticamente con espacios: <and> produce and . Los separadores de puntuación (<,>) no se rellenan.
Permutaciones con combinaciones
Cantidad mínima/máxima de elementos y separadores configurables:
[<minsize=1;maxsize=3;sep=", ";lastsep=" and "> apple|plum|orange|apricot]
Ejemplos de salida: apple, plum and orange, apple and apricot, orange
Parámetros de configuración
| Parámetro | Por defecto | Descripción |
|---|---|---|
minsize | total de todos | Número mínimo de elementos a seleccionar |
maxsize | total de todos | Número máximo de elementos a seleccionar |
sep | " " (espacio) | Separador entre elementos no finales |
lastsep | igual que sep | Separador antes del último elemento |
Reglas de permutación
- Delimitadores:
[y] - El bloque de configuración
<...>debe ir inmediatamente después de[ - Los parámetros de configuración se separan con punto y coma
- Los valores de cadena en la configuración van entre comillas:
sep=", " - Las enumeraciones y permutaciones pueden anidarse dentro de las opciones
- Los elementos HTML pueden ser opciones
Variables %var%
Define una variable reutilizable que se sustituye dondequiera que aparezca.
#set %VARIABLE_NAME% = value or spintax structure
#def %VARIABLE_NAME% = value or spintax structure
Ejemplos
#set %name% = John
#set %greeting% = {Hello|Hi|Hey}
#set %items% = [<minsize=2;maxsize=3;sep=", ";lastsep=" and "> apples|oranges|bananas]
Some text with %name% and %greeting%, also %items%.
/# %greeting% above may differ between the two references — #set re-rolls.
#def picks once and keeps it: #/
#def %tone% = {friendly|warm|upbeat}
A %tone% intro, and a %tone% outro — always the same word.
Reglas de variables
#sety#defdeben estar al inicio de una línea- Los nombres de variables se encierran en
%:%nombre% - Los nombres de variables son alfanuméricos + guion bajo
- Los valores pueden contener cualquier sintaxis spintax (enumeraciones, permutaciones, otras variables)
- Las variables
#setse expanden cuando se referencian, no cuando se definen (evaluación perezosa) #setes una macro: su valor se sustituye de nuevo — y el spintax que contiene se vuelve a resolver — en cada referencia.#defresuelve su valor una vez por renderizado y mantiene ese resultado en todas partes- Las líneas
#sety#defse eliminan de la salida
Ámbitos de variables en el plugin de WordPress
El plugin soporta tres ámbitos de variables. Cuando el mismo nombre existe en múltiples ámbitos, el ámbito más fuerte prevalece:
- Variables de tiempo de ejecución (más fuerte) — pasadas mediante shortcode:
[spintax slug="greeting" name="Alice"] - Variables locales — definidas con
#seto#defdentro de la plantilla - Variables globales (más débil) — definidas en la página de Ajustes
Condicionales {?VAR?then|else}
Los condicionales son la extensión distintiva de spintax.net sobre la familia GTW. Mientras {a|b} elige uno al azar ignorando variables, {?VAR?then|else} elige según si %VAR% tiene un valor.
Úsalo para elecciones impulsadas por valor: mostrar una línea de plan gratuito solo cuando exista, renderizar un bloque de funciones pro solo cuando el usuario tenga un plan de pago, ocultar un CTA que no aplica.
El pre-paso corre antes de la expansión de %var% y antes del selector aleatorio de ramas, así que una rama falsy se descarta por completo — nada en su interior se evalúa.
Formas
{?VAR?then} ← truthy ⇒ then; falsy ⇒ empty
{?VAR?then|else} ← truthy ⇒ then; falsy ⇒ else
{?!VAR?then|else} ← inverted
{?HasFreeTier? — free tier available since %founded%|, trusted since %founded%}
Truthy y falsy
La regla es deliberadamente más simple que en JavaScript — truthy = al menos un carácter no-espacio:
Valor de %VAR% | ¿Truthy? |
|---|---|
| no declarada | falsy |
| cadena vacía | falsy |
| solo espacios | falsy |
"0", "false" | truthy (no vacías) |
| cualquier otro texto o HTML | truthy |
Reglas de los condicionales
- Los nombres de variable siguen la misma regex que
%var%(sin distinguir mayúsculas) - El prefijo
!invierte la comprobación:{?!VAR?ausente} - El primer
|de profundidad 0 separathendeelse; los siguientes quedan literales enelse - Los condicionales anidados se evalúan de fuera hacia dentro — las ramas falsy hacen short-circuit
- La lógica compuesta (
&&,||, comparaciones) no está soportada — calcula una variable guardia en el ensamblador - Las formas malformadas (
{??yes},{?VAR}) nunca lanzan — el playground las marca como advertencias - Profundizar: consulta la guía de spintax condicional con ejemplos y anti-patrones
Plurales {plural %n%: idioma|idiomas}
Elige la forma gramaticalmente correcta de una palabra según un número. El contador va antes de los dos puntos y las formas después, separadas por |.
La forma la decide la locale del render, no la plantilla, así que cuántas formas debes aportar depende de esa locale: el inglés necesita dos, el ruso tres.
{plural %n%: form1|form2} ← 2-form locale (en, de, es…)
{plural %n%: form1|form2|form3} ← 3-form locale (ru, uk, sr…)
#def %LangCount% = 5
supports %LangCount% {plural %LangCount%: language|languages}
← supports 5 languages
Formas por locale
La locale se compara por su subetiqueta de idioma, así que ru-RU y ru se comportan igual:
| Locale | Formas | Se elige por |
|---|---|---|
ru, uk, be, sr, hr, bs | 3 | 1 · 2–4 · 5 en adelante |
todas las demás, incl. en | 2 | exactamente 1 · el resto |
Si el número de formas no coincide, el motor informa plural.arity y deja el bloque visible con llaves de ancho completo: un plural incorrecto nunca sale en silencio.
Reglas de los plurales
- La apertura es literal, incluido el espacio:
{plural.{plural: x}y{pluralN: x}no son bloques plurales - Los dos puntos son obligatorios: separan el contador de las formas
- El contador es una referencia
%Var%o un entero literal; las variables del contador se sustituyen antes de elegir la forma - Los números negativos se toman en valor absoluto; el
0recibe la forma «el resto» - Una variable contador debe ser
#def, no#set:#setes una macro, así que un valor como{1|4|9}sigue siendo spintax sin resolver cuando se decide el plural y el bloque se renderiza vacío. El playground lo marca comoplural.count-macro - Un contador no numérico o indefinido borra el bloque en lugar de adivinar
- Profundizar: consulta la guía de plurales con las reglas rusas de tres formas y ejemplos resueltos
Includes #include
Inserta otra plantilla en la posición de la directiva.
#include "hero-text"
Reglas de include
- La referencia de plantilla va entre comillas dobles
- Se resuelve por slug de plantilla o ID numérico
- Las plantillas incluidas pueden contener sus propias variables y spintax
- Se soportan includes recursivos
- Las referencias circulares se detectan y bloquean
- Las plantillas hijas heredan las variables globales y de tiempo de ejecución, pero no las locales
#set/#defdel padre
Comentarios /#...#/
El texto entre marcadores de comentario se elimina de la salida antes de cualquier otro procesamiento.
/#
This is a comment section.
It can span multiple lines.
It won't appear in output.
#/
Reglas de comentarios
- Delimitador de inicio:
/# - Delimitador de fin:
#/ - Pueden abarcar múltiples líneas
- No pueden anidarse
- Se eliminan antes de cualquier otro procesamiento
Anidamiento
Todos los elementos de sintaxis pueden anidarse entre sí a profundidad arbitraria:
{option1|[<, > sub1|sub2|sub3]|option3}
[<minsize=2;maxsize=3;sep=", ";lastsep=" and "> {red|blue} apples|{big|small} oranges|bananas]
#set %var% = {a|[b|c]}
Post-procesamiento
El motor aplica corrección automática de texto después de la generación:
- Protege URLs, correos electrónicos, dominios, decimales y abreviaturas de la capitalización
- Elimina espacios y tabulaciones duplicados
- Elimina espacios antes de signos de puntuación (
,.!?) - Añade espacio después de signos de puntuación donde falta
- Capitaliza la primera letra de la salida (omitiendo etiquetas HTML)
- Capitaliza después de signos de puntuación de fin de oración
- Capitaliza después de etiquetas HTML de nivel de bloque
- Capitaliza después de saltos de línea
- Restaura los marcadores protegidos
Resumen de sintaxis
| Característica | Sintaxis | Comportamiento |
|---|---|---|
| Enumeración | {a|b|c} | Elige una opción aleatoria |
| Permutación | [a|b|c] | Elige N, mezcla, une |
| Separador | [<sep> a|b|c] | Permutación con separador uniforme |
| Sep por elemento | [<,> a|b <x>|c] | Permutación con separadores personalizados |
| Combinaciones | [<config> a|b|c] | Permutación con cuenta mín/máx |
| Variable | #set %var% = val | Sustitución reutilizable |
| Variable (una vez) | #def %var% = val | Se resuelve una vez por renderizado |
| Condicional | {?VAR?then|else} | then si truthy; else si falsy |
| Plural | {plural %n%: idioma|idiomas} | Concuerda la forma de la palabra con el número, por locale |
| Include | #include "slug" | Inserta otra plantilla |
| Comentario | /#...#/ | Se elimina de la salida |
La sintaxis es compatible con el estándar Generating The Web (GTW).