Ce este aceasta?
Acest document explică modul în care ar trebui să funcționeze procesarea arhivelor apkg.
Structura fișierelor .apkg
Arhivele Anki .apkg sunt doar arhive zip care conțin următoarele fișiere:
-
collection.anki2
: O bază de date sqlite care conține cărți, note, modele de note, etc… - Filele numite
1
,2
,3
,4
…: Imaginile pe care le folosesc cardurile -
media
: Un fișier json care conține corespondențe între imagini și denumirile originale ale acestora (de exemplu: fișierul1
se numește de faptlatex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png
în carduri).
Structura colecției.anki2
Aceasta este baza de date propriu-zisă care conține toate notele și alte informații utile pe care le vom folosi pentru a genera vizualizatorul. Există un ghid foarte detaliat despre ce anume conține baza de date.În acest document vom descrie doar ceea ce va trebui să extragem din baza de date pentru a genera vizualizatorul.
Preluarea notelor
Notele sunt stocate în tabelul notes
. Coloanele de care avem nevoie din acel tabel sunt:
-
id
: Identificatorul unic al notei -
mid
: ID-ul modelului de carduri (se descrie mai târziu cum să îl obținem) -
tags
: Etichetele asociate notei -
fld
: Câmpurile notei. Acesta trebuie să fie introdus în modelul de carduri pentru a genera cardurile.Conține toate câmpurile, separate prin caracterul0x1f
(31). Ordinea câmpurilor este exact cea prezentată în modelul notei.
Preluarea modelelor de carduri
Pentru a putea genera carduri din note, trebuie să preluăm modelul de carduri. Modelul ne spune câte carduri trebuie să fie generate dintr-o singură notă, care este HTML-ul care înconjoară nota, cum trebuie prezentate câmpurile din notes.fld
.
Modelul poate fi găsit în coloana models
a tabelului col
. Rețineți că tabelul col
conține întotdeauna o singură înregistrare. Modelul este stocat într-un format JSON; acesta este un exemplu de cum arată JSON-ul unui model cu două modele:
{ "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" }}
În același URL menționat anteriorexistă o descriere foarte bună a ceea ce face fiecare câmp al modelului. Aici vor fi descrise doar cele de care avem nevoie pentru a crea browserul de carduri.
În rădăcina obiectului, există o cheie "1471435193999"
. Acea cheie este id-ul acelui model.Acest lucru este menționat în coloana mid
a tabelului notes
.
În interiorul acelui obiect există o matrice cu cheia "flds"
. Această matrice conține câmpurile pe care cardurile le specifică la crearea notelor. De obicei, există doar câmpurile „Front” și „Rear”, însă, în funcție de model, este posibil să existe mai multe câmpuri diferite. După cum s-a menționat anterior, notele stochează aceste informații în coloana notes.fld
; câmpurile coloanei sunt în aceeași ordine cu definițiile câmpurilor din acest tablou.
Obiectul "tmpls"
conține șabloane ale notelor și oferă informații despre structura HTML a cardurilor. Modelele care definesc mai multe șabloane generează mai multe fișe, câte una pentru fiecare șablon. Acest obiect are două câmpuri importante:
-
"qfmt"
: Codul HTML al părții din față a cărții -
"afmt"
: Codul HTML al părții din spate a cărții -
"ord"
: Poziția șablonului în matricea"tmpls"
. Aceasta este utilizată de tabelulcards
pentru a identifica șablonul care a generat cardul.
Aceste câmpuri pot conține {{placeholders}}
care trebuie să fie înlocuite cu valorile câmpurilor pe care cardurile le stochează în notes.fld
. Asocierea dintre poziția câmpului ș i numele câmpului este cea a obiectelor din "flds"
. Rețineți că "afmt"
poate conține un spațiu special numit {{FrontSide}}
; acesta este doar un mod practic de a afișa conținutul cardului fără a fi nevoie să copiați & și să lipiți conținutul lui "qfmt"
în timpul creării modelelor de carduri.
Ultimul câmp care ne interesează este "css"
; acesta conține codul CSS care trebuie aplicat cărții.
Preluarea informațiilor despre pachete
Informațiile despre pachetele conținute în arhivă sunt stocate în coloana col.decks
în format JSON. Iată un exemplu de 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": "" }}
Câteva câmpuri care ar trebui să fie observate:
-
id
: Id unic al pachetului. Id-ul este utilizat în tabelulcards
, în coloanadid
pentru a specifica asocierile dintre cărți și pachete (explicate mai târziu). Rețineți că pachetul implicit are întotdeauna id-ul1
. -
name
: Numele pachetului. În cazul pachetelor copil, numele va fi în formatul „Parent deck name::Child deck name”
Obținerea cărților
Informațiile despre cărți sunt stocate în tabelul cards
. Coloanele de care avem nevoie din acel tabel sunt:
-
id
: identificatorul unic al cardului -
nid
: id-ul notei care a generat acest card -
did
: identificatorul id-ului pachetului în care este conținut acest card -
ord
: poziția șablonului modelului; se potrivește cu câmpulord
al șablonului.
Structura fișierului media
media
este un fișier JSON care asociază numele de cod ale imaginilor cu numele lor originale. Rețineți că orice câmp al cardului poate conține imagini, dar imaginile sunt asociate cu numele lor complet. în timpul creării fișierului .apkg, anki comprimă numele imaginilor (de fapt, le numește doar cu numere progresive), însă cardurile continuă să facă referire la numele original. Scopul fișierului media
este de a ne face capabili să traducem numele numerice în numele original al imaginilor.
Structura fișierului media
este destul de simplă: