mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-30 12:15:16 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
eb0fd2d639
7 changed files with 9 additions and 148 deletions
2
app/stage/protyle/js/lute/lute.min.js
vendored
2
app/stage/protyle/js/lute/lute.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -145,30 +145,3 @@ func getBacklink(c *gin.Context) {
|
|||
}
|
||||
util.RandomSleep(200, 500)
|
||||
}
|
||||
|
||||
func createBacklink(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
||||
arg, ok := util.JsonArg(c, ret)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
defID := arg["defID"].(string)
|
||||
refID := arg["refID"].(string)
|
||||
refText := arg["refText"].(string)
|
||||
isDynamic := arg["isDynamic"].(bool)
|
||||
refRootID, err := model.CreateBacklink(defID, refID, refText, isDynamic)
|
||||
if nil != err {
|
||||
ret.Code = -1
|
||||
ret.Msg = err.Error()
|
||||
return
|
||||
}
|
||||
ret.Data = map[string]interface{}{
|
||||
"defID": defID,
|
||||
"refID": refID,
|
||||
"refRootID": refRootID,
|
||||
"refText": refText,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,7 +172,6 @@ func ServeAPI(ginServer *gin.Engine) {
|
|||
ginServer.Handle("POST", "/api/ref/getBacklink2", model.CheckAuth, getBacklink2)
|
||||
ginServer.Handle("POST", "/api/ref/getBacklinkDoc", model.CheckAuth, getBacklinkDoc)
|
||||
ginServer.Handle("POST", "/api/ref/getBackmentionDoc", model.CheckAuth, getBackmentionDoc)
|
||||
ginServer.Handle("POST", "/api/ref/createBacklink", model.CheckAuth, model.CheckReadonly, createBacklink)
|
||||
|
||||
ginServer.Handle("POST", "/api/attr/getBookmarkLabels", model.CheckAuth, getBookmarkLabels)
|
||||
ginServer.Handle("POST", "/api/attr/resetBlockAttrs", model.CheckAuth, model.CheckReadonly, resetBlockAttrs)
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ require (
|
|||
github.com/88250/clipboard v0.1.5
|
||||
github.com/88250/css v0.1.2
|
||||
github.com/88250/gulu v1.2.3-0.20221117052724-cd06804db798
|
||||
github.com/88250/lute v1.7.5-0.20221119034547-90a028e199cf
|
||||
github.com/88250/lute v1.7.5-0.20221120152609-4d119fdfc7fc
|
||||
github.com/88250/pdfcpu v0.3.13
|
||||
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1
|
||||
github.com/ConradIrwin/font v0.0.0-20210318200717-ce8d41cc0732
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ github.com/88250/gulu v1.2.3-0.20221117052724-cd06804db798 h1:sR/s/Y9wyl79ZRCUER
|
|||
github.com/88250/gulu v1.2.3-0.20221117052724-cd06804db798/go.mod h1:I1qBzsksFL2ciGSuqDE7R3XW4BUMrfDgOvSXEk7FsAI=
|
||||
github.com/88250/lute v1.7.5-0.20221119034547-90a028e199cf h1:tf2NBNicQxhMFe0C3MLV1Hx6JMIflWOPxmvxksGil0o=
|
||||
github.com/88250/lute v1.7.5-0.20221119034547-90a028e199cf/go.mod h1:cEoBGi0zArPqAsp0MdG9SKinvH/xxZZWXU7sRx8vHSA=
|
||||
github.com/88250/lute v1.7.5-0.20221120152609-4d119fdfc7fc h1:Tixt1k0Ct6VZVTvvhBvRXWMdWi00pEJZXHgXGcSv/+o=
|
||||
github.com/88250/lute v1.7.5-0.20221120152609-4d119fdfc7fc/go.mod h1:cEoBGi0zArPqAsp0MdG9SKinvH/xxZZWXU7sRx8vHSA=
|
||||
github.com/88250/pdfcpu v0.3.13 h1:touMWMZkCGalMIbEg9bxYp7rETM+zwb9hXjwhqi4I7Q=
|
||||
github.com/88250/pdfcpu v0.3.13/go.mod h1:S5YT38L/GCjVjmB4PB84PymA1qfopjEhfhTNQilLpv4=
|
||||
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 h1:48T899JQDwyyRu9yXHePYlPdHtpJfrJEUGBMH3SMBWY=
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ import (
|
|||
"bytes"
|
||||
"fmt"
|
||||
"path"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
|
@ -64,102 +63,6 @@ func RefreshBacklink(id string) {
|
|||
}
|
||||
}
|
||||
|
||||
func CreateBacklink(defID, refID, refText string, isDynamic bool) (refRootID string, err error) {
|
||||
refTree, err := loadTreeByBlockID(refID)
|
||||
if nil != err {
|
||||
return "", err
|
||||
}
|
||||
refNode := treenode.GetNodeInTree(refTree, refID)
|
||||
if nil == refNode {
|
||||
return
|
||||
}
|
||||
refRootID = refTree.Root.ID
|
||||
|
||||
defBlockTree := treenode.GetBlockTree(defID)
|
||||
if nil == defBlockTree {
|
||||
return
|
||||
}
|
||||
defRoot := sql.GetBlock(defBlockTree.RootID)
|
||||
if nil == defRoot {
|
||||
return
|
||||
}
|
||||
|
||||
refTextLower := strings.ToLower(refText)
|
||||
defBlock := sql.QueryBlockByNameOrAlias(defRoot.ID, refText)
|
||||
if nil == defBlock {
|
||||
if strings.ToLower(defRoot.Content) == refTextLower {
|
||||
// 如果命名别名没有命中,但文档名和提及关键字匹配,则使用文档作为定义块
|
||||
defBlock = defRoot
|
||||
}
|
||||
if nil == defBlock {
|
||||
// 使用锚文本进行搜索,取第一个匹配的定义块
|
||||
if defIDs := sql.QueryBlockDefIDsByRefText(refTextLower, nil); 0 < len(defIDs) {
|
||||
if defBlock = sql.GetBlock(defIDs[0]); nil != defBlock {
|
||||
goto OK
|
||||
}
|
||||
}
|
||||
}
|
||||
if nil == defBlock {
|
||||
defBlock = sql.GetBlock(defBlockTree.ID)
|
||||
}
|
||||
if nil == defBlock {
|
||||
return
|
||||
}
|
||||
if strings.ToLower(defBlock.Content) != refTextLower {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
OK:
|
||||
luteEngine := NewLute()
|
||||
found := false
|
||||
var toRemove []*ast.Node
|
||||
ast.Walk(refNode, func(n *ast.Node, entering bool) ast.WalkStatus {
|
||||
if !entering {
|
||||
return ast.WalkContinue
|
||||
}
|
||||
|
||||
if ast.NodeText != n.Type {
|
||||
return ast.WalkContinue
|
||||
}
|
||||
|
||||
text := gulu.Str.FromBytes(n.Tokens)
|
||||
re := regexp.MustCompile("(?i)" + refText)
|
||||
if strings.Contains(strings.ToLower(text), refTextLower) {
|
||||
if isDynamic {
|
||||
text = re.ReplaceAllString(text, "(("+defBlock.ID+" '"+refText+"'))")
|
||||
} else {
|
||||
text = re.ReplaceAllString(text, "(("+defBlock.ID+" \""+refText+"\"))")
|
||||
}
|
||||
found = true
|
||||
subTree := parse.Inline("", []byte(text), luteEngine.ParseOptions)
|
||||
var toInsert []*ast.Node
|
||||
for newNode := subTree.Root.FirstChild.FirstChild; nil != newNode; newNode = newNode.Next {
|
||||
toInsert = append(toInsert, newNode)
|
||||
}
|
||||
for _, insert := range toInsert {
|
||||
n.InsertBefore(insert)
|
||||
}
|
||||
toRemove = append(toRemove, n)
|
||||
}
|
||||
return ast.WalkContinue
|
||||
})
|
||||
|
||||
for _, n := range toRemove {
|
||||
n.Unlink()
|
||||
}
|
||||
|
||||
if found {
|
||||
refTree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
|
||||
if err = indexWriteJSONQueue(refTree); nil != err {
|
||||
return "", err
|
||||
}
|
||||
IncSync()
|
||||
}
|
||||
sql.WaitForWritingDatabase()
|
||||
return
|
||||
}
|
||||
|
||||
type Backlink struct {
|
||||
DOM string `json:"dom"`
|
||||
BlockPaths []*BlockPath `json:"blockPaths"`
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ func SplitKeyword(keyword string) (keywords []string) {
|
|||
return
|
||||
}
|
||||
|
||||
func EncloseHighlighting(text string, keywords []string, openMark, closeMark string, caseSensitive bool) string {
|
||||
func EncloseHighlighting(text string, keywords []string, openMark, closeMark string, caseSensitive bool) (ret string) {
|
||||
ic := "(?i)"
|
||||
if caseSensitive {
|
||||
ic = "(?)"
|
||||
|
|
@ -92,26 +92,10 @@ func EncloseHighlighting(text string, keywords []string, openMark, closeMark str
|
|||
}
|
||||
}
|
||||
re += ")"
|
||||
ret = text
|
||||
|
||||
if reg, err := regexp.Compile(re); nil == err {
|
||||
text = reg.ReplaceAllStringFunc(text, func(s string) string {
|
||||
return openMark + s + closeMark
|
||||
})
|
||||
} else {
|
||||
for _, k := range keywords {
|
||||
k = regexp.QuoteMeta(k)
|
||||
var repls, words []string
|
||||
if re, err := regexp.Compile(ic + k); nil == err {
|
||||
words = re.FindAllString(text, -1)
|
||||
} else {
|
||||
re, _ := regexp.Compile(ic + regexp.QuoteMeta(k))
|
||||
words = re.FindAllString(text, -1)
|
||||
}
|
||||
for _, word := range words {
|
||||
repls = append(repls, word, openMark+word+closeMark)
|
||||
}
|
||||
replacer := strings.NewReplacer(repls...)
|
||||
text = replacer.Replace(text)
|
||||
}
|
||||
ret = reg.ReplaceAllStringFunc(text, func(s string) string { return openMark + s + closeMark })
|
||||
}
|
||||
return text
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue