Spintax-syntaxreferentie
Volledige referentie voor spintax-sjabloonmarkup.
Enumeraties { }
Selecteert willekeurig één optie uit de lijst.
{option1|option2|option3}
Voorbeelden
{blue|grey|clear}
{|free|paid} plan ← empty option = sometimes nothing
{Acme {Pro|Lite}} ← nested enumerations
{order {|#42-A} confirmed} ← nesting with empty option
Regels
- Scheidingstekens:
{en} - Separator:
| - Ondersteunt nesting tot willekeurige diepte
- Lege opties zijn geldig (produceren lege string)
- Resolutie gaat van de binnenste expressie naar buiten
Permutaties [ ]
Selecteert N elementen, schudt ze en voegt ze samen met scheidingstekens.
Eenvoudige permutaties
Alle elementen opgenomen, gescheiden door spaties:
[1|2|3|4]
Uitvoervoorbeelden: 1 4 3 2, 2 3 4 1, 3 2 4 1
Met scheidingsteken
Uniform scheidingsteken opgegeven in < > aan het begin:
[<, > 1|2|3|4]
Uitvoervoorbeelden: 2, 1, 4, 3 · 4, 3, 2, 1
Belangrijk: Geen spatie tussen [ en <scheidingsteken>.
Scheidingstekens per element
Elke optie kan een eigen scheidingsteken hebben, gedefinieerd met <sep> vóór de voorgaande |. Het scheidingsteken verplaatst zich mee met het element bij het schudden.
[<, > 1|2|3 < and >|4]
Uitvoervoorbeelden: 1, 3, 2 and 4 · 3, 1, 2 and 4
Auto-spatiëring: Woord-scheidingstekens zoals <and> of <or> worden automatisch met spaties aangevuld: <and> resulteert in and . Leesteken-scheidingstekens (<,>) worden niet aangevuld.
Permutaties met combinaties
Configureerbaar minimum/maximum aantal elementen en scheidingstekens:
[<minsize=1;maxsize=3;sep=", ";lastsep=" and "> apple|plum|orange|apricot]
Uitvoervoorbeelden: apple, plum and orange · apple and apricot · orange
Configuratieparameters
| Parameter | Standaard | Beschrijving |
|---|---|---|
minsize | aantal van alle | Minimum aantal te selecteren elementen |
maxsize | aantal van alle | Maximum aantal te selecteren elementen |
sep | " " (spatie) | Scheidingsteken tussen niet-laatste items |
lastsep | gelijk aan sep | Scheidingsteken vóór het laatste element |
Permutatieregels
- Scheidingstekens:
[en] - Configuratieblok
<...>moet direct na[volgen - Configuratieparameters worden gescheiden door puntkomma's
- Tekenreekswaarden in configuratie staan tussen aanhalingstekens:
sep=", " - Enumeraties en permutaties kunnen genest worden binnen opties
- HTML-elementen kunnen opties zijn
sepverbindt alles vóór het laatste paar,lastsepdat paar zelf: bij twee gekozen items verschijnt alleenlastsep, bij één geen van beide
Variabelen %var%
Definieert een herbruikbare variabele die wordt ingevuld waar ze ook voorkomt. Twee directives declareren er een, en de keuze is niet cosmetisch: #set is een macro — de waarde wordt bij elke verwijzing opnieuw ingevuld, dus de spintax erin wordt opnieuw gerold; #def rolt de waarde eenmaal per rendering en geeft dat ene resultaat aan elke verwijzing. (Eén rendering is één uitvoer; dezelfde seed reproduceert die.) Zolang de waarde platte tekst is zijn ze identiek; het verschil verschijnt zodra de waarde een keuze bevat.
#set %VARIABLE_NAME% = value or spintax structure
#def %VARIABLE_NAME% = value or spintax structure
Voorbeelden
#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%.
And once more, %greeting% — a second reference.
/# %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.
Variabelenregels
#seten#defmoeten aan het begin van een regel staan- Variabelenamen staan tussen
%:%name% - Namen zijn alfanumeriek + underscore, en verwijzingen zijn hoofdletterongevoelig:
%Tone%en%tone%zijn één variabele - Waarden mogen elke spintax-syntaxis bevatten (opsommingen, permutaties, andere variabelen)
#setis een macro: hij wordt uitgeklapt bij de verwijzing, niet bij de definitie, en zijn waarde — inclusief de spintax erin — wordt bij elke verwijzing opnieuw ingevuld en opnieuw gerold#deflost zijn waarde eenmaal per rendering op en houdt dat resultaat overal vast. Dat is wat herhalingen congruent houdt: een zelfstandig naamwoord en de vormen die eruit worden gebouwd, een telling voor een{plural}-blok, elke zin waarvan de herhalingen woord voor woord moeten kloppen#defmaakt één variabele consistent met zichzelf; het correleert geen twee variabelen.#def %Noun%en#def %NounGen%zijn twee onafhankelijke worpen en kunnen op verschillende woorden landen — vormen die moeten overeenkomen, moeten uit één worp komen: één#def-stam waarnaar elke vorm verwijst, of synoniemen die gelijk verbuigen met de uitgang buiten de definitie- Een naam wordt eenmaal gedefinieerd. Een tweede definitie van dezelfde naam wordt gemeld als
definition.duplicate-nameen de rendering gaat toch door: tussen twee gelijke directives wint de latere, en delen een#seten een#defeen naam, dan wint de#def— welke er ook eerst stond - Een verwijzing zonder definitie print zichzelf:
%missing%blijft in de uitvoer staan in plaats van te verdwijnen - Geen van beide directives steekt een
#includeover: het ingevoegde sjabloon ziet de lokale variabelen van de ouder niet, en de eigen lekken niet terug. Een gerolde vorm bereikt het kind alleen als runtime-variabele #set- en#def-regels worden uit de uitvoer verwijderd- Verdieping: zie de variabelengids (scopes en de reroll-valkuil) en de grammaticaal veilige synonimisering (naamvalfamilies)
Scopes van variabelen
Een host kan variabelen uit meerdere plaatsen aanleveren. Bestaat dezelfde naam op meerdere plekken, dan wint de sterkste:
- Runtime-variabelen (sterkst) — wat de host aan de render-aanroep meegeeft:
contextin@spintax/core, shortcode-attributen in de WordPress-plugin:[spintax slug="greeting" name="Alice"] - Lokale variabelen — gedefinieerd met
#setof#defin het sjabloon - Globale variabelen (zwakst) — host-brede standaarden, zoals de instellingenpagina van de plugin
Voorwaarden {?VAR?then|else}
Voorwaarden zijn een eigen constructie van de taal — in het GTW-prototype bestond niets vergelijkbaars. Waar {a|b} een uniforme willekeurige keuze is die variabelen negeert, kiest {?VAR?then|else} op basis van of %VAR% een waarde heeft.
Gebruik het voor waarde-gestuurde keuzes: een free-tier-regel alleen tonen als er een free tier is, een pro-features-blok alleen renderen wanneer de gebruiker een betaald plan heeft, een niet-toepasselijke CTA verbergen.
De pre-pass loopt vóór %var%-uitbreiding en vóór de willekeurige tak-kiezer, dus een falsy-tak wordt volledig verworpen — niets erbinnen wordt geëvalueerd.
Vormen
{?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 en falsy
De regel is bewust eenvoudiger dan in JavaScript — truthy = minstens één niet-witruimte-teken:
Waarde van %VAR% | Truthy? |
|---|---|
| niet gedeclareerd | falsy |
| lege string | falsy |
| alleen witruimte | falsy |
"0", "false" | truthy (niet leeg) |
| elke andere tekst of HTML | truthy |
Regels voor voorwaarden
- Variabelennamen volgen dezelfde regex als
%var%(hoofdletterongevoelig) - Het
!-prefix keert de controle om:{?!VAR?afwezig} - De eerste
|op diepte 0 scheidtthenvanelse; volgende blijven letterlijk inelse - Geneste voorwaarden worden van buiten naar binnen geëvalueerd — falsy-takken kortsluiten
- Samengestelde logica (
&&,||, vergelijkingen) wordt niet ondersteund — bereken een guard-variabele in de assembler - Misvormde vormen (
{??yes},{?VAR}) gooien nooit — het playground markeert ze als waarschuwingen - Verdieping: zie de conditional-spintax-gids met voorbeelden en anti-patronen
Meervouden {plural %n%: taal|talen}
Kiest de grammaticaal juiste woordvorm bij een getal. De teller staat vóór de dubbele punt, de vormen erna, gescheiden door |.
De vorm wordt bepaald door de render-locale, niet door het sjabloon — hoeveel vormen je moet aanleveren hangt dus van die locale af. Engels vraagt er twee, Russisch drie.
{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
Vormen per locale
De locale wordt vergeleken op zijn taalsubtag, dus ru-RU en ru gedragen zich identiek:
| Locale | Vormen | Gekozen op |
|---|---|---|
ru, uk, be, sr, hr, bs | 3 | 1 · 2–4 · 5 en hoger |
alle overige, incl. en | 2 | precies 1 · al het overige |
Klopt het aantal vormen niet, dan meldt de engine plural.arity en laat het blok zichtbaar staan met volle-breedte accolades — een fout meervoud gaat nooit stilletjes live.
Meervoudsregels
- De opening is letterlijk, inclusief de spatie:
{plural.{plural: x}en{pluralN: x}zijn geen meervoudsblokken - De dubbele punt is verplicht — die scheidt de teller van de vormen
- De teller is een
%Var%-verwijzing of een letterlijk geheel getal; variabelen in de teller worden vervangen vóór de vormkeuze - Negatieve getallen tellen als absolute waarde;
0krijgt de vorm "al het overige" - Een tellervariabele moet
#defzijn, geen#set—#setis een macro, dus een waarde als{1|4|9}is nog onopgeloste spintax op het moment van de keuze en het blok rendert leeg. De playground markeert dit alsplural.count-macro - Een niet-numerieke of ongedefinieerde teller wist het blok in plaats van te gokken
- Verdieping: zie de meervouden-gids met de Russische drievormregels en uitgewerkte voorbeelden
Includes #include
Voegt een ander sjabloon in op de plek van de directive. #include is de enige constructie die de engine niet zelf kan afhandelen: hij bewaart geen sjablonen, dus levert de host een resolver die een verwijzing omzet in sjabloontekst. Waar geen resolver is geïnstalleerd — de playground en de MCP-server op deze site, beide met opzet — is de directive inert en blijft ze als letterlijke tekst in de uitvoer staan.
#include "hero-text"
/# wrong: text before the directive on the same line leaves it literal #/
Intro: #include "hero-text"
Include-regels
- De directive moet de hele regel beslaan. Inspringen mag; tekst na de verwijzing niet —
Tekst #include "hero"blijft letterlijk - De verwijzing staat tussen dubbele aanhalingstekens; met enkele of zonder aanhalingstekens is het de directive niet meer
- Het oplossen is aan de host: de WordPress-plugin zoekt op slug of numeriek ID, een JavaScript-host geeft een
includeResolvermee - Zonder resolver blijft de regel letterlijk in de uitvoer; kent de resolver het sjabloon niet, dan wordt de regel juist verwijderd — een onbekend doel kost je het blok in stilte
- Ingevoegde sjablonen mogen eigen variabelen en spintax bevatten, en eigen
#include - Includes worden opgelost nadat de opsommingen en permutaties van de ouder zijn gerold: een include in de winnende tak wordt ingevoegd — een in een afgevallen tak gebeurt nooit
- Ketens werken (een sjabloon voegt een sjabloon in dat er weer een invoegt); een sjabloon dat zichzelf invoegt, direct of via een cyclus, wordt bij de eerste herhaling afgekapt — zonder fout en zonder diagnose
- Kindsjablonen erven globale en runtime-variabelen, maar niet de lokale
#set/#defvan de ouder, en de hunne lekken niet terug - Een include kan niet de waarde van een definitie zijn:
#def %x% = #include "y"wordt geweigerd alsdef.include-in-value - Vóór het renderen meldt
validate()een onbekend doel alleen als de host de lijst met bekende verwijzingen meegeeft;extract()geeft de verwijzingen terug die een sjabloon nodig heeft — zo laadt een host ze vooraf - Verdieping: zie de gids voor sjablooncompositie, het assembler-patroon dat de meeste pipelines in plaats hiervan gebruiken
Opmerkingen /#...#/
Tekst tussen opmerkingenmarkeringen wordt uit de uitvoer verwijderd vóór enige andere verwerking.
/#
This is a comment section.
It can span multiple lines.
It won't appear in output.
#/
Opmerkingenregels
- Beginscheidingsteken:
/# - Eindscheidingsteken:
#/ - Kunnen meerdere regels beslaan
- Kunnen niet genest worden
- Verwijderd vóór enige andere verwerking
Nesting
Alle syntaxiselementen kunnen in willekeurige diepte in elkaar genest worden:
{option1|[<, > sub1|sub2|sub3]|option3}
[<minsize=2;maxsize=3;sep=", ";lastsep=" and "> {red|blue} apples|{big|small} oranges|bananas]
#set %var% = {a|[b|c]}
Nabewerking
De engine past automatische tekstcorrectie toe na de generatie:
- Beschermt URLs, e-mails, domeinen, decimalen en afkortingen tegen hoofdlettergebruik
- Elimineert dubbele spaties en tabs
- Verwijdert spaties vóór interpunctie (
,.!?) - Voegt spatie toe na interpunctie waar deze ontbreekt
- Maakt de eerste letter van de uitvoer een hoofdletter (HTML-tags worden overgeslagen)
- Hoofdletter na zin-beëindigende interpunctie
- Hoofdletter na block-level HTML-tags
- Hoofdletter na regelafbrekingen
- Herstelt beschermde plaatshouders
Syntaxisoverzicht
| Functie | Syntaxis | Gedrag |
|---|---|---|
| Enumeratie | {a|b|c} | Kiest een willekeurige optie |
| Permutatie | [a|b|c] | Kiest N, schudt, voegt samen |
| Scheidingsteken | [<sep> a|b|c] | Permutatie met uniform scheidingsteken |
| Sep per element | [<, > a|b <x>|c] | Permutatie met aangepaste scheidingstekens |
| Combinaties | [<config> a|b|c] | Permutatie met min/max-aantal |
| Variabele | #set %var% = {a|b} | Bij elke verwijzing opnieuw ingevuld — de spintax erin wordt opnieuw gerold |
| Variabele (eenmalig) | #def %var% = {a|b} | Eén worp per rendering, overal vastgehouden — zo blijven woordvormen en uitgangen congruent |
| Voorwaarde | {?VAR?then|else} | then als truthy; else als falsy |
| Meervoud | {plural %n%: taal|talen} | Stemt de woordvorm af op het getal, per locale |
| Include | #include "slug" | Sluit een ander sjabloon in — de verwijzing wordt door de host opgelost |
| Opmerking | /#...#/ | Verwijderd uit uitvoer |
De taal is haar prototype, Generating The Web (GTW), ontgroeid — sjablonen die voor GTW zijn geschreven, werken nog steeds ongewijzigd.