From 30e58a474d9a573b72c2e684f84efb9f279739b9 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 16 Nov 2022 10:33:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?:art:=20=E8=99=9A=E6=8B=9F=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E4=B8=8D=E5=86=8D=E7=BC=93=E5=AD=98=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=AD=97=20Fix=20https://github.com/siyuan-note/siyuan/issues/?= =?UTF-8?q?6602?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/setting.go | 1 - kernel/sql/block_ref_query.go | 6 ------ kernel/sql/cache.go | 23 ----------------------- 3 files changed, 30 deletions(-) diff --git a/kernel/api/setting.go b/kernel/api/setting.go index 3848dd326..00efef01a 100644 --- a/kernel/api/setting.go +++ b/kernel/api/setting.go @@ -215,7 +215,6 @@ func setSearch(c *gin.Context) { if s.CaseSensitive != oldCaseSensitive { model.FullReindex() } - sql.ClearVirtualRefKeywords() ret.Data = s } diff --git a/kernel/sql/block_ref_query.go b/kernel/sql/block_ref_query.go index 4227f3796..e1e43394b 100644 --- a/kernel/sql/block_ref_query.go +++ b/kernel/sql/block_ref_query.go @@ -28,11 +28,6 @@ import ( ) func QueryVirtualRefKeywords(name, alias, anchor, doc bool) (ret []string) { - ret, ok := getVirtualRefKeywordsCache() - if ok { - return ret - } - if name { ret = append(ret, queryNames()...) } @@ -49,7 +44,6 @@ func QueryVirtualRefKeywords(name, alias, anchor, doc bool) (ret []string) { sort.SliceStable(ret, func(i, j int) bool { return len(ret[i]) >= len(ret[j]) }) - setVirtualRefKeywords(ret) return } diff --git a/kernel/sql/cache.go b/kernel/sql/cache.go index f9ecaddfd..b97b6cc99 100644 --- a/kernel/sql/cache.go +++ b/kernel/sql/cache.go @@ -70,29 +70,6 @@ func removeBlockCache(id string) { removeRefCacheByDefID(id) } -func getVirtualRefKeywordsCache() ([]string, bool) { - if disabled { - return nil, false - } - - if val, ok := memCache.Get("virtual_ref"); ok { - return val.([]string), true - } - return nil, false -} - -func setVirtualRefKeywords(keywords []string) { - if disabled { - return - } - - memCache.Set("virtual_ref", keywords, 1) -} - -func ClearVirtualRefKeywords() { - memCache.Del("virtual_ref") -} - var defIDRefsCache = gcache.New(30*time.Minute, 5*time.Minute) // [defBlockID]map[refBlockID]*Ref func GetRefsCacheByDefID(defID string) (ret []*Ref) { From d9e51448dc85e263cfb3acf20ce45979bdda7ddd Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 16 Nov 2022 10:33:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?:art:=20=E8=99=9A=E6=8B=9F=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E6=90=9C=E7=B4=A2=E5=85=B3=E9=94=AE=E5=AD=97=E6=9C=80?= =?UTF-8?q?=E5=A4=9A=E6=94=AF=E6=8C=81=20`512`=20=E4=B8=AA=20Fix=20https:/?= =?UTF-8?q?/github.com/siyuan-note/siyuan/issues/6603?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/virutalref.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/kernel/model/virutalref.go b/kernel/model/virutalref.go index 91c3930bd..7fd370eec 100644 --- a/kernel/model/virutalref.go +++ b/kernel/model/virutalref.go @@ -109,20 +109,17 @@ func getVirtualRefKeywords(docName string) (ret []string) { // 虚拟引用排除当前文档名 https://github.com/siyuan-note/siyuan/issues/4537 ret = gulu.Str.ExcludeElem(ret, []string{docName}) ret = prepareMarkKeywords(ret) + // 虚拟引用搜索关键字最多支持 `512` 个 https://github.com/siyuan-note/siyuan/issues/6603 + if 512 < len(ret) { + ret = ret[:512] + } return } func prepareMarkKeywords(keywords []string) (ret []string) { - keywords = gulu.Str.RemoveDuplicatedElem(keywords) - for _, k := range keywords { - if strings.ContainsAny(k, "?*!@#$%^&()[]{}\\|;:'\",.<>~`") { - continue - } - ret = append(ret, k) - } - + ret = gulu.Str.RemoveDuplicatedElem(keywords) sort.SliceStable(ret, func(i, j int) bool { - return len(ret[i]) < len(ret[j]) + return len(ret[i]) > len(ret[j]) }) return } From e4f5690f029c39b2f5d23af61637cd5644e768ac Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 16 Nov 2022 10:34:02 +0800 Subject: [PATCH 3/3] =?UTF-8?q?:art:=20=E6=94=B9=E8=BF=9B=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=BC=95=E7=94=A8=E5=92=8C=E5=8F=8D=E9=93=BE=E6=8F=90?= =?UTF-8?q?=E5=8F=8A=E6=90=9C=E7=B4=A2=E5=8C=B9=E9=85=8D=20Fix=20https://g?= =?UTF-8?q?ithub.com/siyuan-note/siyuan/issues/6600?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/search.go | 57 +++++++++++------------------------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/kernel/model/search.go b/kernel/model/search.go index daa97f4ad..ff93044aa 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -672,52 +672,25 @@ func markReplaceSpan(n *ast.Node, unlinks *[]*ast.Node, text string, keywords [] // markReplaceSpanWithSplit 用于处理虚拟引用和反链提及高亮。 func markReplaceSpanWithSplit(text string, keywords []string, replacementStart, replacementEnd string) (ret string) { - // 调用该函数前参数 keywords 必须使用 prepareMarkKeywords 函数进行预处理 + tmp := search.EncloseHighlighting(text, keywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive) + parts := strings.Split(tmp, replacementEnd) + buf := bytes.Buffer{} + for i := 0; i < len(parts); i++ { + if i >= len(parts)-1 { + buf.WriteString(parts[i]) + break + } - parts := strings.Split(text, " ") - for i, part := range parts { - if "" == part { + if nextPart := parts[i+1]; 0 < len(nextPart) && lex.IsASCIILetter(nextPart[0]) { + // 取消已经高亮的部分 + part := strings.ReplaceAll(parts[i], replacementStart, "") + buf.WriteString(part) continue } - var hitKeywords []string - for _, k := range keywords { - tmpPart := part - tmpK := k - if !Conf.Search.CaseSensitive { - tmpPart = strings.ToLower(part) - tmpK = strings.ToLower(k) - } - - if gulu.Str.IsASCII(tmpK) { - if gulu.Str.IsASCII(tmpPart) { - if tmpPart == tmpK { - hitKeywords = append(hitKeywords, k) - } - } else { - if strings.Contains(tmpPart, tmpK) { - hitKeywords = append(hitKeywords, k) - } - } - } else { - if strings.Contains(tmpPart, tmpK) { - hitKeywords = append(hitKeywords, k) - } - } - } - if 0 < len(hitKeywords) { - parts[i] = search.EncloseHighlighting(part, hitKeywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive) - } - } - - ret = strings.Join(parts, " ") - if ret != text { - return - } - - // 非 ASCII 文本并且不包含空格时再试试不分词匹配 - if !gulu.Str.IsASCII(text) && !strings.Contains(text, " ") { - ret = search.EncloseHighlighting(text, keywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive) + buf.WriteString(parts[i]) + buf.WriteString(replacementEnd) } + ret = buf.String() return }