slavetto / anki-cards-web-browser

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șierul 1 se numește de fapt latex-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 caracterul 0x1f (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 tabelul cards 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 tabelul cards, în coloana did pentru a specifica asocierile dintre cărți și pachete (explicate mai târziu). Rețineți că pachetul implicit are întotdeauna id-ul 1.
  • 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âmpul ord 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ă:

Lasă un comentariu