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