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 次
41KB
644 行(不包括注释)
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/She
和 His/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