From 591ca634662719ae5aa3e858c7018d3418a41b40 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Thu, 22 Dec 2022 19:53:00 +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 | 64 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 1dc93aaa3..295cc0f5e 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -17,16 +17,19 @@ package model import ( - "github.com/88250/lute" - "github.com/siyuan-note/siyuan/kernel/treenode" "os" "path/filepath" "strings" "sync" + "github.com/88250/gulu" + "github.com/88250/lute" "github.com/88250/lute/ast" + "github.com/88250/lute/parse" "github.com/siyuan-note/logging" "github.com/siyuan-note/riff" + "github.com/siyuan-note/siyuan/kernel/cache" + "github.com/siyuan-note/siyuan/kernel/treenode" "github.com/siyuan-note/siyuan/kernel/util" ) @@ -149,6 +152,63 @@ func AddFlashcards(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") + deckIDs := strings.Split(deckAttrs, ",") + deckIDs = append(deckIDs, deckID) + deckIDs = gulu.Str.RemoveDuplicatedElem(deckIDs) + val := strings.Join(deckIDs, ",") + val = strings.TrimPrefix(val, ",") + val = strings.TrimSuffix(val, ",") + 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 { cardID := ast.NewNodeID() deck.AddCard(cardID, blockID)