diff --git a/kernel/api/block_op.go b/kernel/api/block_op.go index 446dd0f01..625d55e0b 100644 --- a/kernel/api/block_op.go +++ b/kernel/api/block_op.go @@ -17,6 +17,7 @@ package api import ( + "errors" "net/http" "github.com/88250/gulu" @@ -221,7 +222,13 @@ func appendBlock(c *gin.Context) { } if "markdown" == dataType { luteEngine := util.NewLute() - data = dataBlockDOM(data, luteEngine) + var err error + data, err = dataBlockDOM(data, luteEngine) + if nil != err { + ret.Code = -1 + ret.Msg = "data block DOM failed: " + err.Error() + return + } } transactions := []*model.Transaction{ @@ -260,7 +267,13 @@ func prependBlock(c *gin.Context) { } if "markdown" == dataType { luteEngine := util.NewLute() - data = dataBlockDOM(data, luteEngine) + var err error + data, err = dataBlockDOM(data, luteEngine) + if nil != err { + ret.Code = -1 + ret.Msg = "data block DOM failed: " + err.Error() + return + } } transactions := []*model.Transaction{ @@ -315,7 +328,13 @@ func insertBlock(c *gin.Context) { if "markdown" == dataType { luteEngine := util.NewLute() - data = dataBlockDOM(data, luteEngine) + var err error + data, err = dataBlockDOM(data, luteEngine) + if nil != err { + ret.Code = -1 + ret.Msg = "data block DOM failed: " + err.Error() + return + } } transactions := []*model.Transaction{ @@ -357,7 +376,13 @@ func updateBlock(c *gin.Context) { luteEngine := util.NewLute() if "markdown" == dataType { - data = dataBlockDOM(data, luteEngine) + var err error + data, err = dataBlockDOM(data, luteEngine) + if nil != err { + ret.Code = -1 + ret.Msg = "data block DOM failed: " + err.Error() + return + } } tree := luteEngine.BlockDOM2Tree(data) if nil == tree || nil == tree.Root || nil == tree.Root.FirstChild { @@ -461,14 +486,35 @@ func broadcastTransactions(transactions []*model.Transaction) { util.PushEvent(evt) } -func dataBlockDOM(data string, luteEngine *lute.Lute) (ret string) { +func dataBlockDOM(data string, luteEngine *lute.Lute) (ret string, err error) { luteEngine.SetHTMLTag2TextMark(true) // API `/api/block/**` 无法使用 `foo` 与 `bar` 插入/更新行内元素 https://github.com/siyuan-note/siyuan/issues/6039 - ret = luteEngine.Md2BlockDOM(data, true) + ret, tree := luteEngine.Md2BlockDOM(data, true) if "" == ret { // 使用 API 插入空字符串出现错误 https://github.com/siyuan-note/siyuan/issues/3931 blankParagraph := treenode.NewParagraph() ret = luteEngine.RenderNodeBlockDOM(blankParagraph) } + + invalidID := "" + ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering { + return ast.WalkContinue + } + + if "" != n.ID { + if !ast.IsNodeIDPattern(n.ID) { + invalidID = n.ID + return ast.WalkStop + } + } + return ast.WalkContinue + }) + + if "" != invalidID { + err = errors.New("found invalid ID [" + invalidID + "]") + ret = "" + return + } return } diff --git a/kernel/go.mod b/kernel/go.mod index 44755c38b..b5d5d6357 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -9,7 +9,7 @@ require ( github.com/88250/clipboard v0.1.5 github.com/88250/epub v0.0.0-20230830085737-c19055cd1f48 github.com/88250/gulu v1.2.3-0.20231209020950-b7b6994e395c - github.com/88250/lute v1.7.6-0.20240107075811-86795b72deef + github.com/88250/lute v1.7.6-0.20240111024801-7e083278df4e github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 github.com/ClarkThan/ahocorasick v0.0.0-20231011042242-30d1ef1347f4 diff --git a/kernel/go.sum b/kernel/go.sum index 6356b6a94..5c47df21f 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -10,8 +10,8 @@ github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950 h1:Pa5hMiBceT github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/88250/gulu v1.2.3-0.20231209020950-b7b6994e395c h1:Fas3hxqP33xA9KKDV50jUmppiiOukk5bdV00Hk5VSSk= github.com/88250/gulu v1.2.3-0.20231209020950-b7b6994e395c/go.mod h1:pTWnjt+6qUqNnP9xltswsJxgCBVu3C7eW09u48LWX0k= -github.com/88250/lute v1.7.6-0.20240107075811-86795b72deef h1:gNcdJGPRlenISFYkJ3H1aE5X/GAad6cZIolLETR27+I= -github.com/88250/lute v1.7.6-0.20240107075811-86795b72deef/go.mod h1:+wUqx/1kdFDbWtxn9LYJlaCOAeol2pjSO6w+WJTVQsg= +github.com/88250/lute v1.7.6-0.20240111024801-7e083278df4e h1:fN0BYXgu8iqPO705kesomO3E/5cENwVLerwbYmMnTps= +github.com/88250/lute v1.7.6-0.20240111024801-7e083278df4e/go.mod h1:+wUqx/1kdFDbWtxn9LYJlaCOAeol2pjSO6w+WJTVQsg= github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c h1:Dl/8S9iLyPMTElnWIBxmjaLiWrkI5P4a21ivwAn5pU0= github.com/88250/pdfcpu v0.3.14-0.20230401044135-c7369a99720c/go.mod h1:S5YT38L/GCjVjmB4PB84PymA1qfopjEhfhTNQilLpv4= github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 h1:48T899JQDwyyRu9yXHePYlPdHtpJfrJEUGBMH3SMBWY= diff --git a/kernel/model/file.go b/kernel/model/file.go index 7b63db4a6..97d1339aa 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1009,7 +1009,7 @@ func CreateDocByMd(boxID, p, title, md string, sorts []string) (tree *parse.Tree } luteEngine := util.NewLute() - dom := luteEngine.Md2BlockDOM(md, false) + dom, _ := luteEngine.Md2BlockDOM(md, false) tree, err = createDoc(box.ID, p, title, dom) if nil != err { return @@ -1032,7 +1032,7 @@ func CreateWithMarkdown(boxID, hPath, md, parentID, id string) (retID string, er WaitForWritingFiles() luteEngine := util.NewLute() - dom := luteEngine.Md2BlockDOM(md, false) + dom, _ := luteEngine.Md2BlockDOM(md, false) retID, err = createDocsByHPath(box.ID, hPath, dom, parentID, id) WaitForWritingFiles() return