All Projects → kerrickstaley → Genanki

kerrickstaley / Genanki

Licence: mit
A Python 3 library for generating Anki decks

Programming Languages

python
139335 projects - #7 most used programming language

Labels

Projects that are alternatives of or similar to Genanki

anki-youdao2anki
转换有道单词本到Anki格式
Stars: ✭ 24 (-96.62%)
Mutual labels:  anki
Anki-decks-deeplearning.ai
This repository contains flashcard decks for DeepLearning.ai courses.
Stars: ✭ 43 (-93.95%)
Mutual labels:  anki
Polar Bookshelf
Polar is a personal knowledge repository for PDF and web content supporting incremental reading and document annotation.
Stars: ✭ 4,411 (+520.39%)
Mutual labels:  anki
Fabricius
Fabricius is an Anki plugin that bidirectionally syncs between Roam and Anki.
Stars: ✭ 54 (-92.41%)
Mutual labels:  anki
brain-brew
Automated Anki flashcard creation and extraction to/from Csv
Stars: ✭ 55 (-92.26%)
Mutual labels:  anki
Anki Android
AnkiDroid: Anki flashcards on Android. Your secret trick to achieve superhuman information retention.
Stars: ✭ 4,425 (+522.36%)
Mutual labels:  anki
slipbox
A static site generator for Zettelkasten notes
Stars: ✭ 32 (-95.5%)
Mutual labels:  anki
Awesome Anki
A curated list of awesome Anki add-ons, decks and resources
Stars: ✭ 553 (-22.22%)
Mutual labels:  anki
chinese-support-redux
Anki add-on providing support for Chinese study
Stars: ✭ 88 (-87.62%)
Mutual labels:  anki
Anki Editor
Emacs minor mode for making Anki cards with Org
Stars: ✭ 453 (-36.29%)
Mutual labels:  anki
vocage
A minimalistic spaced-repetion vocabulary trainer (flashcards) for the terminal
Stars: ✭ 68 (-90.44%)
Mutual labels:  anki
image-occlusion-in-browser
Create image occlusion in browser
Stars: ✭ 20 (-97.19%)
Mutual labels:  anki
Anki Sync Server
Self-hosted Anki sync server
Stars: ✭ 352 (-50.49%)
Mutual labels:  anki
anki-mode
An Emacs major mode for creating anki cards
Stars: ✭ 47 (-93.39%)
Mutual labels:  anki
Vector Python Sdk
Anki Vector Python SDK
Stars: ✭ 462 (-35.02%)
Mutual labels:  anki
Anki Templates
For language Grammar
Stars: ✭ 70 (-90.15%)
Mutual labels:  anki
Anki Ultimate Geography
Geography flashcard deck for Anki
Stars: ✭ 330 (-53.59%)
Mutual labels:  anki
Odh
A chrome extension to show online dictionary content.
Stars: ✭ 695 (-2.25%)
Mutual labels:  anki
Yomichan
Japanese pop-up dictionary extension for Chrome and Firefox.
Stars: ✭ 464 (-34.74%)
Mutual labels:  anki
Obsidian to anki
Script to add flashcards from text/markdown files to Anki
Stars: ✭ 382 (-46.27%)
Mutual labels:  anki

genanki: A Library for Generating Anki Decks

genanki allows you to programatically generate decks in Python 3 for Anki, a popular spaced-repetition flashcard program. Please see below for concepts and usage.

This library and its author(s) are not affiliated/associated with the main Anki project in any way.

Build Status

Notes

The basic unit in Anki is the Note, which contains a fact to memorize. Notes correspond to one or more Cards.

Here's how you create a Note:

my_note = genanki.Note(
  model=my_model,
  fields=['Capital of Argentina', 'Buenos Aires'])

You pass in a Model, discussed below, and a set of fields (encoded as HTML).

Models

A Model defines the fields and cards for a type of Note. For example:

my_model = genanki.Model(
  1607392319,
  'Simple Model',
  fields=[
    {'name': 'Question'},
    {'name': 'Answer'},
  ],
  templates=[
    {
      'name': 'Card 1',
      'qfmt': '{{Question}}',
      'afmt': '{{FrontSide}}<hr id="answer">{{Answer}}',
    },
  ])

This note-type has two fields and one card. The card displays the Question field on the front and the Question and Answer fields on the back, separated by a <hr>. You can also pass a css argument to Model() to supply custom CSS.

You need to pass a model_id so that Anki can keep track of your model. It's important that you use a unique model_id for each Model you define. Use import random; random.randrange(1 << 30, 1 << 31) to generate a suitable model_id, and hardcode it into your Model definition.

Generating a Deck/Package

To import your notes into Anki, you need to add them to a Deck:

my_deck = genanki.Deck(
  2059400110,
  'Country Capitals')

my_deck.add_note(my_note)

Once again, you need a unique deck_id that you should generate once and then hardcode into your .py file.

Then, create a Package for your Deck and write it to a file:

genanki.Package(my_deck).write_to_file('output.apkg')

You can then load output.apkg into Anki using File -> Import...

Media Files

To add sounds or images, set the media_files attribute on your Package:

my_package = genanki.Package(my_deck)
my_package.media_files = ['sound.mp3', 'images/image.jpg']

media_files should have the path (relative or absolute) to each file. To use them in notes, first add a field to your model, and reference that field in your template:

my_model = genanki.Model(
  1091735104,
  'Simple Model with Media',
  fields=[
    {'name': 'Question'},
    {'name': 'Answer'},
    {'name': 'MyMedia'},                                  # ADD THIS
  ],
  templates=[
    {
      'name': 'Card 1',
      'qfmt': '{{Question}}<br>{{MyMedia}}',              # AND THIS
      'afmt': '{{FrontSide}}<hr id="answer">{{Answer}}',
    },
  ])

Then, set the MyMedia field on your card to [sound:sound.mp3] for audio and <img src="image.jpg"> for images.

You cannot put <img src="{MyMedia}"> in the template and image.jpg in the field. See these sections in the Anki manual for more information: Importing Media and Media & LaTeX.

You should only put the filename (aka basename) and not the full path in the field; <img src="images/image.jpg"> will not work. Media files should have unique filenames.

Note GUIDs

Notes have a guid property that uniquely identifies the note. If you import a new note that has the same GUID as an existing note, the new note will overwrite the old one (as long as their models have the same fields).

This is an important feature if you want to be able to tweak the design/content of your notes, regenerate your deck, and import the updated version into Anki. Your notes need to have stable GUIDs in order for the new note to replace the existing one.

By default, the GUID is a hash of all the field values. This may not be desirable if, for example, you add a new field with additional info that doesn't change the identity of the note. You can create a custom GUID implementation to hash only the fields that identify the note:

class MyNote(genanki.Note):
  @property
  def guid(self):
    return genanki.guid_for(self.fields[0], self.fields[1])

sort_field

Anki has a value for each Note called the sort_field. Anki uses this value to sort the cards in the Browse interface. Anki also is happier if you avoid having two notes with the same sort_field, although this isn't strictly necessary. By default, the sort_field is the first field, but you can change it by passing sort_field= to Note() or implementing sort_field as a property in a subclass (similar to guid).

You can also pass sort_field_index= to Model() to change the sort field. 0 means the first field in the Note, 1 means the second, etc.

YAML for Templates (and Fields)

You can create your template definitions in the YAML format and pass them as a str to Model(). You can also do this for fields.

Using genanki inside an Anki addon

genanki supports adding generated notes to the local collection when running inside an Anki 2.1 addon (Anki 2.0 may work but has not been tested). See the .write_to_collection_from_addon() method.

FAQ

My field data is getting garbled

If fields in your notes contain literal <, >, or & characters, you need to HTML-encode them: field data is HTML, not plain text. You can use the html.escape function.

For example, you should write

fields=['AT&amp;T was originally called', 'Bell Telephone Company']

or

fields=[html.escape(f) for f in ['AT&T was originally called', 'Bell Telephone Company']]

This applies even if the content is LaTeX; for example, you should write

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

Publishing to PyPI

If your name is Kerrick, you can publish the genanki package to PyPI by running these commands from the root of the genanki repo:

rm -rf dist/*
python3 setup.py sdist bdist_wheel
python3 -m twine upload dist/*

Note that this directly uploads to prod PyPI and skips uploading to test PyPI.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].