8个版本

0.2.1 2021年4月24日
0.2.0 2020年9月13日
0.1.4 2020年9月13日
0.1.3 2020年8月21日
0.1.0 2016年6月17日

#10 in #text-generation

MIT/Apache

63KB
989

tracery

Rust实现的tracery生成语法语言。

Crates.io MIT licensed Documentation Coverage Status

这个库是Rust对tracery的移植/实现,tracery是一种由Kate Compton设计和创建的生成语法语言。给定一组用tracery语法编写的规则,它将使用这些规则来程序化生成文本字符串。有关tracery语言的信息,请参阅语言概念

用法

库的用法可以分为两个领域:创建语法和生成输出字符串。

语法创建

可以使用grammar!宏来创建语法,从任何可迭代的Rust字符串对象及其关联的字符串列表,或者为了与原始tracery兼容,从表示JSON映射的字符串。

Grammar! 宏

接受以下形式的输入:"key" => [ "list", "of", "rules" ] 或,如果一个键只有一个规则时,"key" => "rule"。相当于手动构建一个映射然后调用Grammar::from_map

use tracery::grammar;
let g = grammar! {
    "origin" => "#tool# is #description#!",
    "tool" => "tracery",
    "description" => [ "fun", "awesome" ]
}?;

从映射/迭代器

可以从任何实现了以下特性的对象创建语法:本质上,是 IntoIterator<Item = (Into<String>, Into<Vec<Into<String>>)>. 例如,HashMap<String, Vec<String>>BTreeMap<&str, &[&str]>.

let map = hashmap! {
    "origin" => vec![ "#tool# is #description#!" ],
    "tool" => vec![ "tracery" ],
    "description" => vec![ "fun", "awesome" ]
};
let g = tracery::from_map(map)?;

从JSON字符串

为了与原始的tracery兼容,可以从表示JSON对象的字符串创建语法。此功能由 tracery_json 功能控制,默认情况下已启用。如果不需要此功能,可以将其关闭。

let json = r##"{
    "origin": [ "#tool# is #description#!" ],
    "tool": [ "tracery" ],
    "description": [ "fun", "awesome" ]
}"##;
let g = tracery::from_json(json)?;

生成输出字符串

从创建的语法中获取生成输出字符串有两种方法: executeflatten。通常,如果可能的话,应优先使用 execute

execute

execute 接受两个参数:要展开的规则和用于生成的RNG。RNG可以是任何实现了 rand::Rng 的类型。

use tracery::grammar;
let mut g = grammar! {
    "origin" => "#tool# is #description#!",
    "tool" => "tracery",
    "description" => [ "fun", "awesome" ]
}?;
// Generate an output (either "tracery is fun!" or "tracery is awesome!")
let key = String::from("origin");
let output = g.execute(&key, &mut rand::thread_rng())?;

execute 使用语法在原地生成其输出。由于语法允许修改自己的规则栈,execute 必须接受一个 &mut self 引用。这意味着在执行过程中所做的任何修改都将持久保留在语法中。

use tracery::grammar;
// This time, origin has a side-effect: it creates the rule 'aside'
let mut g = grammar! {
    "origin" => "#[aside:Rust is, too]tool# is #description#!",
    "tool" => "tracery",
    "description" => [ "fun", "awesome" ]
}?;
// Generate an output (either "tracery is fun!" or "tracery is awesome!")
let key = String::from("origin");
let output = g.execute(&key, &mut rand::thread_rng())?;
// The previous call to execute created the 'aside' rule
let key = String::from("aside");
// Generates the string "Rust is, too"
let output = g.execute(&key, &mut rand::thread_rng())?;

flatten

flattenexecute 不同,始终在语法的默认规则(默认为 "origin")上操作,但与 execute 相同,在生成时使用 rand::Rng 的实例。此外,flatten 在生成期间使用语法的克隆,然后将其丢弃,这意味着生成的任何副作用都将被丢弃。

use tracery::grammar;
let g = grammar! {
    "origin" => "#tool# is #description#!",
    "tool" => "tracery",
    "description" => [ "fun", "awesome" ]
}?;
// Generate an output (either "tracery is fun!" or "tracery is awesome!")
let output = g.flatten(&mut rand::thread_rng())?;

许可:MIT/Apache-2.0

依赖关系

~2.5–3.5MB
~68K SLoC