Anki/anki/cards.py
Damien Elmes 9e35e4acf2 template and cloze changes
While writing the documentation I realized that the default templates were
somewhat overwhelming. So I've moved the default settings into the card css,
and moved the css into a separate attribute which gets combined with the
question and answer templates.

Also:
- Detect cloze references directly rather than the conditional wrapper
- Add the cloze css to the template
2011-12-17 19:42:30 +09:00

140 lines
3.8 KiB
Python

# -*- coding: utf-8 -*-
# Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import time
from anki.utils import intTime, hexifyID, timestampID
# Cards
##########################################################################
# Type: 0=new, 1=learning, 2=due
# Queue: same as above, and:
# -1=suspended, -2=user buried, -3=sched buried
# Due is used differently for different queues.
# - new queue: note id or random int
# - rev queue: integer day
# - lrn queue: integer timestamp
class Card(object):
def __init__(self, col, id=None):
self.col = col
self.timerStarted = None
self._qa = None
self._note = None
if id:
self.id = id
self.load()
else:
# to flush, set nid, ord, and due
self.id = timestampID(col.db, "cards")
self.did = 1
self.crt = intTime()
self.type = 0
self.queue = 0
self.ivl = 0
self.factor = 0
self.reps = 0
self.lapses = 0
self.left = 0
self.edue = 0
self.flags = 0
self.data = ""
def load(self):
(self.id,
self.nid,
self.did,
self.ord,
self.mod,
self.usn,
self.type,
self.queue,
self.due,
self.ivl,
self.factor,
self.reps,
self.lapses,
self.left,
self.edue,
self.flags,
self.data) = self.col.db.first(
"select * from cards where id = ?", self.id)
self._qa = None
self._note = None
def flush(self):
self.mod = intTime()
self.usn = self.col.usn()
self.col.db.execute(
"""
insert or replace into cards values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
self.id,
self.nid,
self.did,
self.ord,
self.mod,
self.usn,
self.type,
self.queue,
self.due,
self.ivl,
self.factor,
self.reps,
self.lapses,
self.left,
self.edue,
self.flags,
self.data)
def flushSched(self):
self.mod = intTime()
self.usn = self.col.usn()
self.col.db.execute(
"""update cards set
mod=?, usn=?, type=?, queue=?, due=?, ivl=?, factor=?, reps=?,
lapses=?, left=?, edue=? where id = ?""",
self.mod, self.usn, self.type, self.queue, self.due, self.ivl,
self.factor, self.reps, self.lapses,
self.left, self.edue, self.id)
def q(self, reload=False):
return self.css() + self._getQA(reload)['q']
def a(self):
return self.css() + self._getQA()['a']
def css(self):
return "<style>%s</style>" % self.template()['css']
def _getQA(self, reload=False):
if not self._qa or reload:
f = self.note(); m = self.model()
data = [self.id, f.id, m['id'], self.did, self.ord, f.stringTags(),
f.joinedFields()]
self._qa = self.col._renderQA(data)
return self._qa
def note(self, reload=False):
if not self._note or reload:
self._note = self.col.getNote(self.nid)
return self._note
def model(self):
return self.col.models.get(self.note().mid)
def deckConf(self):
return self.col.decks.confForDid(self.did)
def template(self):
return self.model()['tmpls'][self.ord]
def startTimer(self):
self.timerStarted = time.time()
def timeTaken(self):
"Time taken to answer card, in integer MS."
total = int((time.time() - self.timerStarted)*1000)
return min(total, self.deckConf()['maxTaken']*1000)