4 个版本

0.1.2 2019年4月19日
0.1.1 2019年4月14日
0.1.0 2019年4月13日
0.0.1 2019年4月11日

文本处理 中排名 #1166

每月下载量 25

MPL-2.0 许可证

41KB
644 行(不包括注释)

Build Status

genere

Genere 是一个库,可用于生成(可能随机)匹配各种元素的(语法)性别的文本。

示例

use genere::Generator;
let json = r#"
{
   "hero": ["John[m]", "Joan[f]"],
   "job[hero]": ["wizard/witch"],
   "main[hero]": ["{hero}. He/She is a {job}."]
}"#;

let mut gen = Generator::new();
gen.add_json(json).unwrap();;
let result = gen.instantiate("main").unwrap();
assert!(&result == "John. He is a wizard."
       || &result == "Joan. She is a witch.");

特性

二进制或 Rust 库

可以将 Genere 用作二进制程序

$ genere main < file.json

将在 main 符号在 file.json 文件中实例化。

然而,Genere 主要是 Rust 库,因此它可以在 Rust 编写的程序中使用:您只需要在您的 Cargo.toml 文件的 dependencies 部分添加

genere = "0.1"

文本生成

Genere 受到 Tracery 的启发,因此语法类似,允许您轻松生成随机文本

let json = r#"
{
    "name": ["John", "Johana", "Vivienne", "Eric"],
    "last_name": ["StrongArm", "Slayer", "The Red"],
    "class": ["mage", "warrior", "thief", "rogue", "barbarian"],
    "race": ["human", "dwarvish", "elvish", "vampire"],
    "text": ["{name} {last_name} is a {race} {class}.",
	     "Meet {name} {last_name}, A proud {class}!"]
}
"#;

可能显示 "Johana Slayer 是一位吸血鬼战士"。

基本上,您定义一个符号列表,当您使用 {symbol} 语法调用它们时,将随机替换为对应数组中的一个字符串版本。

请注意,一旦一个符号被 "实例化",它的值就是固定的。所以如果你有

"text": ["Meet {name} {last_name}. {name} is a proud {class}."]

则可以保证对 {name} 的两次替换都是相同的。

如果您想获得(可能)不同的实例,您需要使用 {{symbol}}

"text": ["Meet {name} {last_name}. {name} is a proud {class}. There is also {{name}}, a {{class}}."]

大写化

当声明时,符号不区分大小写。当在内容替换中引用它们时,符号的大小写将影响替换内容的大小写:如果符号是小写的,则内容不变;如果符号的第一个字母是大写的,则替换内容的第一个字母将变为大写;如果符号全部大写,则对替换内容应用相同的规则。

let json = r#"
{
    "dog": ["a good dog"],
    "text1": ["This is {dog}"],
    "text2": ["This is {DOG}"],
    "text3": ["{Dog}"]
}
"#;

将分别显示 "This is a good dog"、"This is A GOOD DOG" 和 "A good dog" 作为 "text1"、"text2" 和 "text3"。

性别适应

Genere 旨在允许轻松生成语法上准确的句子

let json = r#"
{
    "name": ["John[m]", "Johana[f]", "Vivienne[f]", "Eric[m]"],
    "class": ["mage", "warrior", "thief", "rogue", "barbarian"],
    "text[name]": ["Meet {name}. He/She is a proud {class}!"]
}
"#;

将确保根据符号 name 中指定的性别显示 "He" 或 "She"。

您可以使用 [m][f][n] 来设置性别。同样,您可以使用符号名称中的 [symbol] 来告诉系统一个符号的性别依赖于另一个符号的性别。例如,text[main] 表示 main 的替换字符串中的性别将由 name 的性别决定。您还可以通过在定义中使用 [n] 并在替换字符串中添加一个 / 来指定中性性别(例如 He/She/They)。如果没有在替换字符串中指定,将输出男性和女性版本(例如 He/She 而不是 Them)。

有时一个句子可能使用各种性别元素,而不仅仅依赖于一个符号的性别。对于每种性别变化,可以指定一个 "依赖"。

"text[hero]": ["He/She is called {hero}. His/Her son/daughter[child] is named {child}."]

在这里,hero 的性别将用于确定 He/SheHis/Her 之间的区别,而 child 的性别将用于选择 son/daughter

性别适应中的空格

当您使用此性别语法时,'/' 只会考虑单词之前和之后的单词,不允许在您的表达式中包含空格。如果您想在性别适应表达式中插入空格,您必须使用 ~ 转义它,例如:"du/de~ la"。

附加性别语法

您还可以使用类似于法语中使用的 "median point" 语法:"C'est un·e sorci·er·ère." 等同于 "C'est un/une sorcier/sorcière"。

转义

如果您想在文本中使用 '[', ']', '{', '}', '/' 和 '·' 字符,您可以使用转义字符 '~'。例如,"~{foo}" 将显示 "{foo}" 而不是尝试查找符号 foo 并用其内容替换它。您还可以使用 "~~" 来显示波浪号符号。

许可证

Genere 根据 Mozilla 公共许可证版本 2.0 发布。有关更多信息,请参阅 许可证

变更日志

请参阅 变更日志

依赖项

~5.5–8.5MB
~152K SLoC