O que é isto?
Este documento explica como o processamento dos arquivos apkg deve funcionar.
Estrutura dos arquivos .apkg
Os arquivos .apkg da Anki são apenas arquivos zip contendo os seguintes arquivos:
-
collection.anki2
: Uma base de dados sqlite contendo cartões, notas, modelos de notas, etc… - Arquivos chamados
1
,2
,3
,4
As imagens que os cartões usam -
media
: Um arquivo json contendo mapeamentos entre as imagens e seus nomes originais (ex: arquivo1
é na verdade chamado delatex-96c15f8a1af25e7a2eec64f7c6fedafe12363352.png
nas cartas).
A estrutura da coleção.anki2
Esta é a base de dados real que contém todas as notas e outras informações úteis que vamos usar para gerar o visualizador. Existe um guia detalhado sobre o que contém exactamente a base de dados. Neste documento vamos apenas descrever o que vamos precisar de retirar da base de dados de modo a togenerar o visualizador.
Buscar notas
As notas são armazenadas na tabela notes
. As colunas que precisamos dessa tabela são:
-
id
: O identificador único da nota -
mid
: O ID do modelo de cartões (descrito posteriormente como obtê-lo) -
tags
: As etiquetas associadas à nota -
fld
: Os campos da nota. Este precisa de ser alimentado no modelo de cartas para gerar as cartas. Ele contém todos os campos, separados pelo caractere0x1f
(31). A ordem dos campos é exactamente a apresentada no modelo da nota.
Modelos de cartões para gerar os cartões
Para poder gerar os cartões a partir das notas, precisamos de ir buscar o modelo de cartões. O modelo diz-nos como os manycards têm de ser gerados a partir de uma única nota, qual é o HTML que envolve a nota, como os campos de notes.fld
têm de ser apresentados.
O modelo pode ser encontrado na coluna models
da tabela col
. Note que a tabela de col
contém sempre apenas um onerecord. O modelo é armazenado em um formato JSON; este é um exemplo de como é o JSON de um modelo com dois modelos:
{ "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" }}
Na mesma URL mencionada anteriormente há uma descrição muito boa do que cada campo do modelo faz. Aqui serão descritos apenas os que precisamos para criar o navegador de cartas.
Na raiz do objeto, há uma chave "1471435193999"
. Essa chave é o id desse modelo. Isto é mencionado na coluna mid
da coluna notes
tabela.
Dentro desse objeto há um array com chave "flds"
. Este array contém os campos que as cartas especificam ao criar notas. Normalmente existem apenas os campos “Front” e “Rear”, no entanto, dependendo do modelo, é possível ter mais campos diferentes. Como mencionado anteriormente, as notas armazenam esta informação na coluna notes.fld
; os campos da coluna estão na mesma ordem das definições dos campos neste array.
O objecto "tmpls"
contém templates das notas e fornece informação acerca da estrutura HTML das cartas. Os modelos que definem múltiplos templates geram múltiplos cartões, um template foreach. Este objeto tem dois campos importantes:
-
"qfmt"
: O HTML da frente do cartão -
"afmt"
: O HTML da parte de trás do cartão -
"ord"
: A posição do template no array"tmpls"
. Isto é usado pela tabelacards
para identificar o template que gerou o cartão.
Estes campos podem conter {{placeholders}}
que têm de ser substituídos pelos valores dos campos que os cartões armazenam em notes.fld
. A associação entre a posição e o nome do campo é um dos objetos em "flds"
. Note que "afmt"
pode conter um espaço reservado chamado {{FrontSide}}
; esta é apenas uma forma útil de mostrar o conteúdo do cartão sem ter que copiar & colar o conteúdo de "qfmt"
enquanto cria modelos de cartões.
O último campo do nosso interesse é "css"
; contém o código CSS que tem de ser aplicado ao cartão.
Obter informação do baralho
A informação sobre os baralhos contida no arquivo é armazenada na coluna col.decks
no formatoJSON. Aqui está um exemplo 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": "" }}
Alguns campos que devem ser observados:
-
id
: Identificação única do baralho. O id é usado na tabelacards
, na colunadid
para especificar as associações entre as cartas e os baralhos (explicado mais tarde). Note que o baralho padrão tem sempre id1
. -
name
: O nome do baralho. No caso de baralhos infantis, o nome estará no formato “Nome do baralho dos pais::Nome do baralho infantil”
>
Pegar as cartas
As informações sobre as cartas são armazenadas na tabela cards
. As colunas que precisamos dessa tabela são:
-
id
: identificador único da carta -
nid
: id da nota que gerou esta carta -
did
: id identificador do baralho onde esta carta está contida -
ord
: a posição do modelo do modelo; corresponde ao campo do modeloord
.
A estrutura do arquivo de mídia
media
é um arquivo JSON que associa os nomes dos códigos das imagens aos seus nomes originais. Durante a criação do arquivo .apkg o anki comprime os nomes das imagens (na verdade, ele os nomeia com números progressivos), porém as cartas ainda continuam se referindo ao nome original. O propósito do ficheiro media
torna-nos capazes de traduzir nomes numéricos nos nomes originais das imagens.
A estrutura de media
é bastante directa: