slavetto / anki-cards-web-browser

What is this?

この文書は、apkg アーカイブの処理がどのように行われるべきかを説明します。

.apkg ファイルの構造

Ankiの .apkg ファイルは、以下のファイルを含む単なる zip アーカイブです:

  • collection.anki2: カード、ノート、ノートモデルなどを含む sqlite データベース…
  • 1,2,3,4 という名前のファイル……。 カードが使用する画像
  • media:

collection.anki2 の構造

これは実際のデータベースで、ビューアを生成するために使用するすべてのノートとその他の有用な情報を含んでいます。 このドキュメントでは、ビューアを生成するためにデータベースから取得する必要があるものについて説明します。

Fetching notes

ノートは notes テーブルに格納されます。 そのテーブルから必要な列は次のとおりです。

  • id: メモの一意の識別子
  • mid: カードモデルの ID (取得方法は後述)
  • tags: メモと関連付けられたタグ
  • fld: メモのフィールドです。 これは、カードを生成するためにカードモデルにフィードされる必要があります。これは、0x1f(31)文字で区切られたすべてのフィールドを含んでいます。 フィールドの順序は、ノートのモデルで示されたものとまったく同じです。

カードモデルの取得

ノートからカードを生成できるようにするためには、カードモデルを取得する必要があります。 このモデルは、1 つのノートから生成されるカードの数、ノートを囲む HTML、notes.fld のフィールドがどのように表示されるかを教えてくれます。 col テーブルは常に1つのレコードしか含まないことに注意してください。 これは、2つのモデルを持つモデルのJSONがどのように見えるかの例です:

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

前に述べた同じURLに、モデルの各フィールドが何をするかについての非常に素晴らしい説明があります。 ここでは、カード ブラウザを作成するために必要なものだけを説明します。

オブジェクトのルートには、"1471435193999" キーが存在します。 このキーは、そのモデルのIDです。これは、notesテーブルのmid列に記載されています。

そのオブジェクトの内部には、キー"flds"を持つ配列があります。 この配列には、カードがノートを作成するときに指定するフィールドが含まれています。 通常は “Front “と “Rear “フィールドだけですが、モデルによってはもっと多くの異なるフィールドを持つことができます。 前述のように、ノートはこの情報を notes.fld カラムに格納します。カラムのフィールドは、この配列のフィールド定義と同じ順序になります。

"tmpls" オブジェクトはノートのテンプレートを含み、カードの HTML 構造に関する情報を提供します。 複数のテンプレートを定義するモデルは、各テンプレートごとに1つの複数のカードを生成します。

  • "qfmt": カードの前部の HTML
  • "afmt": カードの後部の HTML
  • "ord": "tmpls" 配列内のテンプレートの位置です。

これらのフィールドは{{placeholders}}を含むことができ、カードがnotes.fldに格納するフィールドの値で置換されなければならない。 フィールドの位置とフィールド名の関連は、"flds"のオブジェクトのものである。 これは、カードモデルを作成する際に&をコピーして"qfmt"の内容を貼り付けることなく、カードの内容を表示するための便利な方法である。

最後のフィールドは "css" です。これは、カードに適用する必要がある CSS コードを含んでいます。 以下は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": "" }}

注意すべきいくつかのフィールド:

  • id: デッキの一意なID。 このIDはcardsテーブルのdidカラムで、カードとデッキの関連付けを指定するために使用されます(後で説明します)。 なお、デフォルトのデッキは常に1というIDを持つ。
  • name: デッキの名前。 子デッキの場合は、「親デッキ名::子デッキ名」

カードの取得

カードに関する情報はcardsテーブルに格納されています。

  • id: カードの一意な識別子
  • nid: このカードを生成したノートのID
  • did: このカードが入っているデッキのID識別子
  • ord: モデルのテンプレートの位置、テンプレートのordフィールドと一致します。

メディアファイル

media の構造は、画像のコードネームを元の名前に関連付けるJSONファイルである。 .apkgファイルを作成する際、杏樹はイメージの名前を圧縮します(実際には、これらの名前を累進番号で変更するだけです)が、カードはまだ元の名前を参照し続けています。

mediaの構造は非常に単純です。

コメントする