Selaa lähdekoodia

:art: Add plugin config items `backends` and `frontends` https://github.com/siyuan-note/siyuan/issues/8386

Daniel 2 vuotta sitten
vanhempi
commit
02b62eba65

+ 22 - 4
kernel/api/bazaar.go

@@ -46,8 +46,15 @@ func getBazaarPlugin(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
 
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	frontend := arg["frontend"].(string)
+
 	ret.Data = map[string]interface{}{
-		"packages": model.BazaarPlugins(),
+		"packages": model.BazaarPlugins(frontend),
 	}
 }
 
@@ -55,8 +62,15 @@ func getInstalledPlugin(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
 
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	frontend := arg["frontend"].(string)
+
 	ret.Data = map[string]interface{}{
-		"packages": model.InstalledPlugins(),
+		"packages": model.InstalledPlugins(frontend),
 	}
 }
 
@@ -79,9 +93,11 @@ func installBazaarPlugin(c *gin.Context) {
 		return
 	}
 
+	frontend := arg["frontend"].(string)
+
 	util.PushMsg(model.Conf.Language(69), 3000)
 	ret.Data = map[string]interface{}{
-		"packages": model.BazaarPlugins(),
+		"packages": model.BazaarPlugins(frontend),
 	}
 }
 
@@ -102,8 +118,10 @@ func uninstallBazaarPlugin(c *gin.Context) {
 		return
 	}
 
+	frontend := arg["frontend"].(string)
+
 	ret.Data = map[string]interface{}{
-		"packages": model.BazaarPlugins(),
+		"packages": model.BazaarPlugins(frontend),
 	}
 }
 

+ 2 - 1
kernel/api/plugin.go

@@ -44,5 +44,6 @@ func setPetalEnabled(c *gin.Context) {
 
 	packageName := arg["packageName"].(string)
 	enabled := arg["enabled"].(bool)
-	ret.Data = model.SetPetalEnabled(packageName, enabled)
+	frontend := arg["frontend"].(string)
+	ret.Data = model.SetPetalEnabled(packageName, enabled, frontend)
 }

+ 1 - 1
kernel/bazaar/icon.go

@@ -63,7 +63,7 @@ func Icons() (icons []*Icon) {
 			return
 		}
 
-		if disallowDisplayBazaarPackage(icon.MinAppVersion) {
+		if disallowDisplayBazaarPackage(icon.Package) {
 			return
 		}
 

+ 15 - 3
kernel/bazaar/package.go

@@ -69,6 +69,8 @@ type Package struct {
 	URL           string       `json:"url"`
 	Version       string       `json:"version"`
 	MinAppVersion string       `json:"minAppVersion"`
+	Backends      []string     `json:"backends"`
+	Frontends     []string     `json:"frontends"`
 	DisplayName   *DisplayName `json:"displayName"`
 	Description   *Description `json:"description"`
 	Readme        *Readme      `json:"readme"`
@@ -99,6 +101,8 @@ type Package struct {
 	HInstallDate string `json:"hInstallDate"`
 	HUpdated     string `json:"hUpdated"`
 	Downloads    int    `json:"downloads"`
+
+	Incompatible bool `json:"incompatible"`
 }
 
 type StagePackage struct {
@@ -655,9 +659,17 @@ func getBazaarIndex() map[string]*bazaarPackage {
 // Add marketplace package config item `minAppVersion` https://github.com/siyuan-note/siyuan/issues/8330
 const defaultMinAppVersion = "2.9.0"
 
-func disallowDisplayBazaarPackage(minAppVersion string) bool {
-	if "" == minAppVersion { // 目前暂时放过所有不带 minAppVersion 的集市包,后续版本会使用 defaultMinAppVersion
+func disallowDisplayBazaarPackage(pkg *Package) bool {
+	if "" == pkg.MinAppVersion { // 目前暂时放过所有不带 minAppVersion 的集市包,后续版本会使用 defaultMinAppVersion
 		return false
 	}
-	return 0 < semver.Compare("v"+minAppVersion, "v"+util.Ver)
+	if 0 < semver.Compare("v"+pkg.MinAppVersion, "v"+util.Ver) {
+		return true
+	}
+
+	if 0 < len(pkg.Backends) {
+
+	}
+
+	return false
 }

+ 44 - 5
kernel/bazaar/plugin.go

@@ -20,6 +20,7 @@ import (
 	"errors"
 	"os"
 	"path/filepath"
+	"runtime"
 	"sort"
 	"strings"
 	"sync"
@@ -36,7 +37,7 @@ type Plugin struct {
 	Enabled bool `json:"enabled"`
 }
 
-func Plugins() (plugins []*Plugin) {
+func Plugins(frontend string) (plugins []*Plugin) {
 	plugins = []*Plugin{}
 
 	stageIndex, err := getStageIndex("plugins")
@@ -65,10 +66,12 @@ func Plugins() (plugins []*Plugin) {
 			return
 		}
 
-		if disallowDisplayBazaarPackage(plugin.MinAppVersion) {
+		if disallowDisplayBazaarPackage(plugin.Package) {
 			return
 		}
 
+		plugin.Incompatible = isIncompatiblePlugin(plugin, frontend)
+
 		plugin.URL = strings.TrimSuffix(plugin.URL, "/")
 		repoURLHash := strings.Split(repoURL, "@")
 		plugin.RepoURL = "https://github.com/" + repoURLHash[0]
@@ -105,7 +108,7 @@ func Plugins() (plugins []*Plugin) {
 	return
 }
 
-func InstalledPlugins() (ret []*Plugin) {
+func InstalledPlugins(frontend string) (ret []*Plugin) {
 	ret = []*Plugin{}
 
 	pluginsPath := filepath.Join(util.DataDir, "plugins")
@@ -119,7 +122,7 @@ func InstalledPlugins() (ret []*Plugin) {
 		return
 	}
 
-	bazaarPlugins := Plugins()
+	bazaarPlugins := Plugins(frontend)
 
 	for _, pluginDir := range pluginDirs {
 		if !util.IsDirRegularOrSymlink(pluginDir) {
@@ -133,7 +136,6 @@ func InstalledPlugins() (ret []*Plugin) {
 		}
 
 		installPath := filepath.Join(util.DataDir, "plugins", dirName)
-
 		plugin.Installed = true
 		plugin.RepoURL = plugin.URL
 		plugin.PreviewURL = "/plugins/" + dirName + "/preview.png"
@@ -160,6 +162,7 @@ func InstalledPlugins() (ret []*Plugin) {
 
 		plugin.PreferredReadme, _ = renderREADME(plugin.URL, readme)
 		plugin.Outdated = isOutdatedPlugin(plugin, bazaarPlugins)
+		plugin.Incompatible = isIncompatiblePlugin(plugin, frontend)
 		ret = append(ret, plugin)
 	}
 	return
@@ -182,3 +185,39 @@ func UninstallPlugin(installPath string) error {
 	//logging.Logger.Infof("uninstalled plugin [%s]", installPath)
 	return nil
 }
+
+func isIncompatiblePlugin(plugin *Plugin, currentFrontend string) bool {
+	if 1 > len(plugin.Backends) {
+		return false
+	}
+
+	backendOk := false
+	for _, backend := range plugin.Backends {
+		if backend == getCurrentBackend() || "all" == backend {
+			backendOk = true
+			break
+		}
+	}
+
+	frontendOk := false
+	for _, frontend := range plugin.Frontends {
+		if frontend == currentFrontend || "all" == frontend {
+			frontendOk = true
+			break
+		}
+	}
+	return !backendOk || !frontendOk
+}
+
+func getCurrentBackend() string {
+	switch util.Container {
+	case util.ContainerDocker:
+		return "docker"
+	case util.ContainerIOS:
+		return "ios"
+	case util.ContainerAndroid:
+		return "android"
+	default:
+		return runtime.GOOS
+	}
+}

+ 1 - 1
kernel/bazaar/template.go

@@ -64,7 +64,7 @@ func Templates() (templates []*Template) {
 			return
 		}
 
-		if disallowDisplayBazaarPackage(template.MinAppVersion) {
+		if disallowDisplayBazaarPackage(template.Package) {
 			return
 		}
 

+ 1 - 1
kernel/bazaar/theme.go

@@ -65,7 +65,7 @@ func Themes() (ret []*Theme) {
 			return
 		}
 
-		if disallowDisplayBazaarPackage(theme.MinAppVersion) {
+		if disallowDisplayBazaarPackage(theme.Package) {
 			return
 		}
 

+ 1 - 1
kernel/bazaar/widget.go

@@ -64,7 +64,7 @@ func Widgets() (widgets []*Widget) {
 			return
 		}
 
-		if disallowDisplayBazaarPackage(widget.MinAppVersion) {
+		if disallowDisplayBazaarPackage(widget.Package) {
 			return
 		}
 

+ 4 - 4
kernel/model/bazzar.go

@@ -32,8 +32,8 @@ func GetPackageREADME(repoURL, repoHash, packageType string) (ret string) {
 	return
 }
 
-func BazaarPlugins() (plugins []*bazaar.Plugin) {
-	plugins = bazaar.Plugins()
+func BazaarPlugins(frontend string) (plugins []*bazaar.Plugin) {
+	plugins = bazaar.Plugins(frontend)
 	for _, plugin := range plugins {
 		plugin.Installed = util.IsPathRegularDirOrSymlinkDir(filepath.Join(util.DataDir, "plugins", plugin.Name))
 		if plugin.Installed {
@@ -49,8 +49,8 @@ func BazaarPlugins() (plugins []*bazaar.Plugin) {
 	return
 }
 
-func InstalledPlugins() (plugins []*bazaar.Plugin) {
-	plugins = bazaar.InstalledPlugins()
+func InstalledPlugins(frontend string) (plugins []*bazaar.Plugin) {
+	plugins = bazaar.InstalledPlugins(frontend)
 
 	petals := getPetals()
 	for _, plugin := range plugins {

+ 2 - 2
kernel/model/plugin.go

@@ -38,10 +38,10 @@ type Petal struct {
 	I18n map[string]interface{} `json:"i18n"` // i18n text
 }
 
-func SetPetalEnabled(name string, enabled bool) (ret *Petal) {
+func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal) {
 	petals := getPetals()
 
-	plugins := bazaar.InstalledPlugins()
+	plugins := bazaar.InstalledPlugins(frontend)
 	var plugin *bazaar.Plugin
 	for _, p := range plugins {
 		if p.Name == name {