slavetto / anki-cards-web-browser

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: arquivo 1 é na verdade chamado de latex-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 caractere 0x1f (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 tabela cards 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 tabela cards, na coluna did para especificar as associações entre as cartas e os baralhos (explicado mais tarde). Note que o baralho padrão tem sempre id 1.
  • 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 modelo ord.

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:

Deixe um comentário