4 个版本
0.2.1 | 2023 年 2 月 22 日 |
---|---|
0.2.0 | 2023 年 1 月 28 日 |
0.1.2 | 2022 年 12 月 23 日 |
0.1.0 | 2022 年 12 月 20 日 |
在 文本处理 中排名 #812
每月下载 22 次
36KB
551 行
Ranting ╰(°Д°)/
此库提供了 Ranting
,一个用于 say!()
文字占位符的屈折特性。
[dependencies]
ranting = "0.2"
详细信息
say!()
宏生成与format!()
类似的 String,但占位符标记可以接收代词。旁边的动词始终以复数形式指定,并相应地进行屈折。
use ranting::*;
use ranting_derive::*;
fn say_this(who: Noun, title: &Noun) -> String {
say!("{=who do} say {`who title are} {who}.")
}
fn main() {
let title = Noun::new("name", "it");
assert_eq!(
say_this(Noun::new("Jane", "I"), &title),
"I do say my name is Jane.".to_string()
);
assert_eq!(
say_this(Noun::new("Tarzan", "he"), &title),
"He does say his name is Tarzan.".to_string()
);
}
-
Noun
是一个具有Ranting
特性的 struct。您可以在 struct 或 enum 上使用#[derive(Ranting)]
以获得类似的行为。要指定主语,请使用 I .. they,thou 或 ye。 -
用于显示 Ranting 变量的占位符结构如下
``{[,^]?(verb )?(article |`noun )?([+-]|([#$]|\?$)var )?[`=@~?*]?noun( verb):fmt}``
- 使用
,
和^
强制执行大小写,但句子开头的占位符默认为大写。此外,大写冠词或动词也会导致首字母大写。
fn state<T: Ranting>(who: T, liberty: &str) -> String {
say!("{haven't =who} a {liberty} to say {a who's} land is {~who}?")
}
#[derive_ranting]
#[ranting(subject = "he")]
struct Earl {}
#[derive_ranting]
#[ranting(subject = "they")]
struct Farmers {}
fn main() {
assert_eq!(
state(Earl {}, "right"),
"Hasn't he a right to say an earl's land is his?".to_string()
);
assert_eq!(
state(Farmers {}, "right"),
"Haven't they a right to say some farmers' land is theirs?".to_string()
);
}
-
在名词之前的大写冠词、所有格
's
或动词也会相应地调整。普通占位符只需在say!()
中遵循它们的 Display 或 Debug 特性。 -
给定的 Ranting 枚举或结构也可以屈折为复数或单数。要强制复数,请使用
+
,对于单数,请使用-
。如果以$var
或#var
开头,名词的复数将适应数字变量 var。除非以 '?' 开头,否则显示该数字。数字将转换为单词#var
。占位符内的其他单词也将相应调整。 -
名词或代词的显示取决于其前面的字符或字符串标记。
?
- 变化后的主语,但不显示变量及其空间。=
- 主语@
- 宾语`
- 物主代词~
- 形容词*
- 显示名称(默认行为)并标记此词为占位符中的Ranting元素。"一个{*可以可以}装水。"(已移除mutname变体)
-
如果一个名词或数字复数以问号开头,则将其隐藏,但其推断的变化仍然适用。
-
"文章"可以是
a
、an
、some
、the
、those
或these
之一。如果代词是单数,则将这些和那些转换为this和that。问号表示其显示依赖于(参见no_article)。 -
ack!()
和nay!()
提供了带有格式化字符串的Ok() / Err()返回值,包括say!()
。旨在允许或拒绝ranting响应。不用于错误处理,因为真正的错误应该很容易在代码中搜索。 -
结构可以通过属性接收
- 主语 ["it"] - 指示代词,如果是 "$",则假定结构包含一个名为 'subject' 的字符串
- 名称 [结构体或枚举名称;小写] - 显示名称。当 "$" 时,结构体包含一个名称字符串。
- 单数结尾 [""] - 对于变化,如果复数是 '-',则 name + 单数结尾。也可以是 "$"
- 复数结尾 ["s"] - 同样,如果复数是 '+' 或 #var != 1,则名称结尾。
- is_plural [as subject] - 如果主语是 "you",则表示这表示复数还是单数。
- uc [false] - 指示单词是否应该始终以大写字母开头。
- no_article [false] - 指示如果文章以问号开头,则单词应该不带文章。say!("{?the 0} was great!", activity) // 例如,对于 activity = tennis 且 no_article=true。 (后两个尚未提供 "$" 变体)
支持位置参数和数字引用,但目前不支持命名参数或空参数。
fn main() {
let thing = Noun::new("thing", "it");
assert_eq!(say!("this is {=thing}."), "this is it.".to_string());
assert_eq!(say!("this is {=0}.", thing), "this is it.".to_string());
// won't work:
//assert_eq!("{}", say!("this is {=x}.", x = thing), "this is it.".to_string());
//assert_eq!("{}", say!("this is {=}.", thing), "this is it.".to_string());
}
依赖关系
~6MB
~110K SLoC