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ámetroPor defectoDescripción
minsizetotal de todosNúmero mínimo de elementos a seleccionar
maxsizetotal de todosNúmero máximo de elementos a seleccionar
sep" " (espacio)Separador entre elementos no finales
lastsepigual que sepSeparador 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

  • #set y #def deben 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 #set se expanden cuando se referencian, no cuando se definen (evaluación perezosa)
  • #set es una macro: su valor se sustituye de nuevo — y el spintax que contiene se vuelve a resolver — en cada referencia. #def resuelve su valor una vez por renderizado y mantiene ese resultado en todas partes
  • Las líneas #set y #def se 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:

  1. Variables de tiempo de ejecución (más fuerte) — pasadas mediante shortcode: [spintax slug="greeting" name="Alice"]
  2. Variables locales — definidas con #set o #def dentro de la plantilla
  3. 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 declaradafalsy
cadena vacíafalsy
solo espaciosfalsy
"0", "false"truthy (no vacías)
cualquier otro texto o HTMLtruthy

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 separa then de else; los siguientes quedan literales en else
  • 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:

LocaleFormasSe elige por
ru, uk, be, sr, hr, bs31 · 2–4 · 5 en adelante
todas las demás, incl. en2exactamente 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 0 recibe la forma «el resto»
  • Una variable contador debe ser #def, no #set: #set es 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 como plural.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 / #def del 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:

  1. Protege URLs, correos electrónicos, dominios, decimales y abreviaturas de la capitalización
  2. Elimina espacios y tabulaciones duplicados
  3. Elimina espacios antes de signos de puntuación (, . ! ?)
  4. Añade espacio después de signos de puntuación donde falta
  5. Capitaliza la primera letra de la salida (omitiendo etiquetas HTML)
  6. Capitaliza después de signos de puntuación de fin de oración
  7. Capitaliza después de etiquetas HTML de nivel de bloque
  8. Capitaliza después de saltos de línea
  9. Restaura los marcadores protegidos

Resumen de sintaxis

CaracterísticaSintaxisComportamiento
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% = valSustitución reutilizable
Variable (una vez)#def %var% = valSe 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).