From 2b28b193cbcd2fd5fd0ff8c8ef18f7a5b04c066d Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Thu, 22 Dec 2022 21:09:05 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=AF=E6=8C=81=E9=97=B4=E9=9A=94?= =?UTF-8?q?=E5=A4=8D=E4=B9=A0=20https://github.com/siyuan-note/siyuan/issu?= =?UTF-8?q?es/6710?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/flashcard.go | 66 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 46774ec32..d5cd2d250 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -135,6 +135,72 @@ func RemoveFlashcards(deckID string, blockIDs []string) (err error) { deck := Decks[deckID] deckLock.Unlock() + var rootIDs []string + blockRoots := map[string]string{} + for _, blockID := range blockIDs { + bt := treenode.GetBlockTree(blockID) + if nil == bt { + continue + } + + rootIDs = append(rootIDs, bt.RootID) + blockRoots[blockID] = bt.RootID + } + rootIDs = gulu.Str.RemoveDuplicatedElem(rootIDs) + + trees := map[string]*parse.Tree{} + for _, blockID := range blockIDs { + rootID := blockRoots[blockID] + + tree := trees[rootID] + if nil == tree { + tree, _ = loadTreeByBlockID(blockID) + } + if nil == tree { + continue + } + trees[rootID] = tree + + node := treenode.GetNodeInTree(tree, blockID) + if nil == node { + continue + } + + oldAttrs := parse.IAL2Map(node.KramdownIAL) + + deckAttrs := node.IALAttr("custom-riff-decks") + var deckIDs []string + for _, dID := range strings.Split(deckAttrs, ",") { + if dID != deckID { + deckIDs = append(deckIDs, dID) + } + } + + deckIDs = gulu.Str.RemoveDuplicatedElem(deckIDs) + val := strings.Join(deckIDs, ",") + val = strings.TrimPrefix(val, ",") + val = strings.TrimSuffix(val, ",") + if "" == val { + node.RemoveIALAttr("custom-riff-decks") + } else { + node.SetIALAttr("custom-riff-decks", val) + } + + if err = indexWriteJSONQueue(tree); nil != err { + return + } + + cache.PutBlockIAL(blockID, parse.IAL2Map(node.KramdownIAL)) + + newAttrs := parse.IAL2Map(node.KramdownIAL) + doOp := &Operation{Action: "updateAttrs", Data: map[string]interface{}{"old": oldAttrs, "new": newAttrs}, ID: blockID} + trans := []*Transaction{{ + DoOperations: []*Operation{doOp}, + UndoOperations: []*Operation{}, + }} + pushBroadcastAttrTransactions(trans) + } + for _, blockID := range blockIDs { deck.RemoveCard(blockID) }