Software /
code /
prosody
File
util/pluginloader.lua @ 4149:3c1b153c2856
util.pluginloader: Return full file path from internal file loader on success, not just the name.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sun, 20 Feb 2011 20:01:05 +0500 |
parent | 4121:ea7e3f22f898 |
child | 4150:2894ca33ec45 |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local dir_sep, path_sep = package.config:match("^(%S+)%s(%S+)"); local plugin_dir = {}; for path in (CFG_PLUGINDIR or "./plugins/"):gsub("[/\\]", dir_sep):gmatch("[^"..path_sep.."]+") do path = path..dir_sep; -- add path separator to path end path = path:gsub(dir_sep..dir_sep.."+", dir_sep); -- coalesce multiple separaters plugin_dir[#plugin_dir + 1] = path; end local io_open, os_time = io.open, os.time; local loadstring, pairs = loadstring, pairs; module "pluginloader" local function load_file(name) local file, err, path; for i=1,#plugin_dir do path = plugin_dir[i]..name; file, err = io_open(path); if file then break; end end if not file then return file, err; end local content = file:read("*a"); file:close(); return content, path; end function load_resource(plugin, resource, loader) local path, name = plugin:match("([^/]*)/?(.*)"); if name == "" then if not resource then resource = "mod_"..plugin..".lua"; end loader = loader or load_file; local content, err = loader(plugin.."/"..resource); if not content then content, err = loader(resource); end -- TODO add support for packed plugins return content, err; else if not resource then resource = "mod_"..name..".lua"; end loader = loader or load_file; local content, err = loader(plugin.."/"..resource); if not content then content, err = loader(path.."/"..resource); end -- TODO add support for packed plugins return content, err; end end function load_code(plugin, resource) local content, err = load_resource(plugin, resource); if not content then return content, err; end return loadstring(content, "@"..err); end return _M;