嵌套 Spintax
嵌套如何将平面旋转转变为强大的模板引擎 — 以及为什么 Spintax.Net 方法是标准。
什么是嵌套 Spintax?
普通 spintax 从列表中随机选择一个选项:{红色|蓝色|绿色} 产生三种颜色之一。嵌套 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 将嵌套实现为一等功能,而非事后添加。五个设计决策使其运作:
- 任意深度 — 没有嵌套限制。十层深度与两层的工作方式相同。
- 跨元素嵌套 — 枚举内排列、排列内枚举、包含嵌套结构的变量、嵌入完整嵌套模板的包含。任何元素可以在任何其他元素内部。
- 由内向外解析 — 引擎始终从最深层级向外解析。这使求值可预测且可调试。
- 智能后处理 — 所有嵌套解析完成后,引擎自动修复大小写、合并重复空格、修正标点间距并处理句子边界。输出是干净的文本,而非原始拼接。
- 安全性 —
#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——而且它的变量必须是 #def 而非 #set:词形在计数解析之后才选择,而宏在那一刻仍是未解析的 spintax。需要提供几种词形由渲染 locale 决定:英语两种,俄语或乌克兰语三种。
7. 带嵌套的包含
/# main template #/
#include "hero-text"
{Check out|Discover|Explore} our [<, > features|plans|pricing].
被包含的模板本身也可以含有枚举、排列、变量,甚至更多包含。循环引用检测保证一切安全。
AI + 嵌套 Spintax
大型语言模型非常擅长编写复杂的嵌套模板。一个提示就可以生成包含多层嵌套、按值驱动的条件块({?VAR?…})、感知 locale 的复数以及通过包含实现可复用部分的模板。
工作流很简单:使用 AI 创建一次模板,然后使用 Spintax 以极低成本永远生成独特变体。一次 API 调用创建模板。零次 API 调用生成每个变体。嵌套 spintax 使这在经济上可行 — 嵌套越深,每个模板的独特输出就越多。
入门
准备好在项目中使用嵌套 spintax 了吗?在演练场里在线试试 — 粘贴上面的任意示例,看它如何解析。完整规范见语法参考;投入生产时,从四个开源引擎中任选其一 — 如果你的运行时是 WordPress,也可以用 WordPress 插件。