|
@@ -672,52 +672,25 @@ func markReplaceSpan(n *ast.Node, unlinks *[]*ast.Node, text string, keywords []
|
|
|
|
|
|
// markReplaceSpanWithSplit 用于处理虚拟引用和反链提及高亮。
|
|
// markReplaceSpanWithSplit 用于处理虚拟引用和反链提及高亮。
|
|
func markReplaceSpanWithSplit(text string, keywords []string, replacementStart, replacementEnd string) (ret string) {
|
|
func markReplaceSpanWithSplit(text string, keywords []string, replacementStart, replacementEnd string) (ret string) {
|
|
- // 调用该函数前参数 keywords 必须使用 prepareMarkKeywords 函数进行预处理
|
|
|
|
-
|
|
|
|
- parts := strings.Split(text, " ")
|
|
|
|
- for i, part := range parts {
|
|
|
|
- if "" == part {
|
|
|
|
- continue
|
|
|
|
|
|
+ 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
|
|
}
|
|
}
|
|
|
|
|
|
- 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)
|
|
|
|
|
|
+ if nextPart := parts[i+1]; 0 < len(nextPart) && lex.IsASCIILetter(nextPart[0]) {
|
|
|
|
+ // 取消已经高亮的部分
|
|
|
|
+ part := strings.ReplaceAll(parts[i], replacementStart, "")
|
|
|
|
+ buf.WriteString(part)
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
- 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
|
|
return
|
|
}
|
|
}
|