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 ╰(°Д°)/

github crates.io docs.rs

此库提供了 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变体)
  • 如果一个名词或数字复数以问号开头,则将其隐藏,但其推断的变化仍然适用。

  • "文章"可以是aansomethethosethese之一。如果代词是单数,则将这些和那些转换为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