瀏覽代碼

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

Vanessa 1 年之前
父節點
當前提交
c455f876ba
共有 4 個文件被更改,包括 61 次插入5 次删除
  1. 32 5
      kernel/conf/search.go
  2. 4 0
      kernel/mobile/kernel.go
  3. 8 0
      kernel/model/search.go
  4. 17 0
      kernel/util/file.go

+ 32 - 5
kernel/conf/search.go

@@ -38,6 +38,10 @@ type Search struct {
 	HTMLBlock     bool `json:"htmlBlock"`
 	EmbedBlock    bool `json:"embedBlock"`
 	DatabaseBlock bool `json:"databaseBlock"`
+	AudioBlock    bool `json:"audioBlock"`
+	VideoBlock    bool `json:"videoBlock"`
+	IFrameBlock   bool `json:"iframeBlock"`
+	WidgetBlock   bool `json:"widgetBlock"`
 
 	Limit         int  `json:"limit"`
 	CaseSensitive bool `json:"caseSensitive"`
@@ -76,6 +80,10 @@ func NewSearch() *Search {
 		HTMLBlock:     true,
 		EmbedBlock:    false,
 		DatabaseBlock: true,
+		AudioBlock:    true,
+		VideoBlock:    true,
+		IFrameBlock:   true,
+		WidgetBlock:   true,
 
 		Limit:         64,
 		CaseSensitive: false,
@@ -195,11 +203,30 @@ func (s *Search) TypeFilter() string {
 		buf.WriteByte('\'')
 		buf.WriteString(",")
 	}
-
-	// 无法搜索到 iframe 块、视频块和音频块 https://github.com/siyuan-note/siyuan/issues/3604
-	buf.WriteString("'iframe','video','audio',")
-	// 挂件块支持内置属性搜索 https://github.com/siyuan-note/siyuan/issues/4497
-	buf.WriteString("'widget',")
+	if s.AudioBlock {
+		buf.WriteByte('\'')
+		buf.WriteString(treenode.TypeAbbr(ast.NodeAudio.String()))
+		buf.WriteByte('\'')
+		buf.WriteString(",")
+	}
+	if s.VideoBlock {
+		buf.WriteByte('\'')
+		buf.WriteString(treenode.TypeAbbr(ast.NodeVideo.String()))
+		buf.WriteByte('\'')
+		buf.WriteString(",")
+	}
+	if s.IFrameBlock {
+		buf.WriteByte('\'')
+		buf.WriteString(treenode.TypeAbbr(ast.NodeIFrame.String()))
+		buf.WriteByte('\'')
+		buf.WriteString(",")
+	}
+	if s.WidgetBlock {
+		buf.WriteByte('\'')
+		buf.WriteString(treenode.TypeAbbr(ast.NodeWidget.String()))
+		buf.WriteByte('\'')
+		buf.WriteString(",")
+	}
 
 	ret := buf.String()
 	if "" == ret {

+ 4 - 0
kernel/mobile/kernel.go

@@ -99,6 +99,10 @@ func GetAssetAbsPath(asset string) (ret string) {
 	return
 }
 
+func GetMimeTypeByExt(ext string) string {
+	return util.GetMimeTypeByExt(ext)
+}
+
 func SetTimezone(container, appDir, timezoneID string) {
 	if "ios" == container {
 		os.Setenv("ZONEINFO", filepath.Join(appDir, "app", "zoneinfo.zip"))

+ 8 - 0
kernel/model/search.go

@@ -971,6 +971,10 @@ func buildTypeFilter(types map[string]bool) string {
 		s.HTMLBlock = types["htmlBlock"]
 		s.EmbedBlock = types["embedBlock"]
 		s.DatabaseBlock = types["databaseBlock"]
+		s.AudioBlock = types["audioBlock"]
+		s.VideoBlock = types["videoBlock"]
+		s.IFrameBlock = types["iFrameBlock"]
+		s.WidgetBlock = types["widgetBlock"]
 	} else {
 		s.Document = Conf.Search.Document
 		s.Heading = Conf.Search.Heading
@@ -985,6 +989,10 @@ func buildTypeFilter(types map[string]bool) string {
 		s.HTMLBlock = Conf.Search.HTMLBlock
 		s.EmbedBlock = Conf.Search.EmbedBlock
 		s.DatabaseBlock = Conf.Search.DatabaseBlock
+		s.AudioBlock = Conf.Search.AudioBlock
+		s.VideoBlock = Conf.Search.VideoBlock
+		s.IFrameBlock = Conf.Search.IFrameBlock
+		s.WidgetBlock = Conf.Search.WidgetBlock
 	}
 	return s.TypeFilter()
 }

+ 17 - 0
kernel/util/file.go

@@ -20,6 +20,7 @@ import (
 	"bytes"
 	"io"
 	"io/fs"
+	"mime"
 	"os"
 	"path"
 	"path/filepath"
@@ -28,10 +29,26 @@ import (
 
 	"github.com/88250/gulu"
 	"github.com/88250/lute/ast"
+	"github.com/gabriel-vasile/mimetype"
 	"github.com/siyuan-note/filelock"
 	"github.com/siyuan-note/logging"
 )
 
+func GetMimeTypeByExt(filePath string) (ret string) {
+	ret = mime.TypeByExtension(filepath.Ext(filePath))
+	if "" == ret {
+		m, err := mimetype.DetectFile(filePath)
+		if nil != err {
+			logging.LogErrorf("detect mime type of [%s] failed: %s", filePath, err)
+			return
+		}
+		if nil != m {
+			ret = m.String()
+		}
+	}
+	return
+}
+
 func IsSymlinkPath(absPath string) bool {
 	fi, err := os.Lstat(absPath)
 	if nil != err {