🎨 Improve the fallback logic for fetching README in the marketplace (#16551)

* 加载已下载插件列表时,如果插件指定 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
This commit is contained in:
Jeffrey Chen 2025-12-10 11:26:54 +08:00 committed by GitHub
parent d11ed21f06
commit 058ade01c7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 108 additions and 78 deletions

View file

@ -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("<br>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("<br>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("<br>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("<br>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 += "<br>File README.md not found"
}
return
}
func renderREADME(repoURL string, mdData []byte) (ret string, err error) {
luteEngine := lute.New()
luteEngine.SetSoftBreak2HardBreak(false)