diff options
author | Simon Parri <simonparri@ganzeria.com> | 2025-02-16 23:29:02 -0600 |
---|---|---|
committer | Simon Parri <simonparri@ganzeria.com> | 2025-02-16 23:36:39 -0600 |
commit | ca51ae66c40c0f040b81a5ed7b39602eb30c4ad2 (patch) | |
tree | 01546304cf59582de29fd12e3c639e3aa1174397 /reviewer.html | |
download | onpoint-ca51ae66c40c0f040b81a5ed7b39602eb30c4ad2.tar.gz onpoint-ca51ae66c40c0f040b81a5ed7b39602eb30c4ad2.zip |
Add version 0.1v0.1
Diffstat (limited to 'reviewer.html')
-rw-r--r-- | reviewer.html | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/reviewer.html b/reviewer.html new file mode 100644 index 0000000..8f8be17 --- /dev/null +++ b/reviewer.html @@ -0,0 +1,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> |