3 个不稳定版本
0.2.1 | 2019年7月30日 |
---|---|
0.2.0 | 2019年7月29日 |
0.1.0 | 2019年7月27日 |
#9 in #wheel
66KB
1.5K SLoC
Hamster Wheel
Hamster Wheel 是一个循环代码生成器。通过指定一些集合和一个 .hamster_wheel 文件,可以生成所需的任何文本。
用法
安装 Rust 包 cargo install hamster_wheel
然后运行命令 hamster_wheel
,将解释你目录及其子目录中的所有 .hamster_wheel 文件。
模板
在 /templates
目录中包含了一些用于各种编程语言的模板文件。Hamster Wheel 的一个主要动机是轻松生成本地化表单,因此包含了一些用于此目的的模板。如果你需要生成某些内容但没有提供模板,请继续阅读以了解如何编写自己的 .hamster_wheel 文件。
创建 .hamster_wheel 文件
完整文件的示例
{{ OUTPUT your/output_file.js }}
{{ IMPORT }}
name: yourCollection;
key: 123abc123abc123abc123;
{{ END }}
{{ LOOP(parentIndex) yourCollection as currentRow }}
Parent Loop number {{ parentIndex }}!
{{ LOOP currentRow as currentItem }}
Item: {{ currentItem }}
{{ END }}
{{ END }}
为了使文件能够成功解释,它必须具备以下条件
- hamster_wheel 扩展名
- 指定的输出文件
- 定义集合的导入
- 集合的循环
- 访问集合的访问器
以下将进行描述。
输出文件
.hamster_wheel 文件的第一件事必须是输出文件的声明。这可以通过以下行来完成
{{ OUTPUT your/output_file.js }}
THE REST OF YOUR CONTENT
注意,上面的内容是有效的文件。如果 test.hamster_wheel
包含上述内容,你将有一个名为 your/output_file.js
的文件,内容如下: THE REST OF YOUR CONTENT
导入
你可以以两种方式导入集合(仅支持 csv 内容)。
要导入用于文件的集合,你可以从 csv 文件导入
{{ IMPORT }}
name: yourVariableName;
path: you/input_file.csv;
{{ END }}
或从 Google Sheets 导入
{{ IMPORT }}
name: yourOtherVariable;
key: 123abc123abc123abc123;
{{ END }}
在两种情况下,都必须存在 name
选项,以便在文件的作用域中暴露它。如果你想要从你的机器导入文件,则必须存在 path
选项。如果你想导入 Google Sheet,则必须指定 key
选项。这个 key
是 Google Sheet URL 中的长字符串。为了让 Google Sheets 工作,该工作表必须有一个可共享的链接。另外,别忘了分号 ;
。
到此为止的示例文件
{{ OUTPUT your/output_file.js }}
THE REST OF YOUR CONTENT
{{ IMPORT }}
name: yourVariableName;
path: you/input_file.csv;
{{ END }}
导入集合的另一种方法是从 cli。你可以如下从命令行从一个文件导入集合
hamster_wheel file variableName ./my/file.csv
您可以从命令行按照以下方式导入来自Google Sheets的集合
hamster_wheel sheet variableName 123abc123abc123abc123
然后您可以使用该变量在所有将得到解释的.hamster_wheel文件中
导入定义了当前作用域中的变量,其中作用域通常由一个循环定义。
循环
现在您已经作用域中有变量了,您可以使用此语法来循环遍历它们
{{ LOOP yourCollection }}
YOUR CONTENT
{{ END }}
假设您的作用域中有一个变量 yourCollection
(并且您已指定输出文件),上面的代码应该会根据您的csv文件中的行数多次输出 YOUR CONTENT
Hamster wheel支持数组切片语法,您可以使用它来获取集合的切片(集合是零索引的)。
语法是 yourCollection[N, M]
其中M和N是整数或一个极端界限指示符 ..
。
示例: yourCollection[1, ..]
:循环遍历yourCollection
并跳过第一个元素。 yourCollection[2, ..]
:循环遍历yourCollection
并跳过前两个元素。 yourCollection[1, 4]
:从索引1(包含)到4(不包含)获取元素。 yourCollection[.., 6]
:从开始到索引6(不包含)获取所有元素。
使用切片的示例
{{ LOOP yourCollection[1, ..] }}
YOUR CONTENT
{{ END }}
您可以将以下信息放入作用域中,以便在循环内使用,通过为它们分配变量名来实现
- 循环索引:这始终从零开始,每次迭代增加一。
- 集合索引:这是当前用于访问集合的索引。这意味着如果您正在对
yourCollection[5, ..]
进行循环,集合索引从5开始,每次迭代增加一。 - 当前项:这仅仅是
yourCollection[collectionIndex]
。
您可以使用以下语法将它们分配给变量
{{ LOOP(loopIndex, collectionIndex) yourCollection[1, ..] as currentItem }}
YOUR CONTENT
{{ END }}
注意,您可以通过指定 LOOP (loopIndex)
而不是 LOOP (loopIndex, collectionIndex)
来省略 collectionIndex
。
循环遍历csv文件中所有项目的示例
{{ LOOP(parentIndex) yourCollection as currentRow }}
Parent Loop number {{ parentIndex }}!
{{ LOOP currentRow as currentItem }}
Item: {{ currentItem }}
{{ END }}
{{ END }}
在这个例子中,我们访问 currentItem
并显示它。
访问器
如上所示,要访问一个项目,您可以使用
{{ currentItem }}
您也可以使用括号来访问数组,例如 yourCollection[2]
。另一种我们可以写上面示例的方法是
{{ LOOP(parentIndex, parentCollectionIndex) yourCollection}}
Parent Loop {{ parentIndex }}!
{{ LOOP(loopIndex, collectionIndex) yourCollection[parentCollectionIndex] }}
Item: {{ yourCollection[parentCollectionIndex][collectionIndex] }}
{{ END }}
{{ END }}
使用 as yourVariable
语法更为简洁,因此推荐使用,但此示例显示了您可以做事情的另一种方式。
就是这样
现在您知道了语法及其使用方法,您可以随心所欲地循环遍历集合。
依赖项
~20-30MB
~481K SLoC