ネストされた 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つの設計方針がそれを可能にします:

  1. 任意の深さ — ネスト制限はありません。10レベルの深さも2レベルと同じように動作します。
  2. 要素間ネスト — 順列内の列挙、列挙内の順列、ネスト構造を含む変数、ネストされたテンプレート全体を埋め込むインクルード。任意の要素を他の任意の要素の中に配置可能。
  3. 最内部優先の解決 — エンジンは常に最も深いレベルから外側へ解決します。これにより評価が予測可能でデバッグしやすくなります。
  4. スマートな後処理 — すべてのネストが解決された後、エンジンは自動的に大文字化を修正し、重複スペースを削除し、句読点の間隔を修正し、文の境界を処理します。出力は生の連結ではなく、クリーンなテキストです。
  5. 安全性#include の循環参照検出が無限ループを防止します。変数スコープルール(ランタイム > ローカル > グローバル)が意図しない上書きを防ぎます。

シンプルからアドバンスドまで

1. 列挙の中の列挙

{{premium|luxury} sedan|{compact|mid-size} SUV}

内側の列挙が先に解決され、外側が結果を選びます。可能な出力: premium sedanluxury sedancompact SUVmid-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 プラグインをどうぞ。