Was ist das?
Dieses Dokument erklärt, wie die Verarbeitung der apkg-Archive funktionieren soll.
Struktur der .apkg-Dateien
Die Anki .apkg-Dateien sind einfach Zip-Archive, die die folgenden Dateien enthalten:
-
collection.anki2
: Eine Sqlite-Datenbank, die Karten, Notizen, Notizenmodelle usw. enthält. - Dateien namens
1
,2
,3
,4
…: Die Bilder, die die Karten verwenden -
media
: Eine json-Datei, die Zuordnungen zwischen Bildern und ihren Originalnamen enthält (z.B. heißt die Datei1
in den Karten tatsächlichlatex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png
).
Die Struktur der collection.anki2
Dies ist die eigentliche Datenbank, die alle Notizen und andere nützliche Informationen enthält, die wir verwenden werden, um den Viewer zu generieren. In diesem Dokument werden wir nur beschreiben, was wir aus der Datenbank abrufen müssen, um den Viewer zu generieren.
Abrufen von Notizen
Die Notizen sind in der Tabelle notes
gespeichert. Die Spalten, die wir aus dieser Tabelle benötigen, sind:
-
id
: Der eindeutige Bezeichner der Notiz -
mid
: Die ID des Kartenmodells (wie man sie erhält, wird später beschrieben) -
tags
: Die mit der Notiz verbundenen Tags -
fld
: Die Felder der Notiz. Es enthält alle Felder, die durch das Zeichen0x1f
(31) getrennt sind, und muss in das Kartenmodell eingegeben werden, um die Karten zu erstellen. Die Reihenfolge der Felder entspricht genau der im Modell der Notiz.
Abrufen von Kartenmodellen
Um die Karten aus den Notizen erzeugen zu können, müssen wir das Kartenmodell abrufen. Das Modell sagt uns, wie viele Karten aus einer einzelnen Notiz generiert werden müssen, wie der HTML-Code um die Notiz herum aussieht und wie die Felder von notes.fld
dargestellt werden müssen.
Das Modell befindet sich in der Spalte models
der Tabelle col
. Beachten Sie, dass die Tabelle col
immer nur einen Datensatz enthält. Das Modell wird in einem JSON-Format gespeichert; dies ist ein Beispiel dafür, wie das JSON eines Modells mit zwei Modellen aussieht:
{ "1471435193999": { "vers": , "name": "Istruzioni Assembly", "tags": , "did": 1493040141981, "usn": 625, "req": ], ] ], "flds": , "sticky": false, "rtl": false, "ord": 0, "font": "Arial", "size": 20 }, { "name": "Descrizione", "media": , "sticky": false, "rtl": false, "ord": 1, "font": "Arial", "size": 20 }, { "name": "Architettura", "media": , "sticky": true, "rtl": false, "ord": 2, "font": "Arial", "size": 20 } ], "sortf": 0, "tmpls": , "mod": 1493150692, "latexPost": "\end{document}", "type": 0, "id": "1471435193999", "css": ".card {\n font-family: arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n", "latexPre": "\documentclass{article}\n\special{papersize=3in,5in}\n\usepackage{inputenc}\n\usepackage{amssymb,amsmath}\n\pagestyle{empty}\n\setlength{\parindent}{0in}\n\begin{document}\n" }, "1471435194000": { "vers": , "name": "Base (default)", "tags": , "did": 1492955368330, "usn": 668, "req": ] ], "flds": , "sticky": false, "rtl": false, "ord": 0, "font": "Arial", "size": 20 }, { "name": "Retro", "media": , "sticky": false, "rtl": false, "ord": 1, "font": "Arial", "size": 20 } ], "sortf": 0, "tmpls": , "mod": 1494091839, "latexPost": "\end{document}", "type": 0, "id": 1471435194000, "css": ".card {\n font-family: Arial;\n font-size: 20px;\n text-align: center;\n color: black;\n background-color: white;\n}\n\nimg {\n vertical-align: middle;\n padding-bottom: 7px;\n padding-right: 6px;\n padding-left: 6px\n}", "latexPre": "\documentclass{article}\n\special{papersize=3in,5in}\n\usepackage{inputenc}\n\usepackage{amssymb,amsmath}\n\pagestyle{empty}\n\setlength{\parindent}{0in}\n\begin{document}\n" }}
In derselben URL, die bereits erwähnt wurde, gibt es eine sehr schöne Beschreibung der Funktionen der einzelnen Felder des Modells. Hier werden nur diejenigen beschrieben, die wir benötigen, um den Kartenbrowser zu erstellen.
Im Stamm des Objekts gibt es einen "1471435193999"
Schlüssel. Dieser Schlüssel ist die ID des Modells, die in der Spalte mid
der Tabelle notes
angegeben ist.
In diesem Objekt gibt es ein Array mit dem Schlüssel "flds"
. Dieses Array enthält die Felder, die die Karten beim Erstellen von Notizen angeben. Normalerweise gibt es nur die Felder „Vorderseite“ und „Rückseite“, aber je nach Modell können auch mehr verschiedene Felder vorhanden sein. Wie bereits erwähnt, speichern die Notizen diese Informationen in der notes.fld
Spalte; die Felder der Spalte sind in der gleichen Reihenfolge wie die Felddefinitionen in diesem Array.
Das "tmpls"
Objekt enthält Vorlagen der Notizen und liefert Informationen über die HTML-Struktur der Karten. Modelle, die mehrere Vorlagen definieren, erzeugen mehrere Karten, eine für jede Vorlage. Dieses Objekt hat zwei wichtige Felder:
-
"qfmt"
: Das HTML der Vorderseite der Karte -
"afmt"
: Das HTML der Rückseite der Karte -
"ord"
: Die Position der Vorlage im"tmpls"
-Array. Dies wird von der Tabellecards
verwendet, um die Vorlage zu identifizieren, die die Karte erzeugt hat.
Diese Felder können {{placeholders}}
enthalten, die durch die Werte der Felder ersetzt werden müssen, die die Karten in notes.fld
speichern. Die Assoziation zwischen Feldposition und Feldname ist diejenige der Objekte in "flds"
. Beachten Sie, dass "afmt"
einen speziellen Platzhalter namens {{FrontSide}}
enthalten kann; dies ist nur ein praktischer Weg, um den Inhalt der Karte anzuzeigen, ohne den Inhalt von "qfmt"
beim Erstellen von Kartenmodellen kopieren & und einfügen zu müssen.
Das letzte Feld, das uns interessiert, ist "css"
; es enthält den CSS-Code, der auf die Karte angewendet werden muss.
Abrufen von Deckinformationen
Die Informationen über die im Archiv enthaltenen Decks werden in der Spalte col.decks
im JSON-Format gespeichert. Hier ist ein Beispiel für JSON:
{ "1": { "desc": "", "name": "Predefinito", "extendRev": 50, "usn": 0, "collapsed": false, "newToday": , "timeToday": , "dyn": 0, "extendNew": 10, "conf": 1, "revToday": , "lrnToday": , "id": 1, "mod": 1494099120 }, "1493040141981": { "extendRev": 50, "collapsed": false, "newToday": , "timeToday": , "dyn": 0, "extendNew": 10, "conf": 1, "revToday": , "lrnToday": , "id": 1493040141981, "mod": 1494073733, "name": "Universit\u00e0 - Calcolatori::Assembly", "usn": 661, "browserCollapsed": true, "mid": 1471435194000, "desc": "" }, "1492955368330": { "extendRev": 50, "collapsed": false, "newToday": , "timeToday": , "dyn": 0, "extendNew": 10, "conf": 1, "revToday": , "lrnToday": , "id": 1492955368330, "mod": 1494095504, "name": "Universit\u00e0 - Calcolatori", "usn": 671, "browserCollapsed": true, "mid": 1471435194000, "desc": "" }}
Einige Felder, die beachtet werden sollten:
-
id
: Eindeutige ID des Decks. Die ID wird in der Tabellecards
in der Spaltedid
verwendet, um die Zuordnungen zwischen Karten und Decks zu spezifizieren (wird später erklärt). Beachten Sie, dass das Standarddeck immer die ID1
hat. -
name
: Der Name des Decks. Im Falle von untergeordneten Decks wird der Name im Format „Name des übergeordneten Decks::Name des untergeordneten Decks“
Abrufen von Karten
Die Informationen über Karten werden in der Tabelle cards
gespeichert. Die Spalten, die wir aus dieser Tabelle benötigen, sind:
-
id
: eindeutige Kennung der Karte -
nid
: Kennung der Notiz, die diese Karte erzeugt hat -
did
: Kennung des Decks, in dem diese Karte enthalten ist -
ord
: die Position der Vorlage des Modells; sie entspricht dem Feldord
der Vorlage.
Die Struktur der Mediendatei
media
ist eine JSON-Datei, die die Codenamen der Bilder mit ihren Originalnamen verbindet. Während der Erstellung der .apkg Datei komprimiert anki die Namen der Bilder (eigentlich benennt es diese nur mit fortlaufenden Nummern), aber die Karten beziehen sich immer noch auf den Originalnamen. Der Zweck der media
Datei ist es, uns in die Lage zu versetzen, numerische Namen in die Originalnamen der Bilder zu übersetzen.
Die Struktur von media
ist ziemlich einfach: