Sfoglia il codice sorgente

:bug: 表格块过大时搜索无法高亮并定位匹配的关键字 Fix https://github.com/siyuan-note/siyuan/issues/6103

Liang Ding 2 anni fa
parent
commit
3a1d8de0a3
2 ha cambiato i file con 23 aggiunte e 3 eliminazioni
  1. 15 3
      kernel/model/search.go
  2. 8 0
      kernel/util/string.go

+ 15 - 3
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, "<mark>")
+	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) + "..."
 	}

+ 8 - 0
kernel/util/string.go

@@ -15,3 +15,11 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 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)
+}