From c1fd34f57b5160139ec0319c7e11aeead76adbba Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 5 Dec 2024 10:11:07 +0800 Subject: [PATCH] :art: Improve search highlighting https://github.com/siyuan-note/siyuan/issues/13343 --- kernel/api/filetree.go | 8 +++++++- kernel/api/history.go | 6 +++++- kernel/api/ref.go | 12 ++++++++++-- kernel/model/backlink.go | 12 ++++++------ kernel/model/file.go | 4 ++-- kernel/model/history.go | 4 ++-- 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/kernel/api/filetree.go b/kernel/api/filetree.go index 614d32cf2..7dee01c70 100644 --- a/kernel/api/filetree.go +++ b/kernel/api/filetree.go @@ -1061,8 +1061,14 @@ func getDoc(c *gin.Context) { if nil != isBacklinkArg { isBacklink = isBacklinkArg.(bool) } + highlightArg := arg["highlight"] + highlight := true + if nil != highlightArg { + highlight = highlightArg.(bool) + } - blockCount, content, parentID, parent2ID, rootID, typ, eof, scroll, boxID, docPath, isBacklinkExpand, err := model.GetDoc(startID, endID, id, index, query, queryTypes, queryMethod, mode, size, isBacklink) + blockCount, content, parentID, parent2ID, rootID, typ, eof, scroll, boxID, docPath, isBacklinkExpand, err := + model.GetDoc(startID, endID, id, index, query, queryTypes, queryMethod, mode, size, isBacklink, highlight) if model.ErrBlockNotFound == err { ret.Code = 3 return diff --git a/kernel/api/history.go b/kernel/api/history.go index 220bbfec1..29014224e 100644 --- a/kernel/api/history.go +++ b/kernel/api/history.go @@ -145,7 +145,11 @@ func getDocHistoryContent(c *gin.Context) { if nil != k { keyword = k.(string) } - id, rootID, content, isLargeDoc, err := model.GetDocHistoryContent(historyPath, keyword) + highlight := true + if val, ok := arg["highlight"]; ok { + highlight = val.(bool) + } + id, rootID, content, isLargeDoc, err := model.GetDocHistoryContent(historyPath, keyword, highlight) if err != nil { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/api/ref.go b/kernel/api/ref.go index 9a06f44e7..4de046c81 100644 --- a/kernel/api/ref.go +++ b/kernel/api/ref.go @@ -56,7 +56,11 @@ func getBackmentionDoc(c *gin.Context) { if val, ok := arg["containChildren"]; ok { containChildren = val.(bool) } - backlinks := model.GetBackmentionDoc(defID, refTreeID, keyword, containChildren) + highlight := true + if val, ok := arg["highlight"]; ok { + highlight = val.(bool) + } + backlinks := model.GetBackmentionDoc(defID, refTreeID, keyword, containChildren, highlight) ret.Data = map[string]interface{}{ "backmentions": backlinks, } @@ -78,7 +82,11 @@ func getBacklinkDoc(c *gin.Context) { if val, ok := arg["containChildren"]; ok { containChildren = val.(bool) } - backlinks := model.GetBacklinkDoc(defID, refTreeID, keyword, containChildren) + highlight := true + if val, ok := arg["highlight"]; ok { + highlight = val.(bool) + } + backlinks := model.GetBacklinkDoc(defID, refTreeID, keyword, containChildren, highlight) ret.Data = map[string]interface{}{ "backlinks": backlinks, } diff --git a/kernel/model/backlink.go b/kernel/model/backlink.go index 04ef857bb..9bf0b9d50 100644 --- a/kernel/model/backlink.go +++ b/kernel/model/backlink.go @@ -62,7 +62,7 @@ type Backlink struct { node *ast.Node // 仅用于按文档内容顺序排序 } -func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren bool) (ret []*Backlink) { +func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren, highlight bool) (ret []*Backlink) { var keywords []string keyword = strings.TrimSpace(keyword) if "" != keyword { @@ -102,7 +102,7 @@ func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren bool) ( var refTree *parse.Tree trees := filesys.LoadTrees(mentionBlockIDs) for id, tree := range trees { - backlink := buildBacklink(id, tree, mentionKeywords, luteEngine) + backlink := buildBacklink(id, tree, mentionKeywords, highlight, luteEngine) if nil != backlink { ret = append(ret, backlink) } @@ -118,7 +118,7 @@ func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren bool) ( return } -func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren bool) (ret []*Backlink) { +func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren, highlight bool) (ret []*Backlink) { var keywords []string keyword = strings.TrimSpace(keyword) if "" != keyword { @@ -150,7 +150,7 @@ func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren bool) (ret luteEngine := util.NewLute() for _, linkRef := range linkRefs { - backlink := buildBacklink(linkRef.ID, refTree, keywords, luteEngine) + backlink := buildBacklink(linkRef.ID, refTree, keywords, highlight, luteEngine) if nil != backlink { ret = append(ret, backlink) } @@ -191,7 +191,7 @@ func sortBacklinks(backlinks []*Backlink, tree *parse.Tree) { }) } -func buildBacklink(refID string, refTree *parse.Tree, keywords []string, luteEngine *lute.Lute) (ret *Backlink) { +func buildBacklink(refID string, refTree *parse.Tree, keywords []string, highlight bool, luteEngine *lute.Lute) (ret *Backlink) { n := treenode.GetNodeInTree(refTree, refID) if nil == n { return @@ -199,7 +199,7 @@ func buildBacklink(refID string, refTree *parse.Tree, keywords []string, luteEng renderNodes, expand := getBacklinkRenderNodes(n) - if 0 < len(keywords) { + if highlight && 0 < len(keywords) { for _, renderNode := range renderNodes { var unlinks []*ast.Node diff --git a/kernel/model/file.go b/kernel/model/file.go index 34b23320e..b8a343651 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -599,7 +599,7 @@ func StatTree(id string) (ret *util.BlockStatResult) { } } -func GetDoc(startID, endID, id string, index int, query string, queryTypes map[string]bool, queryMethod, mode int, size int, isBacklink bool) (blockCount int, dom, parentID, parent2ID, rootID, typ string, eof, scroll bool, boxID, docPath string, isBacklinkExpand bool, err error) { +func GetDoc(startID, endID, id string, index int, query string, queryTypes map[string]bool, queryMethod, mode int, size int, isBacklink, highlight bool) (blockCount int, dom, parentID, parent2ID, rootID, typ string, eof, scroll bool, boxID, docPath string, isBacklinkExpand bool, err error) { //os.MkdirAll("pprof", 0755) //cpuProfile, _ := os.Create("pprof/GetDoc") //pprof.StartCPUProfile(cpuProfile) @@ -844,7 +844,7 @@ func GetDoc(startID, endID, id string, index int, query string, queryTypes map[s } } - if 0 < len(keywords) { + if highlight && 0 < len(keywords) { hitBlock := false for p := n.Parent; nil != p; p = p.Parent { if p.ID == id { diff --git a/kernel/model/history.go b/kernel/model/history.go index a49c1cc05..4940586f3 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -147,7 +147,7 @@ func ClearWorkspaceHistory() (err error) { return } -func GetDocHistoryContent(historyPath, keyword string) (id, rootID, content string, isLargeDoc bool, err error) { +func GetDocHistoryContent(historyPath, keyword string, highlight bool) (id, rootID, content string, isLargeDoc bool, err error) { if !gulu.File.IsExist(historyPath) { logging.LogWarnf("doc history [%s] not exist", historyPath) return @@ -185,7 +185,7 @@ func GetDocHistoryContent(historyPath, keyword string) (id, rootID, content stri n.RemoveIALAttr("heading-fold") n.RemoveIALAttr("fold") - if 0 < len(keywords) { + if highlight && 0 < len(keywords) { if markReplaceSpan(n, &unlinks, keywords, search.MarkDataType, luteEngine) { return ast.WalkContinue }