浏览代码

:art: 支持间隔复习 https://github.com/siyuan-note/siyuan/issues/6710

Liang Ding 2 年之前
父节点
当前提交
28485f7ffb
共有 3 个文件被更改,包括 46 次插入0 次删除
  1. 22 0
      kernel/api/riff.go
  2. 1 0
      kernel/api/router.go
  3. 23 0
      kernel/model/flashcard.go

+ 22 - 0
kernel/api/riff.go

@@ -26,6 +26,28 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func renderRiffCard(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	blockID := arg["blockID"].(string)
+	content, err := model.RenderFlashcard(blockID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	ret.Data = map[string]interface{}{
+		"content": content,
+	}
+}
+
 func reviewRiffCard(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -305,6 +305,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/riff/addRiffCards", model.CheckAuth, addRiffCards)
 	ginServer.Handle("POST", "/api/riff/removeRiffCards", model.CheckAuth, removeRiffCards)
 	ginServer.Handle("POST", "/api/riff/getRiffDueCards", model.CheckAuth, getRiffDueCards)
+	ginServer.Handle("POST", "/api/riff/renderRiffCard", model.CheckAuth, renderRiffCard)
 	ginServer.Handle("POST", "/api/riff/reviewRiffCard", model.CheckAuth, reviewRiffCard)
 
 	ginServer.Handle("POST", "/api/notification/pushMsg", model.CheckAuth, pushMsg)

+ 23 - 0
kernel/model/flashcard.go

@@ -17,6 +17,8 @@
 package model
 
 import (
+	"github.com/88250/lute"
+	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"os"
 	"path/filepath"
 	"strings"
@@ -31,6 +33,27 @@ import (
 var Decks = map[string]*riff.Deck{}
 var deckLock = sync.Mutex{}
 
+func RenderFlashcard(blockID string) (content string, err error) {
+	tree, err := loadTreeByBlockID(blockID)
+	if nil != err {
+		return
+	}
+
+	node := treenode.GetNodeInTree(tree, blockID)
+	if nil == node {
+		return
+	}
+
+	luteEngine := NewLute()
+	luteEngine.RenderOptions.ProtyleContenteditable = false
+	if ast.NodeDocument == node.Type {
+		content = luteEngine.Tree2BlockDOM(tree, luteEngine.RenderOptions)
+	} else {
+		content = lute.RenderNodeBlockDOM(node, luteEngine.ParseOptions, luteEngine.RenderOptions)
+	}
+	return
+}
+
 func ReviewFlashcard(deckID string, blockID string, rating riff.Rating) (err error) {
 	deckLock.Lock()
 	deck := Decks[deckID]