🎨 Distinguish between new cards and review cards during spaced repetition https://github.com/siyuan-note/siyuan/issues/9377

This commit is contained in:
Daniel 2023-12-21 12:16:12 +08:00
parent 4c8a57ec21
commit 30c902a01c
No known key found for this signature in database
GPG Key ID: 86211BA83DF03017
2 changed files with 46 additions and 22 deletions

View File

@ -158,7 +158,7 @@ func getNotebookRiffDueCards(c *gin.Context) {
notebookID := arg["notebook"].(string) notebookID := arg["notebook"].(string)
reviewedCardIDs := getReviewedCards(arg) reviewedCardIDs := getReviewedCards(arg)
cards, unreviewedCount, err := model.GetNotebookDueFlashcards(notebookID, reviewedCardIDs) cards, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount, err := model.GetNotebookDueFlashcards(notebookID, reviewedCardIDs)
if nil != err { if nil != err {
ret.Code = -1 ret.Code = -1
ret.Msg = err.Error() ret.Msg = err.Error()
@ -166,8 +166,10 @@ func getNotebookRiffDueCards(c *gin.Context) {
} }
ret.Data = map[string]interface{}{ ret.Data = map[string]interface{}{
"cards": cards, "cards": cards,
"unreviewedCount": unreviewedCount, "unreviewedCount": unreviewedCount,
"unreviewedNewCardCount": unreviewedNewCardCount,
"unreviewedOldCardCount": unreviewedOldCardCount,
} }
} }
@ -182,7 +184,7 @@ func getTreeRiffDueCards(c *gin.Context) {
rootID := arg["rootID"].(string) rootID := arg["rootID"].(string)
reviewedCardIDs := getReviewedCards(arg) reviewedCardIDs := getReviewedCards(arg)
cards, unreviewedCount, err := model.GetTreeDueFlashcards(rootID, reviewedCardIDs) cards, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount, err := model.GetTreeDueFlashcards(rootID, reviewedCardIDs)
if nil != err { if nil != err {
ret.Code = -1 ret.Code = -1
ret.Msg = err.Error() ret.Msg = err.Error()
@ -190,8 +192,10 @@ func getTreeRiffDueCards(c *gin.Context) {
} }
ret.Data = map[string]interface{}{ ret.Data = map[string]interface{}{
"cards": cards, "cards": cards,
"unreviewedCount": unreviewedCount, "unreviewedCount": unreviewedCount,
"unreviewedNewCardCount": unreviewedNewCardCount,
"unreviewedOldCardCount": unreviewedOldCardCount,
} }
} }
@ -206,7 +210,7 @@ func getRiffDueCards(c *gin.Context) {
deckID := arg["deckID"].(string) deckID := arg["deckID"].(string)
reviewedCardIDs := getReviewedCards(arg) reviewedCardIDs := getReviewedCards(arg)
cards, unreviewedCount, err := model.GetDueFlashcards(deckID, reviewedCardIDs) cards, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount, err := model.GetDueFlashcards(deckID, reviewedCardIDs)
if nil != err { if nil != err {
ret.Code = -1 ret.Code = -1
ret.Msg = err.Error() ret.Msg = err.Error()
@ -214,8 +218,10 @@ func getRiffDueCards(c *gin.Context) {
} }
ret.Data = map[string]interface{}{ ret.Data = map[string]interface{}{
"cards": cards, "cards": cards,
"unreviewedCount": unreviewedCount, "unreviewedCount": unreviewedCount,
"unreviewedNewCardCount": unreviewedNewCardCount,
"unreviewedOldCardCount": unreviewedOldCardCount,
} }
} }

View File

@ -405,7 +405,7 @@ func ReviewFlashcard(deckID, cardID string, rating riff.Rating, reviewedCardIDs
return return
} }
dueCards, _ := getDueFlashcards(deckID, reviewedCardIDs) dueCards, _, _, _ := getDueFlashcards(deckID, reviewedCardIDs)
if 1 > len(dueCards) { if 1 > len(dueCards) {
// 该卡包中没有待复习的卡片了,说明最后一张卡片已经复习完了,清空撤销缓存和跳过缓存 // 该卡包中没有待复习的卡片了,说明最后一张卡片已经复习完了,清空撤销缓存和跳过缓存
reviewCardCache = map[string]riff.Card{} reviewCardCache = map[string]riff.Card{}
@ -453,7 +453,7 @@ func newFlashcard(card riff.Card, blockID, deckID string, now time.Time) *Flashc
} }
} }
func GetNotebookDueFlashcards(boxID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount int, err error) { func GetNotebookDueFlashcards(boxID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int, err error) {
deckLock.Lock() deckLock.Lock()
defer deckLock.Unlock() defer deckLock.Unlock()
@ -491,7 +491,7 @@ func GetNotebookDueFlashcards(boxID string, reviewedCardIDs []string) (ret []*Fl
return return
} }
cards, unreviewedCnt := getDeckDueCards(deck, reviewedCardIDs, treeBlockIDs, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit) cards, unreviewedCnt, unreviewedNewCardCnt, unreviewedOldCardCnt := getDeckDueCards(deck, reviewedCardIDs, treeBlockIDs, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit)
now := time.Now() now := time.Now()
for _, card := range cards { for _, card := range cards {
ret = append(ret, newFlashcard(card, card.BlockID(), builtinDeckID, now)) ret = append(ret, newFlashcard(card, card.BlockID(), builtinDeckID, now))
@ -500,10 +500,12 @@ func GetNotebookDueFlashcards(boxID string, reviewedCardIDs []string) (ret []*Fl
ret = []*Flashcard{} ret = []*Flashcard{}
} }
unreviewedCount = unreviewedCnt unreviewedCount = unreviewedCnt
unreviewedNewCardCount = unreviewedNewCardCnt
unreviewedOldCardCount = unreviewedOldCardCnt
return return
} }
func GetTreeDueFlashcards(rootID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount int, err error) { func GetTreeDueFlashcards(rootID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int, err error) {
deckLock.Lock() deckLock.Lock()
defer deckLock.Unlock() defer deckLock.Unlock()
@ -534,7 +536,7 @@ func GetTreeDueFlashcards(rootID string, reviewedCardIDs []string) (ret []*Flash
} }
} }
cards, unreviewedCnt := getDeckDueCards(deck, reviewedCardIDs, treeBlockIDs, newCardLimit, reviewCardLimit) cards, unreviewedCnt, unreviewedNewCardCnt, unreviewedOldCardCnt := getDeckDueCards(deck, reviewedCardIDs, treeBlockIDs, newCardLimit, reviewCardLimit)
now := time.Now() now := time.Now()
for _, card := range cards { for _, card := range cards {
ret = append(ret, newFlashcard(card, card.BlockID(), builtinDeckID, now)) ret = append(ret, newFlashcard(card, card.BlockID(), builtinDeckID, now))
@ -543,6 +545,8 @@ func GetTreeDueFlashcards(rootID string, reviewedCardIDs []string) (ret []*Flash
ret = []*Flashcard{} ret = []*Flashcard{}
} }
unreviewedCount = unreviewedCnt unreviewedCount = unreviewedCnt
unreviewedNewCardCount = unreviewedNewCardCnt
unreviewedOldCardCount = unreviewedOldCardCnt
return return
} }
@ -581,29 +585,29 @@ func getBoxBlocks(boxID string) (blockIDsMap map[string]bool, blockIDs []string)
return return
} }
func GetDueFlashcards(deckID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount int, err error) { func GetDueFlashcards(deckID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int, err error) {
deckLock.Lock() deckLock.Lock()
defer deckLock.Unlock() defer deckLock.Unlock()
waitForSyncingStorages() waitForSyncingStorages()
if "" == deckID { if "" == deckID {
ret, unreviewedCount = getAllDueFlashcards(reviewedCardIDs) ret, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount = getAllDueFlashcards(reviewedCardIDs)
return return
} }
ret, unreviewedCount = getDueFlashcards(deckID, reviewedCardIDs) ret, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount = getDueFlashcards(deckID, reviewedCardIDs)
return return
} }
func getDueFlashcards(deckID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount int) { func getDueFlashcards(deckID string, reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int) {
deck := Decks[deckID] deck := Decks[deckID]
if nil == deck { if nil == deck {
logging.LogWarnf("deck not found [%s]", deckID) logging.LogWarnf("deck not found [%s]", deckID)
return return
} }
cards, unreviewedCnt := getDeckDueCards(deck, reviewedCardIDs, nil, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit) cards, unreviewedCnt, unreviewedNewCardCnt, unreviewedOldCardCnt := getDeckDueCards(deck, reviewedCardIDs, nil, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit)
now := time.Now() now := time.Now()
for _, card := range cards { for _, card := range cards {
ret = append(ret, newFlashcard(card, card.BlockID(), deckID, now)) ret = append(ret, newFlashcard(card, card.BlockID(), deckID, now))
@ -612,14 +616,18 @@ func getDueFlashcards(deckID string, reviewedCardIDs []string) (ret []*Flashcard
ret = []*Flashcard{} ret = []*Flashcard{}
} }
unreviewedCount = unreviewedCnt unreviewedCount = unreviewedCnt
unreviewedNewCardCount = unreviewedNewCardCnt
unreviewedOldCardCount = unreviewedOldCardCnt
return return
} }
func getAllDueFlashcards(reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount int) { func getAllDueFlashcards(reviewedCardIDs []string) (ret []*Flashcard, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int) {
now := time.Now() now := time.Now()
for _, deck := range Decks { for _, deck := range Decks {
cards, unreviewedCnt := getDeckDueCards(deck, reviewedCardIDs, nil, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit) cards, unreviewedCnt, unreviewedNewCardCnt, unreviewedOldCardCnt := getDeckDueCards(deck, reviewedCardIDs, nil, Conf.Flashcard.NewCardLimit, Conf.Flashcard.ReviewCardLimit)
unreviewedCount += unreviewedCnt unreviewedCount += unreviewedCnt
unreviewedNewCardCnt += unreviewedNewCardCnt
unreviewedOldCardCnt += unreviewedOldCardCnt
for _, card := range cards { for _, card := range cards {
ret = append(ret, newFlashcard(card, card.BlockID(), deck.ID, now)) ret = append(ret, newFlashcard(card, card.BlockID(), deck.ID, now))
} }
@ -981,7 +989,7 @@ func getDeckIDs() (deckIDs []string) {
return return
} }
func getDeckDueCards(deck *riff.Deck, reviewedCardIDs, blockIDs []string, newCardLimit, reviewCardLimit int) (ret []riff.Card, unreviewedCount int) { func getDeckDueCards(deck *riff.Deck, reviewedCardIDs, blockIDs []string, newCardLimit, reviewCardLimit int) (ret []riff.Card, unreviewedCount, unreviewedNewCardCount, unreviewedOldCardCount int) {
ret = []riff.Card{} ret = []riff.Card{}
dues := deck.Dues() dues := deck.Dues()
@ -1004,9 +1012,19 @@ func getDeckDueCards(deck *riff.Deck, reviewedCardIDs, blockIDs []string, newCar
if 0 < len(reviewedCardIDs) { if 0 < len(reviewedCardIDs) {
if !gulu.Str.Contains(c.ID(), reviewedCardIDs) { if !gulu.Str.Contains(c.ID(), reviewedCardIDs) {
unreviewedCount++ unreviewedCount++
if riff.New == c.GetState() {
unreviewedNewCardCount++
} else {
unreviewedOldCardCount++
}
} }
} else { } else {
unreviewedCount++ unreviewedCount++
if riff.New == c.GetState() {
unreviewedNewCardCount++
} else {
unreviewedOldCardCount++
}
} }
} }
dues = tmp dues = tmp