ネストされた Spintax
ネストがフラットなスピニングを強力なテンプレートエンジンに変える仕組み — そして Spintax.Net のアプローチが標準である理由。
ネストされた Spintax とは?
通常の spintax はリストからランダムに1つを選びます:{red|blue|green} は3色のうち1つを生成します。ネストされた spintax は spintax の中に spintax を配置します — マトリョーシカ人形のように、各層がさらなるバリエーションを内包しています。
エンジンがネスト構造に遭遇すると、最も内側の式から外側へ解決します。内側の波括弧が最初に評価され、その結果が外側の式の一部になります。
{red|{dark|light} blue} car
ここでは {dark|light} が先に解決され(例: dark)、{red|dark blue} になります。その後、外側の列挙が 1 つを選びます: red または dark blue。
ネストが重要な理由
ネストがなければ、選択肢はフラットです。3つのオプションを持つ3つの列挙で 3 + 3 + 3 = 9 フラグメント。ネストありでは、同じ要素が乗算的に組み合わさります:3 × 3 × 3 = 27のユニークなバリアントが1つのコンパクトなテンプレートから生まれます。
この指数関数的な増加が、真にユニークなコンテンツを生成する鍵です。ネストされた列挙と順列を含む適度に複雑なテンプレートは、1つの丁寧に作られたソースから数千から数百万の異なる出力を生成できます。
他のツールの一般的な制限
ほとんどの spintax ツールは基本的な機能しか扱えません。一般的に問題となる点を示します:
- 列挙内列挙のみ —
{a|{b|c}}はサポートしますが、それ以外は対応しません。順列、変数、他の要素内のインクルードは不可。 - 深度制限 — 多くのパーサーは2–3レベルのネストで破綻し、無言で破損した出力を生成します。
- クリーンアップなし — ネスト構造を解決した後、スペースが崩壊し、句読点が重複し、大文字化が壊れます。結果は手動編集が必要です。
- 構成可能性なし — 変数とインクルードがなければ、すべてのテンプレートは孤島です。共通ブロックの再利用はコピー&ペーストを意味します。
Spintax.Net のアプローチ
Spintax.Net はネストを後付けではなく、ファーストクラスの機能として実装しています。5つの設計方針がそれを可能にします:
- 任意の深さ — ネスト制限はありません。10レベルの深さも2レベルと同じように動作します。
- 要素間ネスト — 順列内の列挙、列挙内の順列、ネスト構造を含む変数、ネストされたテンプレート全体を埋め込むインクルード。任意の要素を他の任意の要素の中に配置可能。
- 最内部優先の解決 — エンジンは常に最も深いレベルから外側へ解決します。これにより評価が予測可能でデバッグしやすくなります。
- スマートな後処理 — すべてのネストが解決された後、エンジンは自動的に大文字化を修正し、重複スペースを削除し、句読点の間隔を修正し、文の境界を処理します。出力は生の連結ではなく、クリーンなテキストです。
- 安全性 —
#includeの循環参照検出が無限ループを防止します。変数スコープルール(ランタイム > ローカル > グローバル)が意図しない上書きを防ぎます。
シンプルからアドバンスドまで
1. 列挙の中の列挙
{{premium|luxury} sedan|{compact|mid-size} SUV}
内側の列挙が先に解決され、外側が結果を選びます。可能な出力: premium sedan、luxury sedan、compact SUV、mid-size SUV。
2. 順列の中の列挙
[<minsize=2;maxsize=3;sep=", ";lastsep=" and "> {red|blue} apples|{big|small} oranges|bananas]
順列の各要素は独自の列挙を含みます。エンジンは内側の列挙を先に解決し、その後シャッフルして結合します。出力例: blue apples, bananas and small oranges。
3. ネストした spintax を持つ #set 変数
#set %product% = {{premium|budget} {laptop|tablet}|{smart|classic} phone}
#set %action% = {Buy|Get|Order}
%action% your new %product% today!
#set はマクロです。ネストした spintax を未解決のまま保持し、参照のたびに引き直します。そのため 2 箇所の %product% が異なる製品になることもあります。複数の変数と組み合わせると、バリアント数は急速に倍増します。
4. #def — 一度だけ引き、どこでも同じ
#def %brand% = {{Nord|Prime} Tools|Acme {Labs|Works}}
%brand% ships today. Order %brand% now!
#def はネストした spintax をレンダーごとに一度だけ解決し、その結果をすべての参照で保持します。ここでは 2 箇所とも同じブランド名になります。繰り返しの参照を一致させたいとき(ブランド名、カウント)は #def を、参照ごとに変化させたいときは #set を使います。
5. ネストしたブロックを包む条件分岐
{?PLAN?{Upgrade to|Unlock} {Pro|Premium} features|{Try|Start with} the free tier}
{?VAR?then|else} の事前パスは、ランダムな抽選が走る前に、%PLAN% に値があるかどうかで分岐を選びます。落ちた側の分岐は丸ごと破棄され、その中は評価も抽選もされません。
6. ネストしたカウントと複数形
#def %n% = {2|5|21}
Renders %n% {plural %n%: variant|variants} per click.
カウント自体も spintax です。しかもその変数は #set ではなく #def でなければなりません。語形はカウント解決後に選ばれるため、マクロではその時点でまだ未解決の spintax のままだからです。用意する語形の数はレンダーのロケールが決めます: 英語は 2 つ、ロシア語やウクライナ語は 3 つ。
7. ネストを含むインクルード
/# main template #/
#include "hero-text"
{Check out|Discover|Explore} our [<, > features|plans|pricing].
インクルードされたテンプレート自体も、列挙、順列、変数、さらなるインクルードを含められます。循環参照の検出がすべてを安全に保ちます。
AI + ネストされた Spintax
大規模言語モデルは複雑なネストテンプレートの作成に優れています。1つのプロンプトで、複数のネストレベル、値駆動の条件ブロック({?VAR?…})、ロケール対応の複数形、インクルードによる再利用可能なセクションを持つテンプレートを生成できます。
ワークフローはシンプルです:AI を使ってテンプレートを一度作成し、Spintax を使ってユニークなバリアントを永遠に安価に生成する。テンプレート作成に1回のAPIコール。各バリアント生成にAPIコールはゼロ。ネストされた spintax がこれを経済的に実現可能にします — ネストが深いほど、テンプレートあたりのユニーク出力が増えます。
はじめに
プロジェクトでネストされた spintax を使う準備はできましたか?プレイグラウンドでライブに試せます — 上の例を貼り付けて、解決される様子を見てください。完全な仕様は構文リファレンスにあります。本番では4つのオープンソースエンジンから選ぶか、ランタイムが WordPress なら WordPress プラグインをどうぞ。