summaryrefslogtreecommitdiff
path: root/reviewer.html
diff options
context:
space:
mode:
authorSimon Parri <simonparri@ganzeria.com>2025-02-16 23:29:02 -0600
committerSimon Parri <simonparri@ganzeria.com>2025-02-16 23:36:39 -0600
commitca51ae66c40c0f040b81a5ed7b39602eb30c4ad2 (patch)
tree01546304cf59582de29fd12e3c639e3aa1174397 /reviewer.html
downloadonpoint-ca51ae66c40c0f040b81a5ed7b39602eb30c4ad2.tar.gz
onpoint-ca51ae66c40c0f040b81a5ed7b39602eb30c4ad2.zip
Add version 0.1v0.1
Diffstat (limited to 'reviewer.html')
-rw-r--r--reviewer.html77
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>