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

Improve plugin load performance https://github.com/siyuan-note/siyuan/issues/8397
This commit is contained in:
Daniel 2023-05-29 21:17:24 +08:00
parent 52c9b5fbca
commit f5a9c2d316
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
5 changed files with 78 additions and 31 deletions

View file

@ -110,16 +110,15 @@ func uninstallBazaarPlugin(c *gin.Context) {
return
}
frontend := arg["frontend"].(string)
packageName := arg["packageName"].(string)
err := model.UninstallBazaarPlugin(packageName)
err := model.UninstallBazaarPlugin(packageName, frontend)
if nil != err {
ret.Code = -1
ret.Msg = err.Error()
return
}
frontend := arg["frontend"].(string)
ret.Data = map[string]interface{}{
"packages": model.BazaarPlugins(frontend),
}

View file

@ -29,7 +29,14 @@ func loadPetals(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
petals := model.LoadPetals()
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
frontend := arg["frontend"].(string)
petals := model.LoadPetals(frontend)
ret.Data = petals
}
@ -45,5 +52,12 @@ func setPetalEnabled(c *gin.Context) {
packageName := arg["packageName"].(string)
enabled := arg["enabled"].(bool)
frontend := arg["frontend"].(string)
ret.Data = model.SetPetalEnabled(packageName, enabled, frontend)
data, err := model.SetPetalEnabled(packageName, enabled, frontend)
if nil != err {
ret.Code = -1
ret.Msg = err.Error()
return
}
ret.Data = data
}

View file

@ -108,7 +108,39 @@ func Plugins(frontend string) (plugins []*Plugin) {
return
}
func InstalledPlugins(frontend string) (ret []*Plugin) {
func IsIncompatibleInstalledPlugin(name, frontend string) (found, incompatible bool) {
pluginsPath := filepath.Join(util.DataDir, "plugins")
if !util.IsPathRegularDirOrSymlinkDir(pluginsPath) {
return
}
pluginDirs, err := os.ReadDir(pluginsPath)
if nil != err {
logging.LogWarnf("read plugins folder failed: %s", err)
return
}
for _, pluginDir := range pluginDirs {
if !util.IsDirRegularOrSymlink(pluginDir) {
continue
}
dirName := pluginDir.Name()
if name != dirName {
continue
}
plugin, parseErr := PluginJSON(dirName)
if nil != parseErr || nil == plugin {
return
}
found = true
incompatible = isIncompatiblePlugin(plugin, frontend)
}
return
}
func InstalledPlugins(frontend string, checkUpdate bool) (ret []*Plugin) {
ret = []*Plugin{}
pluginsPath := filepath.Join(util.DataDir, "plugins")
@ -122,7 +154,10 @@ func InstalledPlugins(frontend string) (ret []*Plugin) {
return
}
bazaarPlugins := Plugins(frontend)
var bazaarPlugins []*Plugin
if checkUpdate {
bazaarPlugins = Plugins(frontend)
}
for _, pluginDir := range pluginDirs {
if !util.IsDirRegularOrSymlink(pluginDir) {

View file

@ -50,9 +50,9 @@ func BazaarPlugins(frontend string) (plugins []*bazaar.Plugin) {
}
func InstalledPlugins(frontend string) (plugins []*bazaar.Plugin) {
plugins = bazaar.InstalledPlugins(frontend)
plugins = bazaar.InstalledPlugins(frontend, true)
petals := getPetals()
petals := getPetals(frontend)
for _, plugin := range plugins {
petal := getPetalByName(plugin.Name, petals)
if nil != petal {
@ -71,14 +71,14 @@ func InstallBazaarPlugin(repoURL, repoHash, pluginName string) error {
return nil
}
func UninstallBazaarPlugin(pluginName string) error {
func UninstallBazaarPlugin(pluginName, frontend string) error {
installPath := filepath.Join(util.DataDir, "plugins", pluginName)
err := bazaar.UninstallPlugin(installPath)
if nil != err {
return errors.New(fmt.Sprintf(Conf.Language(47), err.Error()))
}
petals := getPetals()
petals := getPetals(frontend)
var tmp []*Petal
for i, petal := range petals {
if petal.Name != pluginName {

View file

@ -17,6 +17,7 @@
package model
import (
"fmt"
"os"
"path/filepath"
"sync"
@ -30,52 +31,50 @@ import (
// Petal represents a plugin's management status.
type Petal struct {
Name string `json:"name"` // Plugin name
Enabled bool `json:"enabled"` // Whether enabled
Name string `json:"name"` // Plugin name
Enabled bool `json:"enabled"` // Whether enabled
Incompatible bool `json:"incompatible"` // Whether incompatible
JS string `json:"js"` // JS code
CSS string `json:"css"` // CSS code
I18n map[string]interface{} `json:"i18n"` // i18n text
}
func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal) {
func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal, err error) {
petals := getPetals()
plugins := bazaar.InstalledPlugins(frontend)
var plugin *bazaar.Plugin
for _, p := range plugins {
if p.Name == name {
plugin = p
break
}
}
if nil == plugin {
found, incompatible := bazaar.IsIncompatibleInstalledPlugin(name, frontend)
if !found {
logging.LogErrorf("plugin [%s] not found", name)
return
}
ret = getPetalByName(plugin.Name, petals)
ret = getPetalByName(name, petals)
if nil == ret {
ret = &Petal{
Name: plugin.Name,
Enabled: enabled,
Name: name,
}
petals = append(petals, ret)
} else {
ret.Enabled = enabled
}
ret.Enabled = enabled
ret.Incompatible = incompatible
if incompatible {
err = fmt.Errorf("plugin [%s] is incompatible", name)
return
}
savePetals(petals)
loadCode(ret)
return
}
func LoadPetals() (ret []*Petal) {
func LoadPetals(frontend string) (ret []*Petal) {
ret = []*Petal{}
petals := getPetals()
for _, petal := range petals {
if !petal.Enabled {
_, petal.Incompatible = bazaar.IsIncompatibleInstalledPlugin(petal.Name, frontend)
if !petal.Enabled || petal.Incompatible {
continue
}