mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 07:22:23 -04:00
strip all the old cram code; add way to start cramming from deck
This commit is contained in:
parent
17f3cabc25
commit
be56912caf
4 changed files with 42 additions and 111 deletions
120
anki/cram.py
120
anki/cram.py
|
@ -2,117 +2,23 @@
|
||||||
# Copyright: Damien Elmes <anki@ichi2.net>
|
# Copyright: Damien Elmes <anki@ichi2.net>
|
||||||
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
|
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
|
||||||
|
|
||||||
|
from anki.utils import ids2str
|
||||||
from anki.sched import Scheduler
|
from anki.sched import Scheduler
|
||||||
|
|
||||||
class CramScheduler(Scheduler):
|
class CramScheduler(Scheduler):
|
||||||
|
name = "cram"
|
||||||
|
|
||||||
# Cramming
|
def __init__(self, deck, gids, order):
|
||||||
##########################################################################
|
Scheduler.__init__(self, deck)
|
||||||
|
self.gids = gids
|
||||||
|
self.order = order
|
||||||
|
self.reset()
|
||||||
|
|
||||||
def setupCramScheduler(self, active, order):
|
def reset(self):
|
||||||
self.getCardId = self._getCramCardId
|
pass
|
||||||
self.activeCramTags = active
|
|
||||||
self.cramOrder = order
|
|
||||||
self.rebuildNewCount = self._rebuildCramNewCount
|
|
||||||
self.rebuildRevCount = self._rebuildCramCount
|
|
||||||
self.rebuildLrnCount = self._rebuildLrnCramCount
|
|
||||||
self.fillRevQueue = self._fillCramQueue
|
|
||||||
self.fillLrnQueue = self._fillLrnCramQueue
|
|
||||||
self.finishScheduler = self.setupStandardScheduler
|
|
||||||
self.lrnCramQueue = []
|
|
||||||
print "requeue cram"
|
|
||||||
self.requeueCard = self._requeueCramCard
|
|
||||||
self.cardQueue = self._cramCardQueue
|
|
||||||
self.answerCard = self._answerCramCard
|
|
||||||
self.spaceCards = self._spaceCramCards
|
|
||||||
# reuse review early's code
|
|
||||||
self.answerPreSave = self._cramPreSave
|
|
||||||
self.cardLimit = self._cramCardLimit
|
|
||||||
self.scheduler = "cram"
|
|
||||||
|
|
||||||
def _cramPreSave(self, card, ease):
|
def getCard(self):
|
||||||
# prevent it from appearing in next queue fill
|
pass
|
||||||
card.lastInterval = self.cramLastInterval
|
|
||||||
card.type = -3
|
|
||||||
|
|
||||||
def _spaceCramCards(self, card):
|
def answerCard(self):
|
||||||
self.spacedFacts[card.factId] = time.time() + self.newSpacing
|
pass
|
||||||
|
|
||||||
def _answerCramCard(self, card, ease):
|
|
||||||
self.cramLastInterval = card.lastInterval
|
|
||||||
self._answerCard(card, ease)
|
|
||||||
if ease == 1:
|
|
||||||
self.lrnCramQueue.insert(0, [card.id, card.factId])
|
|
||||||
|
|
||||||
def _getCramCardId(self, check=True):
|
|
||||||
self.checkDay()
|
|
||||||
self.fillQueues()
|
|
||||||
if self.lrnCardMax and self.learnCount >= self.lrnCardMax:
|
|
||||||
return self.lrnQueue[-1][0]
|
|
||||||
# card due for review?
|
|
||||||
if self.revNoSpaced():
|
|
||||||
return self.revQueue[-1][0]
|
|
||||||
if self.lrnQueue:
|
|
||||||
return self.lrnQueue[-1][0]
|
|
||||||
if check:
|
|
||||||
# collapse spaced cards before reverting back to old scheduler
|
|
||||||
self.reset()
|
|
||||||
return self.getCardId(False)
|
|
||||||
# if we're in a custom scheduler, we may need to switch back
|
|
||||||
if self.finishScheduler:
|
|
||||||
self.finishScheduler()
|
|
||||||
self.reset()
|
|
||||||
return self.getCardId()
|
|
||||||
|
|
||||||
def _cramCardQueue(self, card):
|
|
||||||
if self.revQueue and self.revQueue[-1][0] == card.id:
|
|
||||||
return 1
|
|
||||||
else:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def _requeueCramCard(self, card, oldSuc):
|
|
||||||
if self.cardQueue(card) == 1:
|
|
||||||
self.revQueue.pop()
|
|
||||||
else:
|
|
||||||
self.lrnCramQueue.pop()
|
|
||||||
|
|
||||||
def _rebuildCramNewCount(self):
|
|
||||||
self.newAvail = 0
|
|
||||||
self.newCount = 0
|
|
||||||
|
|
||||||
def _cramCardLimit(self, active, inactive, sql):
|
|
||||||
# inactive is (currently) ignored
|
|
||||||
if isinstance(active, list):
|
|
||||||
return sql.replace(
|
|
||||||
"where", "where +c.id in " + ids2str(active) + " and")
|
|
||||||
else:
|
|
||||||
yes = parseTags(active)
|
|
||||||
if yes:
|
|
||||||
yids = tagIds(self.db, yes).values()
|
|
||||||
return sql.replace(
|
|
||||||
"where ",
|
|
||||||
"where +c.id in (select cardId from cardTags where "
|
|
||||||
"tagId in %s) and " % ids2str(yids))
|
|
||||||
else:
|
|
||||||
return sql
|
|
||||||
|
|
||||||
def _fillCramQueue(self):
|
|
||||||
if self.revCount and not self.revQueue:
|
|
||||||
self.revQueue = self.db.all(self.cardLimit(
|
|
||||||
self.activeCramTags, "", """
|
|
||||||
select id, factId from cards c
|
|
||||||
where queue between 0 and 2
|
|
||||||
order by %s
|
|
||||||
limit %s""" % (self.cramOrder, self.queueLimit)))
|
|
||||||
self.revQueue.reverse()
|
|
||||||
|
|
||||||
def _rebuildCramCount(self):
|
|
||||||
self.revCount = self.db.scalar(self.cardLimit(
|
|
||||||
self.activeCramTags, "",
|
|
||||||
"select count(*) from cards c where queue between 0 and 2"))
|
|
||||||
|
|
||||||
def _rebuildLrnCramCount(self):
|
|
||||||
self.learnCount = len(self.lrnCramQueue)
|
|
||||||
|
|
||||||
def _fillLrnCramQueue(self):
|
|
||||||
self.lrnQueue = self.lrnCramQueue
|
|
||||||
|
|
17
anki/deck.py
17
anki/deck.py
|
@ -14,7 +14,7 @@ from anki.media import MediaRegistry
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
|
|
||||||
import anki.latex # sets up hook
|
import anki.latex # sets up hook
|
||||||
import anki.cards, anki.facts, anki.models, anki.template
|
import anki.cards, anki.facts, anki.models, anki.template, anki.cram
|
||||||
|
|
||||||
# Settings related to queue building. These may be loaded without the rest of
|
# Settings related to queue building. These may be loaded without the rest of
|
||||||
# the config to check due counts faster on mobile clients.
|
# the config to check due counts faster on mobile clients.
|
||||||
|
@ -72,7 +72,8 @@ class _Deck(object):
|
||||||
self.lastSessionStart = 0
|
self.lastSessionStart = 0
|
||||||
# counter for reps since deck open
|
# counter for reps since deck open
|
||||||
self.reps = 0
|
self.reps = 0
|
||||||
self.sched = Scheduler(self)
|
self._stdSched = Scheduler(self)
|
||||||
|
self.sched = self._stdSched
|
||||||
self.media = MediaRegistry(self)
|
self.media = MediaRegistry(self)
|
||||||
|
|
||||||
def name(self):
|
def name(self):
|
||||||
|
@ -714,6 +715,18 @@ select conf from gconf where id = (select gcid from groups where id = ?)""",
|
||||||
self.disableSyncing()
|
self.disableSyncing()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
# Schedulers and cramming
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
def stdSched(self):
|
||||||
|
if self.sched.name != "std":
|
||||||
|
self.sched.onClose()
|
||||||
|
self.sched = self._stdSched
|
||||||
|
|
||||||
|
def cramGroups(self, gids, order="mod"):
|
||||||
|
self.stdSched()
|
||||||
|
self.sched = anki.cram.CramScheduler(self, gids, order)
|
||||||
|
|
||||||
# Undo/redo
|
# Undo/redo
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@ from anki.hooks import runHook
|
||||||
|
|
||||||
# the standard Anki scheduler
|
# the standard Anki scheduler
|
||||||
class Scheduler(object):
|
class Scheduler(object):
|
||||||
|
name = "std"
|
||||||
def __init__(self, deck):
|
def __init__(self, deck):
|
||||||
self.deck = deck
|
self.deck = deck
|
||||||
self.db = deck.db
|
self.db = deck.db
|
||||||
self.name = "main"
|
|
||||||
self.queueLimit = 200
|
self.queueLimit = 200
|
||||||
self.reportLimit = 1000
|
self.reportLimit = 1000
|
||||||
self._updateCutoff()
|
self._updateCutoff()
|
||||||
|
@ -274,7 +274,7 @@ queue = 1 %s and due <= :lim limit %d)""" % (
|
||||||
|
|
||||||
def _resetReview(self):
|
def _resetReview(self):
|
||||||
self._resetReviewCount()
|
self._resetReviewCount()
|
||||||
self.revQueue = self.db.all("""
|
self.revQueue = self.db.list("""
|
||||||
select id from cards where
|
select id from cards where
|
||||||
queue = 1 %s and due <= :lim order by %s limit %d""" % (
|
queue = 1 %s and due <= :lim order by %s limit %d""" % (
|
||||||
self._groupLimit("rev"), self._revOrder(), self.queueLimit),
|
self._groupLimit("rev"), self._revOrder(), self.queueLimit),
|
||||||
|
|
|
@ -300,3 +300,15 @@ def test_misc():
|
||||||
d.sched.answerCard(c, 2)
|
d.sched.answerCard(c, 2)
|
||||||
assert d.sched.timeToday() > 0
|
assert d.sched.timeToday() > 0
|
||||||
assert d.sched.repsToday() == 1
|
assert d.sched.repsToday() == 1
|
||||||
|
|
||||||
|
def test_cram():
|
||||||
|
d = getEmptyDeck()
|
||||||
|
f = d.newFact()
|
||||||
|
f['Front'] = u"one"
|
||||||
|
d.addFact(f)
|
||||||
|
f = d.newFact()
|
||||||
|
f['Front'] = u"two"
|
||||||
|
d.addFact(f)
|
||||||
|
d.cramGroups(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue