Add flashcards feature with spaced repetition scheduling
Adds a full flashcards system: FSRS-based scheduling, cloze/basic card types, CSV import/export, media storage, and study UI, wired into navigation and the dashboard alongside existing question flows.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
extends RefCounted
|
||||
|
||||
# Mirrors api/QuestionsApi/Services/Flashcards/FlashcardClozeParser.cs so the study screen can
|
||||
# render a cloze note's front/back without a round trip to the server.
|
||||
|
||||
static func _regex() -> RegEx:
|
||||
var regex := RegEx.new()
|
||||
regex.compile("(?s)\\{\\{c(\\d+)::((?:(?!\\}\\}).)*)\\}\\}")
|
||||
return regex
|
||||
|
||||
|
||||
static func render_front(text: String, cloze_number: int) -> String:
|
||||
var regex := _regex()
|
||||
var result := ""
|
||||
var last_end := 0
|
||||
for match in regex.search_all(text):
|
||||
result += text.substr(last_end, match.get_start() - last_end)
|
||||
var number := int(match.get_string(1))
|
||||
var inner := match.get_string(2)
|
||||
var parts := inner.split("::", true, 1)
|
||||
if number == cloze_number:
|
||||
var hint := parts[1].strip_edges() if parts.size() > 1 else ""
|
||||
result += ("[%s]" % hint) if not hint.is_empty() else "[...]"
|
||||
else:
|
||||
result += parts[0].strip_edges()
|
||||
last_end = match.get_end()
|
||||
result += text.substr(last_end)
|
||||
return result
|
||||
|
||||
|
||||
static func render_back(text: String) -> String:
|
||||
var regex := _regex()
|
||||
var result := ""
|
||||
var last_end := 0
|
||||
for match in regex.search_all(text):
|
||||
result += text.substr(last_end, match.get_start() - last_end)
|
||||
var inner := match.get_string(2)
|
||||
result += inner.split("::", true, 1)[0].strip_edges()
|
||||
last_end = match.get_end()
|
||||
result += text.substr(last_end)
|
||||
return result
|
||||
Reference in New Issue
Block a user