slavetto / anki-cards-web-browser

Co to jest?

Ten dokument wyjaśnia, jak powinno działać przetwarzanie archiwów apkg.

Struktura plików .apkg

Pliki .apkg Anki to po prostu archiwa zip zawierające następujące pliki:

  • collection.anki2: Baza danych sqlite zawierająca karty, notatki, modele notatek, itd…
  • Pliki o nazwach 1,2,3,4…: Obrazy, których używają karty
  • media: Plik json zawierający mapowania pomiędzy obrazkami i ich oryginalnymi nazwami (np: plik 1 jest w rzeczywistości nazywany latex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png w kartach).

Struktura kolekcji.anki2

To jest rzeczywista baza danych, która zawiera wszystkie notatki i inne przydatne informacje, których użyjemy do wygenerowania przeglądarki. W tym dokumencie opiszemy tylko to, co będziemy musieli pobrać z bazy danych, aby wygenerować przeglądarkę.

Pobieranie notatek

Notatki są przechowywane w tabeli notes. Kolumny, które potrzebujemy z tej tabeli to:

  • id: Unikalny identyfikator notatki
  • mid: Identyfikator modelu kart (opisany później jak go uzyskać)
  • tags: Tagi powiązane z notatką
  • fld: Pola notatki. To musi być wprowadzone do modelu kart, aby wygenerować karty. Zawiera wszystkie pola, oddzielone znakiem 0x1f (31). Kolejność pól jest dokładnie taka, jak w modelu notatki.

Pobieranie modeli kart

Aby móc wygenerować karty z notatek, musimy pobrać model kart. Model mówi nam ile kart ma być wygenerowanych z jednej notatki, jaki jest HTML wokół notatki, jak mają być przedstawione pola notes.fld.

Model znajduje się w kolumnie models tabeli col. Należy pamiętać, że tabela col zawsze zawiera tylko jeden rekord. Model jest przechowywany w formacie JSON; oto przykład jak wygląda JSON modelu z dwoma modelami:

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

W tym samym URL wspomnianym wcześniej znajduje się bardzo ładny opis tego, co robi każde pole modelu. Tutaj zostaną opisane tylko te, które są nam potrzebne do stworzenia przeglądarki kart.

W korzeniu obiektu znajduje się klucz "1471435193999". Klucz ten jest identyfikatorem tego modelu, który jest wymieniony w kolumnie mid tabeli notes.

Wewnątrz tego obiektu znajduje się tablica z kluczem "flds". Tablica ta zawiera pola, które karty określają podczas tworzenia notatek. Zazwyczaj są to tylko pola „Front” i „Rear”, jednak w zależności od modelu, możliwe jest posiadanie większej ilości różnych pól. Jak wspomniano wcześniej, notatki przechowują te informacje w kolumnie notes.fld; pola w kolumnie są w takiej samej kolejności jak pola zdefiniowane w tej tablicy.

Obiekt "tmpls" zawiera szablony notatek i dostarcza informacji o strukturze HTML kart. Modele, które definiują wiele szablonów, generują wiele kart, po jednej dla każdego szablonu. Obiekt ten posiada dwa ważne pola:

  • "qfmt": HTML przedniej części karty
  • "afmt": HTML tylnej części karty
  • "ord": Pozycja szablonu w tablicy "tmpls". Jest to używane przez tablicę cards do identyfikacji szablonu, który wygenerował kartę.

Pola te mogą zawierać {{placeholders}}, które muszą być zastąpione wartościami pól, które karty przechowują w notes.fld. Skojarzenie między pozycją pola a nazwą pola jest takie samo jak w przypadku obiektów w "flds". Zauważ, że "afmt" może zawierać specjalny placeholder o nazwie {{FrontSide}}; jest to tylko wygodny sposób na pokazanie zawartości karty bez konieczności kopiowania & wklejania zawartości "qfmt" podczas tworzenia modeli kart.

Ostatnie interesujące nas pole to "css"; zawiera ono kod CSS, który należy zastosować do karty.

Pobieranie informacji o taliach

Informacje o taliach zawartych w archiwum są przechowywane w kolumnie col.decks w formacieJSON. Oto przykładowy 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": "" }}

Kilka pól, na które należy zwrócić uwagę:

  • id: Unikalne id pokładu. Id jest używane w tabeli cards, w kolumnie did do określenia powiązań między kartami i taliami (wyjaśnione później). Zauważ, że domyślna talia ma zawsze id 1.
  • name: Nazwa talii. W przypadku talii potomnych, nazwa będzie w formacie „Nazwa talii rodzica::Nazwa talii dziecka”

Pobieranie kart

Informacje o kartach są przechowywane w tabeli cards. Kolumny, których potrzebujemy z tej tabeli to:

  • id: unikalny identyfikator karty
  • nid: id notatki, która wygenerowała tę kartę
  • did: identyfikator talii, w której znajduje się ta karta
  • ord: pozycja szablonu modelu; odpowiada polu ord szablonu.

Struktura pliku medialnego

media jest plikiem JSON, który kojarzy nazwy kodowe obrazków z ich oryginalnymi nazwami. Zauważ, że każde pole karty może zawierać obrazki, ale obrazki są powiązane z ich pełną nazwą. Podczas tworzenia pliku .apkg anki kompresuje nazwy obrazków (w rzeczywistości po prostu nazywa je za pomocą numerów progresywnych), jednak karty nadal odnoszą się do oryginalnych nazw. Celem pliku media jest uczynienie nas zdolnymi do przetłumaczenia nazw numerycznych w oryginalnych nazwach obrazów.

Struktura media jest całkiem prosta:

.

Dodaj komentarz