|
@@ -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/**` 无法使用 `<u>foo</u>` 与 `<kbd>bar</kbd>` 插入/更新行内元素 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
|
|
|
}
|