A lightweight Markdown-to-Anki toolkit for exam review workflows.
Project description
Exam Cardforge
Exam Cardforge is a lightweight Markdown-to-Anki toolkit for exam review workflows.
It helps students and study groups keep notes readable in Markdown while exporting reusable flashcards for Anki. The first built-in templates target Chinese CS postgraduate entrance exam review, especially 408.
Project positioning
Exam Cardforge is designed for people who already write course notes, wrong-question notes, or review summaries in Markdown and want a low-friction path into spaced repetition.
The project focuses on:
- human-readable Markdown syntax;
- Anki-compatible CSV export;
- exam-oriented note organization with tags, decks, and cloze cards;
- small, dependency-light Python code that new contributors can understand.
This is not a question bank. It is a conversion and validation tool for notes that users own and maintain.
Why this project exists
Many students already write review notes in Markdown, but spaced-repetition tools usually need a more rigid card format. This project keeps notes readable while making them easy to export.
The project goal is practical and modest:
- write notes in Markdown;
- mark reusable question-answer blocks;
- export Anki-compatible CSV;
- keep the format simple enough for beginners to understand and contribute.
Install
From PyPI, after the package is published:
python -m pip install exam-cardforge
From GitHub:
python -m pip install "exam-cardforge @ git+https://github.com/Elysyrus/exam-cardforge.git"
Verify the command is available:
exam-cardforge --help
Install for local development
python -m venv .venv
.venv\Scripts\activate
python -m pip install -e . pytest
On macOS or Linux, activate the environment with:
source .venv/bin/activate
Quick start
Create a sample note:
exam-cardforge sample -o examples/408.md
Build an Anki CSV:
exam-cardforge build examples/408.md -o dist/408-anki.csv
Show tag statistics:
exam-cardforge stats examples/408.md
Check whether notes are valid and detect duplicate questions:
exam-cardforge lint examples/408.md
Card syntax
Write cards inside :::card blocks:
:::card tags=408,data-structure,stack
Q: 栈为什么适合检查括号匹配?
A: 因为括号匹配具有“后打开的先关闭”的特点,正好对应栈的后进先出。
:::
Decks can be attached with deck=:
:::card tags=408,os deck=408::OS
Q: 进程和程序的核心区别是什么?
A: 程序是静态代码,进程是程序在某次运行中的动态实体。
:::
Multi-line cards are supported:
:::card tags=408,os
Q:
进程和程序的核心区别是什么?
A:
程序是静态代码。
进程是程序在某次运行中的动态实体,拥有运行状态和资源。
:::
Cloze syntax
Use :::cloze blocks for Anki Cloze cards:
:::cloze tags=408,co,memory deck=408::ComputerOrganization
局部性原理包括{{c1::时间局部性}}和{{c2::空间局部性}}。
:::
The generated CSV includes Front, Back, Tags, Deck, and Note Type columns. In Anki, map Cloze rows to the Cloze note type.
Import into Anki
- Run
exam-cardforge build. - Open Anki.
- Choose
File > Import. - Select the generated CSV file.
- Map columns as
Front,Back, andTags.
Roadmap
See ROADMAP.md for the active maintenance plan.
Contributing
Bug reports, syntax suggestions, parser improvements, and documentation fixes are welcome. See CONTRIBUTING.md.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file exam_cardforge-0.3.0.tar.gz.
File metadata
- Download URL: exam_cardforge-0.3.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4ae91921203e6565b98e172c6810daee846a88e2fe7713e5824342f744ee413
|
|
| MD5 |
86ee82879f0b3158a237f1fe4536fb1e
|
|
| BLAKE2b-256 |
e277143699ffffeb7d8fb3e9911cbd0e30f18edfefaaf61dd48e2101be6fc732
|
Provenance
The following attestation bundles were made for exam_cardforge-0.3.0.tar.gz:
Publisher:
publish.yml on Elysyrus/exam-cardforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exam_cardforge-0.3.0.tar.gz -
Subject digest:
e4ae91921203e6565b98e172c6810daee846a88e2fe7713e5824342f744ee413 - Sigstore transparency entry: 1692674735
- Sigstore integration time:
-
Permalink:
Elysyrus/exam-cardforge@35f3d36d34b19ddd633a67f6075403cb91aa5b70 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Elysyrus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@35f3d36d34b19ddd633a67f6075403cb91aa5b70 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file exam_cardforge-0.3.0-py3-none-any.whl.
File metadata
- Download URL: exam_cardforge-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53232f8d11cd158661fc5cd3f8c00bd96731e4c3d4b31dbe156b72086c7b9ac7
|
|
| MD5 |
afeef2ed20452ced6892a3b7a6ff4339
|
|
| BLAKE2b-256 |
3bc1ecd13efc88d1226a847590eae0eacefa5bbda93b2f66024bced4f851c825
|
Provenance
The following attestation bundles were made for exam_cardforge-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on Elysyrus/exam-cardforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exam_cardforge-0.3.0-py3-none-any.whl -
Subject digest:
53232f8d11cd158661fc5cd3f8c00bd96731e4c3d4b31dbe156b72086c7b9ac7 - Sigstore transparency entry: 1692674842
- Sigstore integration time:
-
Permalink:
Elysyrus/exam-cardforge@35f3d36d34b19ddd633a67f6075403cb91aa5b70 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Elysyrus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@35f3d36d34b19ddd633a67f6075403cb91aa5b70 -
Trigger Event:
workflow_dispatch
-
Statement type: