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
の構造は非常に単純です。