From 0c450d9fcd76da42e1aee12ebbb056ff33c6caf8 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 26 Sep 2024 11:16:47 +0800 Subject: [PATCH 1/3] :art: Support export and import settings https://github.com/siyuan-note/siyuan/issues/10617 --- kernel/api/system.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kernel/api/system.go b/kernel/api/system.go index 8eb975c48..f9a04ffc0 100644 --- a/kernel/api/system.go +++ b/kernel/api/system.go @@ -230,6 +230,11 @@ func exportConf(c *gin.Context) { return } + if nil != clonedConf.Appearance { + clonedConf.Appearance.DarkThemes = nil + clonedConf.Appearance.LightThemes = nil + clonedConf.Appearance.Icons = nil + } if nil != clonedConf.Editor { clonedConf.Editor.Emoji = []string{} } From d58d967522231fd5a3ceb00b2298c73899fcf0a9 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 26 Sep 2024 11:17:27 +0800 Subject: [PATCH 2/3] :art: Improve appearance setting theme name display https://github.com/siyuan-note/siyuan/issues/10903 --- kernel/conf/appearance.go | 37 +++++++++++++++++++--------------- kernel/model/appearance.go | 41 ++++++++++++++++++++++++++++++++++---- kernel/model/bazzar.go | 2 +- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/kernel/conf/appearance.go b/kernel/conf/appearance.go index 107abbac6..ebd1002ac 100644 --- a/kernel/conf/appearance.go +++ b/kernel/conf/appearance.go @@ -17,22 +17,22 @@ package conf type Appearance struct { - Mode int `json:"mode"` // 模式:0:明亮,1:暗黑 - ModeOS bool `json:"modeOS"` // 模式是否跟随系统 - DarkThemes []string `json:"darkThemes"` // 暗黑模式外观主题列表 - LightThemes []string `json:"lightThemes"` // 明亮模式外观主题列表 - ThemeDark string `json:"themeDark"` // 选择的暗黑模式外观主题 - ThemeLight string `json:"themeLight"` // 选择的明亮模式外观主题 - ThemeVer string `json:"themeVer"` // 选择的主题版本 - Icons []string `json:"icons"` // 图标列表 - Icon string `json:"icon"` // 选择的图标 - IconVer string `json:"iconVer"` // 选择的图标版本 - CodeBlockThemeLight string `json:"codeBlockThemeLight"` // 明亮模式下代码块主题 - CodeBlockThemeDark string `json:"codeBlockThemeDark"` // 暗黑模式下代码块主题 - Lang string `json:"lang"` // 选择的界面语言,同 AppConf.Lang - ThemeJS bool `json:"themeJS"` // 是否启用了主题 JavaScript - CloseButtonBehavior int `json:"closeButtonBehavior"` // 关闭按钮行为,0:退出,1:最小化到托盘 - HideStatusBar bool `json:"hideStatusBar"` // 是否隐藏底部状态栏 + Mode int `json:"mode"` // 模式:0:明亮,1:暗黑 + ModeOS bool `json:"modeOS"` // 模式是否跟随系统 + DarkThemes []*AppearanceTheme `json:"darkThemes"` // 暗黑模式外观主题列表 + LightThemes []*AppearanceTheme `json:"lightThemes"` // 明亮模式外观主题列表 + ThemeDark string `json:"themeDark"` // 选择的暗黑模式外观主题 + ThemeLight string `json:"themeLight"` // 选择的明亮模式外观主题 + ThemeVer string `json:"themeVer"` // 选择的主题版本 + Icons []string `json:"icons"` // 图标列表 + Icon string `json:"icon"` // 选择的图标 + IconVer string `json:"iconVer"` // 选择的图标版本 + CodeBlockThemeLight string `json:"codeBlockThemeLight"` // 明亮模式下代码块主题 + CodeBlockThemeDark string `json:"codeBlockThemeDark"` // 暗黑模式下代码块主题 + Lang string `json:"lang"` // 选择的界面语言,同 AppConf.Lang + ThemeJS bool `json:"themeJS"` // 是否启用了主题 JavaScript + CloseButtonBehavior int `json:"closeButtonBehavior"` // 关闭按钮行为,0:退出,1:最小化到托盘 + HideStatusBar bool `json:"hideStatusBar"` // 是否隐藏底部状态栏 } func NewAppearance() *Appearance { @@ -49,3 +49,8 @@ func NewAppearance() *Appearance { HideStatusBar: false, } } + +type AppearanceTheme struct { + Name string `json:"name"` // daylight + Label string `json:"label"` // i18n display name +} diff --git a/kernel/model/appearance.go b/kernel/model/appearance.go index bc1a5686d..dccdb8c28 100644 --- a/kernel/model/appearance.go +++ b/kernel/model/appearance.go @@ -29,6 +29,7 @@ import ( "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/bazaar" + "github.com/siyuan-note/siyuan/kernel/conf" "github.com/siyuan-note/siyuan/kernel/util" ) @@ -49,11 +50,11 @@ func InitAppearance() { } loadThemes() - if !gulu.Str.Contains(Conf.Appearance.ThemeDark, Conf.Appearance.DarkThemes) { + if !containTheme(Conf.Appearance.ThemeDark, Conf.Appearance.DarkThemes) { Conf.Appearance.ThemeDark = "midnight" Conf.Appearance.ThemeJS = false } - if !gulu.Str.Contains(Conf.Appearance.ThemeLight, Conf.Appearance.LightThemes) { + if !containTheme(Conf.Appearance.ThemeLight, Conf.Appearance.LightThemes) { Conf.Appearance.ThemeLight = "daylight" Conf.Appearance.ThemeJS = false } @@ -66,6 +67,15 @@ func InitAppearance() { Conf.Save() } +func containTheme(name string, themes []*conf.AppearanceTheme) bool { + for _, t := range themes { + if t.Name == name { + return true + } + } + return false +} + var themeWatchers = sync.Map{} // [string]*fsnotify.Watcher{} func closeThemeWatchers() { @@ -118,10 +128,33 @@ func loadThemes() { modes := themeConf.Modes for _, mode := range modes { + t := &conf.AppearanceTheme{Name: name} + if "zh_CN" == util.Lang { + if "midnight" == name { + t.Label = name + "(默认主题)" + } else if "daylight" == name { + t.Label = name + "(默认主题)" + } else { + if nil != themeConf.DisplayName && "" != themeConf.DisplayName.ZhCN && name != themeConf.DisplayName.ZhCN { + t.Label = themeConf.DisplayName.ZhCN + "(" + name + ")" + } else { + t.Label = name + } + } + } else { + if "midnight" == name { + t.Label = name + " (Default)" + } else if "daylight" == name { + t.Label = name + " (Default)" + } else { + t.Label = name + } + } + if "dark" == mode { - Conf.Appearance.DarkThemes = append(Conf.Appearance.DarkThemes, name) + Conf.Appearance.DarkThemes = append(Conf.Appearance.DarkThemes, t) } else if "light" == mode { - Conf.Appearance.LightThemes = append(Conf.Appearance.LightThemes, name) + Conf.Appearance.LightThemes = append(Conf.Appearance.LightThemes, t) } } diff --git a/kernel/model/bazzar.go b/kernel/model/bazzar.go index 99660c384..6b3f41439 100644 --- a/kernel/model/bazzar.go +++ b/kernel/model/bazzar.go @@ -376,7 +376,7 @@ func BazaarThemes(keyword string) (ret []*bazaar.Theme) { installs = append(installs, Conf.Appearance.LightThemes...) for _, installed := range installs { for _, theme := range ret { - if installed == theme.Name { + if installed.Name == theme.Name { theme.Installed = true if themeConf, err := bazaar.ThemeJSON(theme.Name); err == nil { theme.Outdated = 0 > semver.Compare("v"+themeConf.Version, "v"+theme.Version) From d2be055fc5914f60d130da512b988d0eb052bbba Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 26 Sep 2024 16:05:36 +0800 Subject: [PATCH 3/3] :art: Moving doc search supports multiple keywords separated by spaces https://github.com/siyuan-note/siyuan/issues/12577 --- kernel/model/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/model/file.go b/kernel/model/file.go index 2d70b4ee3..74636e838 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -184,7 +184,7 @@ func SearchDocsByKeyword(keyword string, flashcard bool) (ret []map[string]strin var rootBlocks []*sql.Block if 0 < len(keywords) { for _, box := range boxes { - if util.ContainsSubStr(box.Name, keywords) { + if gulu.Str.Contains(box.Name, keywords) { if flashcard { newFlashcardCount, dueFlashcardCount, flashcardCount := countBoxFlashcard(box.ID, deck, deckBlockIDs) if 0 < flashcardCount {