瀏覽代碼

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 7 月之前
父節點
當前提交
27e689da26
共有 1 個文件被更改,包括 52 次插入17 次删除
  1. 52 17
      kernel/model/template.go

+ 52 - 17
kernel/model/template.go

@@ -38,6 +38,7 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
+	"github.com/xrash/smetrics"
 )
 )
 
 
 func RenderGoTemplate(templateContent string) (ret string, err error) {
 func RenderGoTemplate(templateContent string) (ret string, err error) {
@@ -86,14 +87,19 @@ func SearchTemplate(keyword string) (ret []*Block) {
 		return util.PinYinCompare(filepath.Base(groups[i].Name()), filepath.Base(groups[j].Name()))
 		return util.PinYinCompare(filepath.Base(groups[i].Name()), filepath.Base(groups[j].Name()))
 	})
 	})
 
 
-	k := strings.ToLower(keyword)
+	keyword = strings.TrimSpace(keyword)
+	type result struct {
+		block *Block
+		score float64
+	}
+	var results []*result
+	keywords := strings.Fields(keyword)
 	for _, group := range groups {
 	for _, group := range groups {
 		if strings.HasPrefix(group.Name(), ".") {
 		if strings.HasPrefix(group.Name(), ".") {
 			continue
 			continue
 		}
 		}
 
 
 		if group.IsDir() {
 		if group.IsDir() {
-			var templateBlocks []*Block
 			templateDir := filepath.Join(templates, group.Name())
 			templateDir := filepath.Join(templates, group.Name())
 			filelock.Walk(templateDir, func(path string, d fs.DirEntry, err error) error {
 			filelock.Walk(templateDir, func(path string, d fs.DirEntry, err error) error {
 				name := strings.ToLower(d.Name())
 				name := strings.ToLower(d.Name())
@@ -104,37 +110,66 @@ func SearchTemplate(keyword string) (ret []*Block) {
 					return nil
 					return nil
 				}
 				}
 
 
-				if !strings.HasSuffix(name, ".md") || strings.HasPrefix(name, "readme") || !strings.Contains(name, k) {
+				if !strings.HasSuffix(name, ".md") || strings.HasPrefix(name, "readme") {
 					return nil
 					return nil
 				}
 				}
 
 
 				content := strings.TrimPrefix(path, templates)
 				content := strings.TrimPrefix(path, templates)
 				content = strings.TrimSuffix(content, ".md")
 				content = strings.TrimSuffix(content, ".md")
-				content = filepath.ToSlash(content)
-				content = strings.TrimPrefix(content, "/")
-				_, content = search.MarkText(content, keyword, 32, Conf.Search.CaseSensitive)
-				b := &Block{Path: path, Content: content}
-				templateBlocks = append(templateBlocks, b)
+				p := filepath.Join(group.Name(), content)
+				score := 0.0
+				hit := true
+				for _, k := range keywords {
+					if strings.Contains(strings.ToLower(p), strings.ToLower(k)) {
+						score += smetrics.JaroWinkler(name, k, 0.7, 4)
+					} else {
+						hit = false
+						break
+					}
+				}
+				if hit {
+					content = strings.TrimPrefix(path, templates)
+					content = strings.TrimSuffix(content, ".md")
+					content = filepath.ToSlash(content)
+					_, content = search.MarkText(content, strings.Join(keywords, search.TermSep), 32, Conf.Search.CaseSensitive)
+					b := &Block{Path: path, Content: content}
+					results = append(results, &result{block: b, score: score})
+				}
 				return nil
 				return nil
 			})
 			})
-			sort.Slice(templateBlocks, func(i, j int) bool {
-				return util.PinYinCompare(filepath.Base(templateBlocks[i].Path), filepath.Base(templateBlocks[j].Path))
-			})
-			ret = append(ret, templateBlocks...)
 		} else {
 		} else {
 			name := strings.ToLower(group.Name())
 			name := strings.ToLower(group.Name())
-			if strings.HasPrefix(name, ".") || !strings.HasSuffix(name, ".md") || "readme.md" == name || !strings.Contains(name, k) {
+			if strings.HasPrefix(name, ".") || !strings.HasSuffix(name, ".md") || "readme.md" == name {
 				continue
 				continue
 			}
 			}
 
 
 			content := group.Name()
 			content := group.Name()
 			content = strings.TrimSuffix(content, ".md")
 			content = strings.TrimSuffix(content, ".md")
-			content = filepath.ToSlash(content)
-			_, content = search.MarkText(content, keyword, 32, Conf.Search.CaseSensitive)
-			b := &Block{Path: filepath.Join(templates, group.Name()), Content: content}
-			ret = append(ret, b)
+			score := 0.0
+			hit := true
+			for _, k := range keywords {
+				if strings.Contains(strings.ToLower(content), strings.ToLower(k)) {
+					score += smetrics.JaroWinkler(name, k, 0.7, 4)
+				} else {
+					hit = false
+					break
+				}
+			}
+			if hit {
+				content = filepath.ToSlash(content)
+				_, content = search.MarkText(content, strings.Join(keywords, search.TermSep), 32, Conf.Search.CaseSensitive)
+				b := &Block{Path: filepath.Join(templates, group.Name()), Content: content}
+				results = append(results, &result{block: b, score: score})
+			}
 		}
 		}
 	}
 	}
+
+	sort.Slice(results, func(i, j int) bool {
+		return results[i].score > results[j].score
+	})
+	for _, r := range results {
+		ret = append(ret, r.block)
+	}
 	return
 	return
 }
 }