slavetto / anki-cards-web-browser

Hvad er dette?

Dette dokument forklarer, hvordan behandlingen af apkg-arkiverne skal fungere.

Opbygning af .apkg-filer

Anki .apkg-filerne er blot zip-arkiver, der indeholder følgende filer:

    • collection.anki2:
    • Filer med navnene 1,2,3,4….: De billeder, som kortene bruger
    • media: En json-fil, der indeholder mappings mellem billederne og deres oprindelige navne (f.eks. fil 1 hedder faktisk latex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png i kortene).

    Strukturen af collection.anki2

    Dette er den egentlige database, der indeholder alle noter og andre nyttige oplysninger, som vi vil bruge til at generere viseren. Der findes en meget detaljeret vejledning om, hvad databasen præcist indeholder. i dette dokument vil vi blot beskrive, hvad vi skal trække fra databasen for at generere fremviseren.

    Hentning af noter

    Noterne er gemt i tabellen notes. De kolonner, vi har brug for fra denne tabel, er:

    • id: Notens unikke identifikator
    • mid: Kortmodellens ID (beskrevet senere, hvordan man får det)
    • tags: De tags, der er knyttet til noten
    • fld: Notens felter. Dette skal indlæses i kortmodellen for at generere kortene.Det indeholder alle felterne, adskilt med tegnet 0x1f (31). Felternes rækkefølge er nøjagtig den samme som i notens model.

    Hentning af kortmodeller

    For at kunne generere kortene ud fra noterne skal vi hente kortmodellen. Modellen fortæller os, hvor mange kort der skal genereres fra en enkelt note, hvad der er HTML omkring noten, hvordan felterne i notes.fld skal præsenteres.

    Modellen findes i models-kolonnen i col-tabellen. Bemærk, at col-tabellen altid kun indeholder en enkeltoptegnelse. Modellen er gemt i et JSON-format; dette er et eksempel på, hvordan en models JSON med to modeller ser ud:

{ "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" }}

I den samme URL som tidligere nævnt er der en meget fin beskrivelse af, hvad hvert enkelt felt i modellen gør. Her vil kun blive beskrevet dem, vi har brug for til at oprette kortbrowseren.

I objektets rod er der en "1471435193999"-nøgle. Denne nøgle er id’et for denne model.Dette er nævnt i mid-kolonnen i notes-tabellen.

Inden for dette objekt er der et array med nøglen "flds". Dette array indeholder de felter, som kortene angiver, når de opretter noter. Normalt er der kun “Front”- og “Rear”-felter, men afhængigt af modellen er det muligt at have flere forskellige felter. Som tidligere nævnt gemmer noterne disse oplysninger i kolonnen notes.fld; felterne i kolonnen er i samme rækkefølge som feltdefinitionerne i dette array.

Objektet "tmpls" indeholder skabeloner for noterne og giver oplysninger om kortets HTML-struktur. Modeller, der definerer flere skabeloner, genererer flere kort, et for hver skabelon. Dette objekt har to vigtige felter:

  • "qfmt": HTML for forsiden af kortet
  • "afmt": HTML for bagsiden af kortet
  • "ord": Skabelonens position i "tmpls" arrayet. Dette bruges af tabellen cards til at identificere den skabelon, der har genereret kortet.

Disse felter kan indeholde {{placeholders}}, som skal erstattes med værdierne af de felter, som kortene gemmer i notes.fld. Sammenhængen mellem feltposition og feltnavn er den samme som den, der gælder for objekterne i "flds". Bemærk, at "afmt" kan indeholde en særligplaceholder kaldet {{FrontSide}}; dette er blot en praktisk måde at vise indholdet af kortet på uden at skulle kopiere & indsætte indholdet af "qfmt", mens man opretter kortmodeller.

Det sidste felt af vores interesse er "css"; det indeholder CSS-koden, der skal anvendes på kortet.

Hentning af dækoplysninger

Informationerne om de dæk, der er indeholdt i arkivet, gemmes i col.decks-kolonnen iJSON-format. Her er et eksempel på 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": "" }}

Nogle felter, der skal bemærkes:

  • id: Unikt id for dækket. Id’et bruges i tabellen cards i kolonnen did til at specificere forbindelserne mellem kort og dæk (forklares senere). Bemærk, at standarddækket altid har id 1.
  • name: Dækkets navn. I tilfælde af underordnede dæk vil navnet være i formatet “Parent deck name::Child deck name”

Hentning af kort

Informationerne om kort gemmes i tabellen cards. De kolonner, vi har brug for fra denne tabel, er:

  • id: kortets unikke identifikator
  • nid: id for den note, der genererede dette kort
  • did: id-identifikator for det dæk, hvor dette kort er indeholdt
  • ord: positionen for modellens skabelon; den passer til skabelonens ord-felt.

Strukturen af mediefilen

media er en JSON-fil, der tilknytter billedernes kodenavne til deres oprindelige navne. Bemærk, at alle kortfelter kan indeholde billeder, men billederne er forbundet med deres fulde navn. under oprettelsen af .apkg-filen komprimerer anki billedernes navne (faktisk navngiver den dem bare med progressive numre), men kortene henviser stadig til det oprindelige navn. Formålet med media-filen er at gøre os i stand til at oversætte numeriske navne i billedernes oprindelige navne.

Strukturen af media er ret ligetil:

Skriv en kommentar