#anki #model #python #field #decks #generate #genanki

genanki-rs

用于为开源闪卡平台 Anki 创建卡组的 Crate。基于 Python 库 genanki 构建

9 个不稳定版本

0.4.0 2023年7月29日
0.3.1 2023年1月14日
0.3.0 2022年9月4日
0.2.0 2022年8月23日
0.0.2 2021年5月9日

#457模板引擎

Download history 8/week @ 2024-04-22 5/week @ 2024-05-06 16/week @ 2024-05-20 4/week @ 2024-05-27 9/week @ 2024-06-03 5/week @ 2024-06-10 8/week @ 2024-06-17 13/week @ 2024-06-24 6/week @ 2024-07-15 82/week @ 2024-07-22

89 每月下载量
2 crates 中使用

MIT 许可证

105KB
2K SLoC

genanki-rs:用于生成 Anki 卡组的 Rust Crate

使用 genanki-rs,您可以轻松地为流行的开源闪卡平台 Anki 生成卡组。

该库的代码基于 genanki 的代码,这是一个用于生成 Anki 卡组的 Python 库。

该库及其作者与 Anki 主项目没有任何关联。

example workflow

贡献

欢迎任何形式的贡献!您可以随意创建一个问题或提出一个 PR。

如何使用(有关更多信息,请参阅 文档

添加

[dependencies]
genanki-rs = "0.4"

到您的 Cargo.toml 或在 crates.io 上查找另一个版本

注意

Anki 的基本单位是 Note,其中包含要记忆的事实。《Note》对应一个或多个 Card

以下是创建 Note 的方法

use genanki_rs::{Note, Error};

fn main() -> Result<(), Error> {
    // let my_model = ...
    let my_note = Note::new(my_model, vec!["Capital of Argentina", "Buenos Aires"])?;
    Ok(())
}

您需要传递一个 Model(下面将讨论),以及一组 fields(编码为 HTML)。

模型

Model 定义了 Note 类型的字段和卡。例如

use genanki_rs::{Field, Model, Template, Error};

fn main() -> Result<(), Error> {
    let my_model = Model::new(
        1607392319,
        "Simple Model",
        vec![Field::new("Question"), Field::new("Answer")],
        vec![Template::new("Card 1")
            .qfmt("{{Question}}")
            .afmt(r#"{{FrontSide}}<hr id="answer">{{Answer}}"#)],
    );
    // let my_note = ...
    Ok(())
}

这种笔记类型有两个字段和一个卡片。卡片在正面显示 问题 字段,背面显示 问题答案 字段,两者之间由一个 <hr> 分隔。您也可以通过调用 Model::css() 来传递自定义 css 以提供自定义 CSS。

let custom_css = ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n}\n";
let my_model_with_css = Model::new(
    1607392319,
    "Simple Model",
    vec![Field::new("Question"), Field::new("Answer")],
    vec![Template::new("Card 1")
        .qfmt("{{Question}}")
        .afmt(r#"{{FrontSide}}<hr id="answer">{{Answer}}"#)])
    .css(custom_css);

您需要传递一个模型 id 和一个模型 name,这样 Anki 才能跟踪您的模型。使用唯一模型 id 为您定义的每个 Model 是很重要的。

生成牌组/包

要将您的笔记导入 Anki,您需要将它们添加到 Deck

use genanki_rs::{Deck, Error};

fn main() -> Result<(), Error> {
    // let my_note = ...
    let mut my_deck = Deck::new(
        2059400110,
        "Country Capitals",
        "Deck for studying country capitals",
    );
    my_deck.add_note(my_note);
    Ok(())
}

再次强调,您需要一个唯一的牌组 id、牌组 name 和牌组 description

然后,为您的 Deck 创建一个 Package 并将其写入文件

my_deck.write_to_file("output.apkg")?;

然后,您可以通过“文件”->“导入...”将 output.apkg 加载到 Anki 中

媒体文件

要添加声音或图像,创建一个 Package 并传递您想要包含的 decksmedia_files

use genanki_rs::{Deck, Error, Package};

fn main() -> Result<(), Error> {
    // ...
    // my_deck.add(my_note)
    let mut my_package = Package::new(vec![my_deck], vec!["sound.mp3", "images/image.jpg"])?;
    my_package.write_to_file("output.apkg")?;
    Ok(())
}

media_files 应包含每个文件的路径(相对或绝对)。要在笔记中使用它们,首先在您的模型中添加一个字段,然后在模板中引用该字段

let my_model = Model::new(
    1607392319,
    "Simple Model",
    vec![
        Field::new("Question"),
        Field::new("Answer"),
        Field::new("MyMedia"),                           // ADD THIS
    ],
    vec![Template::new("Card 1")
        .qfmt("{{Question}}{{Question}}<br>{{MyMedia}}") // AND THIS
        .afmt(r#"{{FrontSide}}<hr id="answer">{{Answer}}"#)],
);

然后,将您的 Note 上的 MyMedia 字段设置为 [sound:sound.mp3] 以播放音频和 <img src="image.jpg"> 以显示图像(例如)

let my_note = Note::new(my_model, vec!["Capital of Argentina", "Buenos Aires", "[sound:sound.mp3]"])?;
// or
let my_note = Note::new(my_model, vec!["Capital of Argentina", "Buenos Aires", r#"<img src="image.jpg">"#])?;

不能 在模板中使用 <img src="{MyMedia}"> 并在字段中使用 image.jpg。有关更多信息,请参阅 Anki 手册中的这些部分:[导入媒体](https://docs.ankiweb.net/#/importing?id=importing-media) 和 [媒体 & LaTeX](https://docs.ankiweb.net/#/templates/fields?id=media-amp-latex)。

您应在字段中只放置文件名(即基本名),而不是完整路径;<img src="images/image.jpg">不会 工作。媒体文件应具有唯一的文件名。

sort_field

Anki 为每个 Note 都有一个名为 sort_field 的值。Anki 使用此值在浏览界面中排序卡片。如果您避免有两个具有相同 sort_field 的笔记,Anki 会更高兴,尽管这并不是必需的。默认情况下,sort_field 是第一个字段,但您可以通过调用 Note::sort_field() 来更改它。

您还可以调用 Model::sort_field_index(),传入 sort_field_index 来更改排序字段。 0 表示笔记中的第一个字段,1 表示第二个,等等。

常见问题解答

我的字段数据变得混乱

如果您的笔记中的字段包含字面字符 <>&,您需要对这些字符进行 HTML 编码:字段数据是 HTML,而不是纯文本。

例如,您应该写成

let fields = vec!["AT&amp;T was originally called", "Bell Telephone Company"]

即使内容是 LaTeX,这也适用;例如,您应该写成

let fields = vec!["Piketty calls this the \"central contradiction of capitalism\".", "[latex]r &gt; g[/latex]"]

依赖关系

~30–41MB
~659K SLoC