slavetto / anki-cards-web-browser

Wat is dit?

Dit document legt uit hoe de verwerking van de apkg archieven zou moeten werken.

Structuur van .apkg bestanden

De Anki .apkg bestanden zijn gewoon zip archieven die de volgende bestanden bevatten:

  • collection.anki2: Een sqlite database met kaarten, notities, notitie modellen, enz…
  • Bestanden met de namen 1,2,3,4…: De afbeeldingen die de kaarten gebruiken
  • media: Een json bestand met mappings tussen afbeeldingen en zijn originele namen (bv: bestand 1 heet eigenlijk latex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png in de kaarten).

De structuur van collection.anki2

Dit is de eigenlijke database die alle notities en andere nuttige informatie bevat die we zullen gebruiken om de viewer te genereren. Er is een zeer gedetailleerde gids over wat de database precies bevat. In dit document zullen we alleen beschrijven wat we uit de database moeten halen om de viewer te genereren.

Notities ophalen

De notities zijn opgeslagen in de notes tabel. De kolommen die we nodig hebben uit die tabel zijn:

  • id: De unieke identificatie van de noot
  • mid: De ID van het kaarten model (later beschreven hoe het te krijgen)
  • tags: De tags geassocieerd met de noot
  • fld: De velden van de noot. Dit moet in het kaartenmodel ingevoerd worden om de kaarten te genereren. Het bevat alle velden, gescheiden door het teken 0x1f (31). De volgorde van de velden is precies die in het model van de biljet.

Kaartenmodel ophalen

Om de kaarten uit de biljetten te kunnen genereren, moeten we het kaartenmodel ophalen. Het model vertelt ons hoeveel kaarten moeten worden gegenereerd uit een enkele biljet, wat de HTML is rond het biljet, hoe de velden van notes.fld moeten worden gepresenteerd.

Het model kan worden gevonden in de models kolom van de col tabel. Merk op dat de tabel col altijd slechts één record bevat. Het model wordt opgeslagen in een JSON formaat; dit is een voorbeeld van hoe de JSON van een model met twee modellen eruit ziet:

{ "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 dezelfde URL die eerder werd genoemd, staat een zeer mooie beschrijving van wat elk veld van het model doet. Hier zullen alleen diegene beschreven worden die we nodig hebben om de kaarten browser te maken.

In de root van het object, is er een "1471435193999" sleutel. Die sleutel is de id van dat model. Die staat in de kolom mid van de tabel notes.

In dat object is er een array met sleutel "flds". Deze array bevat de velden die de kaarten specificeren bij het maken van aantekeningen. Gewoonlijk zijn er slechts “Voor” en “Achter” velden, maar, afhankelijk van het model, is het mogelijk om meer verschillende velden te hebben. Zoals eerder vermeld, slaan de noten deze informatie op in de notes.fld kolom; de velden van de kolom staan in dezelfde volgorde als de velddefinities in deze array.

Het "tmpls" object bevat sjablonen van de noten en geeft informatie over de HTML-structuur van de kaarten. Modellen die meerdere sjablonen definiëren genereren meerdere kaarten, één voor elk sjabloon. Dit object heeft twee belangrijke velden:

  • "qfmt": De HTML van de voorzijde van de kaart
  • "afmt": De HTML van de achterzijde van de kaart
  • "ord": De positie van het sjabloon in de "tmpls" array. Dit wordt door de cards tabel gebruikt om het sjabloon te identificeren dat de kaart heeft gegenereerd.

Deze velden kunnen {{placeholders}} bevatten die moeten worden gesubstitueerd met de waarden van de velden die de kaarten in notes.fld opslaan. De associatie tussen veldpositie en veldnaam is die van de objecten in "flds". Merk op dat "afmt" een speciale plaatshouder kan bevatten, {{FrontSide}} genaamd; dit is slechts een handige manier om de inhoud van de kaart te tonen zonder dat & de inhoud van "qfmt" moet worden gekopieerd en geplakt tijdens het maken van kaartmodellen.

Het laatste veld van onze interesse is "css"; het bevat de CSS code die moet worden toegepast op de kaart.

Het ophalen van deck informatie

De informatie over de decks in het archief wordt opgeslagen in de col.decks kolom inJSON formaat. Hier is een voorbeeld 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": "" }}

Enkele velden die opgemerkt moeten worden:

  • id: Unieke id van het deck. De id wordt gebruikt in de cards tabel, in de did kolom om de associaties tussen kaarten en kaartspellen te specificeren (wordt later uitgelegd). Merk op dat het standaard kaartspel altijd id 1 heeft.
  • name: De naam van het kaartspel. In het geval van kind-decks, zal de naam in het formaat “Parent deck name::Child deck name”

Kaarten ophalen

De informatie over kaarten worden opgeslagen in de cards tabel. De kolommen die we uit die tabel nodig hebben zijn:

  • id: unieke identificator van de kaart
  • nid: id van de noot die deze kaart heeft gegenereerd
  • did: id-identificator van het kaartspel waarin deze kaart zich bevindt
  • ord: de positie van het sjabloon van het model; het komt overeen met het ord-veld van het sjabloon.

De structuur van het mediabestand

media is een JSON-bestand dat de codenamen van de afbeeldingen koppelt aan de oorspronkelijke namen. Tijdens de creatie van het .apkg bestand comprimeert Anki de namen van de afbeeldingen (eigenlijk hernoemt het deze met progressieve nummers), maar de kaarten blijven nog steeds verwijzen naar de originele naam. Het doel van het media bestand is om ons in staat te stellen numerieke namen te vertalen in de originele namen van de plaatjes.

De structuur van media is vrij recht-voor-zijn-raap:

Plaats een reactie