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 在 模板引擎 中
89 每月下载量
在 2 crates 中使用
105KB
2K SLoC
genanki-rs:用于生成 Anki 卡组的 Rust Crate
使用 genanki-rs
,您可以轻松地为流行的开源闪卡平台 Anki 生成卡组。
该库的代码基于 genanki
的代码,这是一个用于生成 Anki 卡组的 Python 库。
该库及其作者与 Anki 主项目没有任何关联。
贡献
欢迎任何形式的贡献!您可以随意创建一个问题或提出一个 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
并传递您想要包含的 decks
和 media_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&T was originally called", "Bell Telephone Company"]
即使内容是 LaTeX,这也适用;例如,您应该写成
let fields = vec!["Piketty calls this the \"central contradiction of capitalism\".", "[latex]r > g[/latex]"]
依赖关系
~30–41MB
~659K SLoC