mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Support configurable extra plugin lookup path (#2693)
* plugin loader(feat): support loading plugins from user defined directories Extra plugin lookup paths can be set in global reader setting via key `extra_plugin_paths`. Value of the key can either be a string or an array of strings. * build(fix): also purge non-exist plugins on build * plugin: migrate debug plugin to menu sorter
This commit is contained in:
committed by
Frans de Jonge
parent
ba74921c4b
commit
1461574894
@@ -1,42 +1,66 @@
|
||||
local lfs = require("libs/libkoreader-lfs")
|
||||
local logger = require("logger")
|
||||
|
||||
local PluginLoader = {
|
||||
plugin_path = "plugins"
|
||||
}
|
||||
local DEFAULT_PLUGIN_PATH = "plugins"
|
||||
|
||||
local PluginLoader = {}
|
||||
|
||||
function PluginLoader:loadPlugins()
|
||||
if self.plugins then return self.plugins end
|
||||
|
||||
self.plugins = {}
|
||||
for f in lfs.dir(self.plugin_path) do
|
||||
local path = self.plugin_path.."/"..f
|
||||
local mode = lfs.attributes(path, "mode")
|
||||
-- valid koreader plugin directory
|
||||
if mode == "directory" and f:find(".+%.koplugin$") then
|
||||
local mainfile = path.."/".."main.lua"
|
||||
local package_path = package.path
|
||||
local package_cpath = package.cpath
|
||||
package.path = path.."/?.lua;"..package.path
|
||||
package.cpath = path.."/lib/?.so;"..package.cpath
|
||||
local ok, plugin_module = pcall(dofile, mainfile)
|
||||
if not ok or not plugin_module then
|
||||
logger.warn("Error when loading", mainfile, plugin_module)
|
||||
elseif type(plugin_module.disabled) ~= "boolean" or not plugin_module.disabled then
|
||||
local lookup_path_list = { DEFAULT_PLUGIN_PATH }
|
||||
local extra_paths = G_reader_settings:readSetting("extra_plugin_paths")
|
||||
if extra_paths then
|
||||
if type(extra_paths) == "string" then
|
||||
extra_paths = { extra_paths }
|
||||
end
|
||||
if type(extra_paths) == "table" then
|
||||
for _,extra_path in ipairs(extra_paths) do
|
||||
local extra_path_mode = lfs.attributes(extra_path, "mode")
|
||||
if extra_path_mode == "directory" and extra_path ~= DEFAULT_PLUGIN_PATH then
|
||||
table.insert(lookup_path_list, extra_path)
|
||||
end
|
||||
end
|
||||
else
|
||||
logger.err("extra_plugin_paths config only accepts string or table value")
|
||||
end
|
||||
end
|
||||
|
||||
-- keep reference to old value so they can be restored later
|
||||
local package_path = package.path
|
||||
local package_cpath = package.cpath
|
||||
|
||||
for _,lookup_path in ipairs(lookup_path_list) do
|
||||
logger.info('Loading plugins from directory:', lookup_path)
|
||||
for entry in lfs.dir(lookup_path) do
|
||||
local plugin_root = lookup_path.."/"..entry
|
||||
local mode = lfs.attributes(plugin_root, "mode")
|
||||
-- valid koreader plugin directory
|
||||
if mode == "directory" and entry:find(".+%.koplugin$") then
|
||||
local mainfile = plugin_root.."/main.lua"
|
||||
package.path = string.format("%s/?.lua;%s", plugin_root, package_path)
|
||||
package.cpath = string.format("%s/lib/?.so;%s", plugin_root, package_cpath)
|
||||
local ok, plugin_module = pcall(dofile, mainfile)
|
||||
if not ok or not plugin_module then
|
||||
logger.warn("Error when loading", mainfile, plugin_module)
|
||||
elseif type(plugin_module.disabled) ~= "boolean" or not plugin_module.disabled then
|
||||
plugin_module.path = plugin_root
|
||||
plugin_module.name = plugin_module.name or plugin_root:match("/(.-)%.koplugin")
|
||||
table.insert(self.plugins, plugin_module)
|
||||
else
|
||||
logger.info("Plugin ", mainfile, " has been disabled.")
|
||||
end
|
||||
package.path = package_path
|
||||
package.cpath = package_cpath
|
||||
plugin_module.path = path
|
||||
plugin_module.name = plugin_module.name or path:match("/(.-)%.koplugin")
|
||||
table.insert(self.plugins, plugin_module)
|
||||
else
|
||||
logger.info("Plugin ", mainfile, " has been disabled.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- set package path for all loaded plugins
|
||||
for _,plugin in ipairs(self.plugins) do
|
||||
package.path = package.path..";"..plugin.path.."/?.lua"
|
||||
package.cpath = package.cpath..";"..plugin.path.."/lib/?.so"
|
||||
package.path = string.format("%s;%s/?.lua", package.path, plugin.path)
|
||||
package.cpath = string.format("%s;%s/lib/?.so", package.cpath, plugin.path)
|
||||
end
|
||||
|
||||
table.sort(self.plugins, function(v1,v2) return v1.path < v2.path end)
|
||||
|
||||
Reference in New Issue
Block a user