중첩 Spintax

중첩이 평면적인 스피닝을 강력한 템플릿 엔진으로 변환하는 방법 — 그리고 Spintax.Net 접근 방식이 표준인 이유.

중첩 Spintax란?

일반 spintax는 목록에서 무작위로 하나를 선택합니다: {red|blue|green}는 세 가지 색상 중 하나를 생성합니다. 중첩 spintax는 spintax 안에 spintax를 배치합니다 — 마트료시카 인형처럼, 각 층이 내부에 더 많은 변형을 담고 있습니다.

엔진이 중첩 구조를 만나면 가장 안쪽 표현식에서 바깥쪽으로 해결합니다. 내부 중괄호가 먼저 평가되고, 그 결과가 외부 표현식의 일부가 됩니다.

{red|{dark|light} blue} car

여기서는 {dark|light}가 먼저 해석되어(예: dark) {red|dark blue}가 됩니다. 그다음 바깥 열거가 하나를 고릅니다: red 또는 dark blue.

중첩이 중요한 이유

중첩이 없으면 옵션은 평면적입니다. 각각 세 가지 옵션을 가진 세 개의 열거로 3 + 3 + 3 = 9개의 프래그먼트를 얻습니다. 중첩을 사용하면 동일한 요소가 곱셈적으로 결합됩니다: 3 × 3 × 3 = 하나의 컴팩트한 템플릿에서 27개의 고유한 변형이 생성됩니다.

이 기하급수적 증가가 진정으로 고유한 콘텐츠를 생성하는 핵심입니다. 중첩 열거와 순열을 포함한 적당히 복잡한 템플릿은 신중하게 만든 하나의 소스에서 수천에서 수백만개의 서로 다른 출력을 생성할 수 있습니다.

다른 도구의 일반적인 제한

대부분의 spintax 도구는 기본적인 기능만 처리합니다. 일반적으로 문제가 되는 점은 다음과 같습니다:

  • 열거 내 열거만{a|{b|c}}는 지원하지만 그 외에는 지원하지 않습니다. 순열, 변수, 다른 요소 내의 인클루드는 불가능합니다.
  • 깊이 제한 — 많은 파서가 2–3단계의 중첩 후 오류가 발생하며, 조용히 손상된 출력을 생성합니다.
  • 정리 없음 — 중첩 구조를 해결한 후 공백이 무너지고, 구두점이 중복되고, 대문자가 깨집니다. 결과물은 수동 편집이 필요합니다.
  • 조합 불가 — 변수와 인클루드 없이는 모든 템플릿이 고립됩니다. 공통 블록을 재사용하려면 복사하여 붙여넣어야 합니다.

Spintax.Net 접근 방식

Spintax.Net은 중첩을 부차적 기능이 아닌 일급 기능으로 구현합니다. 다섯 가지 설계 결정이 이를 가능하게 합니다:

  1. 임의의 깊이 — 중첩 제한이 없습니다. 10단계 깊이도 2단계와 동일하게 작동합니다.
  2. 요소 간 중첩 — 순열 내의 열거, 열거 내의 순열, 중첩 구조를 포함하는 변수, 중첩된 전체 템플릿을 임베딩하는 인클루드. 모든 요소를 다른 모든 요소 안에 배치 가능.
  3. 가장 안쪽 우선 해결 — 엔진은 항상 가장 깊은 레벨에서 바깥쪽으로 해결합니다. 이를 통해 평가가 예측 가능하고 디버깅이 용이합니다.
  4. 스마트 후처리 — 모든 중첩이 해결된 후, 엔진은 자동으로 대문자를 수정하고, 중복 공백을 축소하고, 구두점 간격을 수정하고, 문장 경계를 처리합니다. 출력은 원시 연결이 아닌 깨끗한 텍스트입니다.
  5. 안전성#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를 미해석 상태로 저장하고 참조할 때마다 다시 추첨하므로, 두 번의 %product%가 서로 다른 제품이 될 수 있습니다. 여러 변수와 결합하면 변형 수가 빠르게 배가됩니다.

4. #def — 한 번 추첨, 어디서나 동일

#def %brand% = {{Nord|Prime} Tools|Acme {Labs|Works}}

%brand% ships today. Order %brand% now!

#def는 중첩 spintax를 렌더당 한 번만 해석하고 모든 참조에서 그 결과를 유지합니다 — 여기서는 두 번 모두 같은 브랜드가 나옵니다. 반복 참조가 일치해야 할 때(브랜드명, 카운트)는 #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

대규모 언어 모델은 복잡한 중첩 템플릿 작성에 탁월합니다. 하나의 프롬프트로 여러 중첩 레벨, 값 기반 조건 블록({?VAR?…}), 로케일 인식 복수형, 인클루드를 통한 재사용 가능한 섹션이 포함된 템플릿을 생성할 수 있습니다.

워크플로는 간단합니다: AI를 사용하여 템플릿을 한 번 만들고, Spintax를 사용하여 고유한 변형을 영원히 저렴하게 생성하세요. 템플릿 생성에 API 호출 1회. 각 변형 생성에 API 호출 0회. 중첩 spintax가 이를 경제적으로 실현 가능하게 만듭니다 — 중첩이 깊을수록 템플릿당 더 많은 고유 출력을 얻습니다.

시작하기

프로젝트에서 중첩 spintax를 사용할 준비가 되셨나요? 플레이그라운드에서 바로 시험해 보세요 — 위의 예시를 붙여 넣고 해석되는 모습을 지켜보세요. 전체 사양은 구문 참조에 있으며, 프로덕션에서는 네 가지 오픈소스 엔진 중 하나를 고르세요 — 런타임이 WordPress라면 WordPress 플러그인도 있습니다.