From 3a1d8de0a3d7709d86e6b90d9fa63fa14b98b22e Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sun, 9 Oct 2022 23:55:04 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E8=A1=A8=E6=A0=BC=E5=9D=97=E8=BF=87?= =?UTF-8?q?=E5=A4=A7=E6=97=B6=E6=90=9C=E7=B4=A2=E6=97=A0=E6=B3=95=E9=AB=98?= =?UTF-8?q?=E4=BA=AE=E5=B9=B6=E5=AE=9A=E4=BD=8D=E5=8C=B9=E9=85=8D=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E9=94=AE=E5=AD=97=20Fix=20https://github.com/siyuan-n?= =?UTF-8?q?ote/siyuan/issues/6103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/search.go | 18 +++++++++++++++--- kernel/util/string.go | 8 ++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/kernel/model/search.go b/kernel/model/search.go index 7cf67eeb0..14e65d11b 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -452,9 +452,6 @@ func query2Stmt(queryStr string) (ret string) { func markSearch(text string, keyword string, beforeLen int) (marked string, score float64) { if 0 == len(keyword) { marked = text - if maxLen := 5120; maxLen < utf8.RuneCountInString(marked) { - marked = gulu.Str.SubStr(marked, maxLen) + "..." - } if strings.Contains(marked, search.SearchMarkLeft) { // 使用 FTS snippet() 处理过高亮片段,这里简单替换后就返回 marked = html.EscapeString(text) @@ -550,6 +547,21 @@ func fromSQLBlock(sqlBlock *sql.Block, terms string, beforeLen int) (block *Bloc } func maxContent(content string, maxLen int) string { + idx := strings.Index(content, "") + if 128 < maxLen && maxLen <= idx { + head := bytes.Buffer{} + for i := 0; i < 512; i++ { + r, size := utf8.DecodeLastRuneInString(content[:idx]) + head.WriteRune(r) + idx -= size + if 64 < head.Len() { + break + } + } + + content = util.Reverse(head.String()) + content[idx:] + } + if maxLen < utf8.RuneCountInString(content) { return gulu.Str.SubStr(content, maxLen) + "..." } diff --git a/kernel/util/string.go b/kernel/util/string.go index 739e0a6bc..6f25cb255 100644 --- a/kernel/util/string.go +++ b/kernel/util/string.go @@ -15,3 +15,11 @@ // along with this program. If not, see . package util + +func Reverse(s string) string { + runes := []rune(s) + for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { + runes[i], runes[j] = runes[j], runes[i] + } + return string(runes) +}