1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
<script>
// from the Wikipedia article on SuperMemo
function SM2(grade, {last_grade, last_review, repetitions, easiness, interval}) {
if (grade >= 3) {
if (repetitions == 0)
interval = 1
else if (repetitions == 1)
interval = 6
else
interval = Math.round(interval * easiness)
++repetitions
} else {
repetitions = 0
interval = 1
}
easiness += 0.1 - (5 - grade) * (0.8 + (5 - grade) * 0.02)
if (easiness < 1.3)
easiness = 1.3
return {last_grade, last_review, repetitions, easiness, interval}
}
const initial_sm2 = () => ({repetitions: 0,
easiness: 2.5,
interval: 0})
async function grade(card) {
let {sm2} = card,
grade = await ask(card, $settings.speed)
sm2 ||= initial_sm2()
return SM2(grade, {...sm2, last_grade: grade, last_review: Date.now()})
}
const needs_review_p = (card, time_factor=1) =>
(card.sm2 &&
(card.sm2.last_grade < 4 ||
(new Date().setHours(0, 0, 0, 0) - card.sm2.last_review) * time_factor >=
24 * 60 * 60 * 1000 * card.sm2.interval))
const new_p = card => !card.sm2
let $reviewing_s = false
async function review$(deck, nc) {
if ($reviewing_s) return
$reviewing_s = true
async function r(news) {
let stack = deck
.filter(x => needs_review_p(x, $settings.time_factor))
.sort((a, b) => a.sm2.easiness - b.sm2.easiness)
if (news?.length) stack = news.concat(stack)
for (let card of stack) {
card.sm2 = await grade(card)
if ($settings.autosave)
await แนก.set("deck", $deck)
}
if (deck.some(x => needs_review_p(x, $settings.time_factor)))
r()
}
let news = deck.filter(new_p)
.shuffle().slice(0, nc)
await r(news)
$reviewing_s = false
}
</script>
<form name=grader onsubmit="review$($deck, this.nc.value); this.nc.value = 0; return false">
<p>
<label>Add <input type=number min=-1 name=nc> cards</label>
<p>
<input type=submit value=Start>
</form>
<script>
$loaded_p.then(() =>
document.forms.grader.nc.value = $settings.default_new_cards)
</script>
|