From 058ade01c70717f1570c1e0fe55ca0ff564d7077 Mon Sep 17 00:00:00 2001 From: Jeffrey Chen <78434827+TCOTC@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:26:54 +0800 Subject: [PATCH] :art: Improve the fallback logic for fetching README in the marketplace (#16551) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 加载已下载插件列表时,如果插件指定 README 文件不存在,则回退到 README.md https://github.com/siyuan-note/siyuan/issues/14636#issuecomment-3035905944 * 加载已下载插件列表时,如果插件指定 README 文件不存在,则回退到 README.md https://github.com/siyuan-note/siyuan/issues/14636#issuecomment-3035905944 * 提取公共函数 * 获取首选 Readme Name Desc 时优先回退到指定的默认值 * 兼容赞助链接 * 在线获取 README 时最后回退到 README.md --- kernel/bazaar/icon.go | 13 +--- kernel/bazaar/package.go | 121 +++++++++++++++++++++++++++++--------- kernel/bazaar/plugin.go | 13 +--- kernel/bazaar/template.go | 13 +--- kernel/bazaar/theme.go | 13 +--- kernel/bazaar/widget.go | 13 +--- 6 files changed, 108 insertions(+), 78 deletions(-) diff --git a/kernel/bazaar/icon.go b/kernel/bazaar/icon.go index 4d0d32fb6..49799348b 100644 --- a/kernel/bazaar/icon.go +++ b/kernel/bazaar/icon.go @@ -169,9 +169,9 @@ func InstalledIcons() (ret []*Icon) { icon.PreferredFunding = getPreferredFunding(icon.Funding) icon.PreferredName = GetPreferredName(icon.Package) icon.PreferredDesc = getPreferredDesc(icon.Description) - info, statErr := os.Stat(filepath.Join(installPath, "README.md")) + info, statErr := os.Stat(filepath.Join(installPath, "icon.json")) if nil != statErr { - logging.LogWarnf("stat install theme README.md failed: %s", statErr) + logging.LogWarnf("stat install icon.json failed: %s", statErr) continue } icon.HInstallDate = info.ModTime().Format("2006-01-02") @@ -183,14 +183,7 @@ func InstalledIcons() (ret []*Icon) { packageInstallSizeCache.SetDefault(icon.RepoURL, is) } icon.HInstallSize = humanize.BytesCustomCeil(uint64(icon.InstallSize), 2) - readmeFilename := getPreferredReadme(icon.Readme) - readme, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) - if nil != readErr { - logging.LogWarnf("read installed README.md failed: %s", readErr) - continue - } - - icon.PreferredReadme, _ = renderLocalREADME("/appearance/icons/"+dirName+"/", readme) + icon.PreferredReadme = loadInstalledReadme(installPath, "/appearance/icons/"+dirName+"/", icon.Readme) icon.Outdated = isOutdatedIcon(icon, bazaarIcons) ret = append(ret, icon) } diff --git a/kernel/bazaar/package.go b/kernel/bazaar/package.go index 14ccc46f7..1681780b9 100644 --- a/kernel/bazaar/package.go +++ b/kernel/bazaar/package.go @@ -174,7 +174,7 @@ func getPreferredReadme(readme *Readme) string { return "README.md" } - ret := readme.Default + var ret string switch util.Lang { case "ar_SA": if "" != readme.ArSA { @@ -232,13 +232,14 @@ func getPreferredReadme(readme *Readme) string { if "" != readme.ZhCN { ret = readme.ZhCN } - default: - if "" != readme.EnUS { - ret = readme.EnUS - } } - if "" == ret { - ret = "README.md" + if "" == strings.TrimSpace(ret) { + defaultReadme := strings.TrimSpace(readme.Default) + if defaultReadme != "" { + ret = defaultReadme + } else { + ret = "README.md" + } } return ret } @@ -248,7 +249,7 @@ func GetPreferredName(pkg *Package) string { return pkg.Name } - ret := pkg.DisplayName.Default + var ret string switch util.Lang { case "ar_SA": if "" != pkg.DisplayName.ArSA { @@ -306,13 +307,14 @@ func GetPreferredName(pkg *Package) string { if "" != pkg.DisplayName.ZhCN { ret = pkg.DisplayName.ZhCN } - default: - if "" != pkg.DisplayName.EnUS { - ret = pkg.DisplayName.EnUS - } } - if "" == ret { - ret = pkg.Name + if "" == strings.TrimSpace(ret) { + defaultName := strings.TrimSpace(pkg.DisplayName.Default) + if defaultName != "" { + ret = defaultName + } else { + ret = pkg.Name + } } return ret } @@ -322,7 +324,7 @@ func getPreferredDesc(desc *Description) string { return "" } - ret := desc.Default + var ret string switch util.Lang { case "ar_SA": if "" != desc.ArSA { @@ -380,13 +382,12 @@ func getPreferredDesc(desc *Description) string { if "" != desc.ZhCN { ret = desc.ZhCN } - default: - if "" != desc.EnUS { - ret = desc.EnUS - } } - if "" == ret { - ret = desc.EnUS + if "" == strings.TrimSpace(ret) { + defaultDesc := strings.TrimSpace(desc.Default) + if defaultDesc != "" { + ret = defaultDesc + } } return ret } @@ -397,12 +398,21 @@ func getPreferredFunding(funding *Funding) string { } if "" != funding.OpenCollective { + if strings.HasPrefix(funding.OpenCollective, "http://") || strings.HasPrefix(funding.OpenCollective, "https://") { + return funding.OpenCollective + } return "https://opencollective.com/" + funding.OpenCollective } if "" != funding.Patreon { + if strings.HasPrefix(funding.Patreon, "http://") || strings.HasPrefix(funding.Patreon, "https://") { + return funding.Patreon + } return "https://www.patreon.com/" + funding.Patreon } if "" != funding.GitHub { + if strings.HasPrefix(funding.GitHub, "http://") || strings.HasPrefix(funding.GitHub, "https://") { + return funding.GitHub + } return "https://github.com/sponsors/" + funding.GitHub } if 0 < len(funding.Custom) { @@ -684,14 +694,29 @@ func GetPackageREADME(repoURL, repoHash, packageType string) (ret string) { data, err := downloadPackage(repoURLHash+"/"+readme, false, "") if err != nil { - ret = fmt.Sprintf("Load bazaar package's README.md(%s) failed: %s", readme, err.Error()) - if readme == repo.Package.Readme.Default || "" == strings.TrimSpace(repo.Package.Readme.Default) { - return + ret = fmt.Sprintf("Load bazaar package's preferred README(%s) failed: %s", readme, err.Error()) + // 回退到 Default README + var defaultReadme string + if nil != repo.Package.Readme { + defaultReadme = repo.Package.Readme.Default } - readme = repo.Package.Readme.Default - data, err = downloadPackage(repoURLHash+"/"+readme, false, "") - if err != nil { - ret += fmt.Sprintf("
Load bazaar package's README.md(%s) failed: %s", readme, err.Error()) + if "" == strings.TrimSpace(defaultReadme) { + defaultReadme = "README.md" + } + if readme != defaultReadme { + data, err = downloadPackage(repoURLHash+"/"+defaultReadme, false, "") + if err != nil { + ret += fmt.Sprintf("
Load bazaar package's default README(%s) failed: %s", defaultReadme, err.Error()) + } + } + // 回退到 README.md + if err != nil && readme != "README.md" && defaultReadme != "README.md" { + data, err = downloadPackage(repoURLHash+"/README.md", false, "") + if err != nil { + ret += fmt.Sprintf("
Load bazaar package's README.md failed: %s", err.Error()) + return + } + } else if err != nil { return } } @@ -708,6 +733,46 @@ func GetPackageREADME(repoURL, repoHash, packageType string) (ret string) { return } +func loadInstalledReadme(installPath, basePath string, readme *Readme) (ret string) { + readmeFilename := getPreferredReadme(readme) + readmeData, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) + if nil == readErr { + ret, _ = renderLocalREADME(basePath, readmeData) + return + } + + logging.LogWarnf("read installed %s failed: %s", readmeFilename, readErr) + ret = fmt.Sprintf("File %s not found", readmeFilename) + // 回退到 Default README + var defaultReadme string + if nil != readme { + defaultReadme = strings.TrimSpace(readme.Default) + } + if "" == defaultReadme { + defaultReadme = "README.md" + } + if readmeFilename != defaultReadme { + readmeData, readErr = os.ReadFile(filepath.Join(installPath, defaultReadme)) + if nil == readErr { + ret, _ = renderLocalREADME(basePath, readmeData) + return + } + logging.LogWarnf("read installed %s failed: %s", defaultReadme, readErr) + ret += fmt.Sprintf("
File %s not found", defaultReadme) + } + // 回退到 README.md + if nil != readErr && readmeFilename != "README.md" && defaultReadme != "README.md" { + readmeData, readErr = os.ReadFile(filepath.Join(installPath, "README.md")) + if nil == readErr { + ret, _ = renderLocalREADME(basePath, readmeData) + return + } + logging.LogWarnf("read installed README.md failed: %s", readErr) + ret += "
File README.md not found" + } + return +} + func renderREADME(repoURL string, mdData []byte) (ret string, err error) { luteEngine := lute.New() luteEngine.SetSoftBreak2HardBreak(false) diff --git a/kernel/bazaar/plugin.go b/kernel/bazaar/plugin.go index 0d1e7a06c..7aab7ea89 100644 --- a/kernel/bazaar/plugin.go +++ b/kernel/bazaar/plugin.go @@ -207,9 +207,9 @@ func InstalledPlugins(frontend string, checkUpdate bool) (ret []*Plugin) { plugin.PreferredFunding = getPreferredFunding(plugin.Funding) plugin.PreferredName = GetPreferredName(plugin.Package) plugin.PreferredDesc = getPreferredDesc(plugin.Description) - info, statErr := os.Stat(filepath.Join(installPath, "README.md")) + info, statErr := os.Stat(filepath.Join(installPath, "plugin.json")) if nil != statErr { - logging.LogWarnf("stat install theme README.md failed: %s", statErr) + logging.LogWarnf("stat install plugin.json failed: %s", statErr) continue } plugin.HInstallDate = info.ModTime().Format("2006-01-02") @@ -221,14 +221,7 @@ func InstalledPlugins(frontend string, checkUpdate bool) (ret []*Plugin) { packageInstallSizeCache.SetDefault(plugin.RepoURL, is) } plugin.HInstallSize = humanize.BytesCustomCeil(uint64(plugin.InstallSize), 2) - readmeFilename := getPreferredReadme(plugin.Readme) - readme, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) - if nil != readErr { - logging.LogWarnf("read installed README.md failed: %s", readErr) - continue - } - - plugin.PreferredReadme, _ = renderLocalREADME("/plugins/"+dirName+"/", readme) + plugin.PreferredReadme = loadInstalledReadme(installPath, "/plugins/"+dirName+"/", plugin.Readme) plugin.Outdated = isOutdatedPlugin(plugin, bazaarPlugins) plugin.Incompatible = isIncompatiblePlugin(plugin, frontend) ret = append(ret, plugin) diff --git a/kernel/bazaar/template.go b/kernel/bazaar/template.go index 405d02994..7c09ee869 100644 --- a/kernel/bazaar/template.go +++ b/kernel/bazaar/template.go @@ -170,9 +170,9 @@ func InstalledTemplates() (ret []*Template) { template.PreferredFunding = getPreferredFunding(template.Funding) template.PreferredName = GetPreferredName(template.Package) template.PreferredDesc = getPreferredDesc(template.Description) - info, statErr := os.Stat(filepath.Join(installPath, "README.md")) + info, statErr := os.Stat(filepath.Join(installPath, "template.json")) if nil != statErr { - logging.LogWarnf("stat install theme README.md failed: %s", statErr) + logging.LogWarnf("stat install template.json failed: %s", statErr) continue } template.HInstallDate = info.ModTime().Format("2006-01-02") @@ -184,14 +184,7 @@ func InstalledTemplates() (ret []*Template) { packageInstallSizeCache.SetDefault(template.RepoURL, is) } template.HInstallSize = humanize.BytesCustomCeil(uint64(template.InstallSize), 2) - readmeFilename := getPreferredReadme(template.Readme) - readme, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) - if nil != readErr { - logging.LogWarnf("read installed README.md failed: %s", readErr) - continue - } - - template.PreferredReadme, _ = renderLocalREADME("/templates/"+dirName+"/", readme) + template.PreferredReadme = loadInstalledReadme(installPath, "/templates/"+dirName+"/", template.Readme) template.Outdated = isOutdatedTemplate(template, bazaarTemplates) ret = append(ret, template) } diff --git a/kernel/bazaar/theme.go b/kernel/bazaar/theme.go index 838038358..f9146a08a 100644 --- a/kernel/bazaar/theme.go +++ b/kernel/bazaar/theme.go @@ -171,9 +171,9 @@ func InstalledThemes() (ret []*Theme) { theme.PreferredFunding = getPreferredFunding(theme.Funding) theme.PreferredName = GetPreferredName(theme.Package) theme.PreferredDesc = getPreferredDesc(theme.Description) - info, statErr := os.Stat(filepath.Join(installPath, "README.md")) + info, statErr := os.Stat(filepath.Join(installPath, "theme.json")) if nil != statErr { - logging.LogWarnf("stat install theme README.md failed: %s", statErr) + logging.LogWarnf("stat install theme.json failed: %s", statErr) continue } theme.HInstallDate = info.ModTime().Format("2006-01-02") @@ -185,14 +185,7 @@ func InstalledThemes() (ret []*Theme) { packageInstallSizeCache.SetDefault(theme.RepoURL, is) } theme.HInstallSize = humanize.BytesCustomCeil(uint64(theme.InstallSize), 2) - readmeFilename := getPreferredReadme(theme.Readme) - readme, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) - if nil != readErr { - logging.LogWarnf("read installed README.md failed: %s", readErr) - continue - } - - theme.PreferredReadme, _ = renderLocalREADME("/appearance/themes/"+dirName+"/", readme) + theme.PreferredReadme = loadInstalledReadme(installPath, "/appearance/themes/"+dirName+"/", theme.Readme) theme.Outdated = isOutdatedTheme(theme, bazaarThemes) ret = append(ret, theme) } diff --git a/kernel/bazaar/widget.go b/kernel/bazaar/widget.go index 11e23b171..31bb0f758 100644 --- a/kernel/bazaar/widget.go +++ b/kernel/bazaar/widget.go @@ -167,9 +167,9 @@ func InstalledWidgets() (ret []*Widget) { widget.PreferredFunding = getPreferredFunding(widget.Funding) widget.PreferredName = GetPreferredName(widget.Package) widget.PreferredDesc = getPreferredDesc(widget.Description) - info, statErr := os.Stat(filepath.Join(installPath, "README.md")) + info, statErr := os.Stat(filepath.Join(installPath, "widget.json")) if nil != statErr { - logging.LogWarnf("stat install theme README.md failed: %s", statErr) + logging.LogWarnf("stat install widget.json failed: %s", statErr) continue } widget.HInstallDate = info.ModTime().Format("2006-01-02") @@ -181,14 +181,7 @@ func InstalledWidgets() (ret []*Widget) { packageInstallSizeCache.SetDefault(widget.RepoURL, is) } widget.HInstallSize = humanize.BytesCustomCeil(uint64(widget.InstallSize), 2) - readmeFilename := getPreferredReadme(widget.Readme) - readme, readErr := os.ReadFile(filepath.Join(installPath, readmeFilename)) - if nil != readErr { - logging.LogWarnf("read installed README.md failed: %s", readErr) - continue - } - - widget.PreferredReadme, _ = renderLocalREADME("/widgets/"+dirName+"/", readme) + widget.PreferredReadme = loadInstalledReadme(installPath, "/widgets/"+dirName+"/", widget.Readme) widget.Outdated = isOutdatedWidget(widget, bazaarWidgets) ret = append(ret, widget) }