106 lines
2.4 KiB
Lua
106 lines
2.4 KiB
Lua
-- cargo v0.1.1
|
|
-- https://github.com/bjornbytes/cargo
|
|
-- MIT License
|
|
|
|
local cargo = {}
|
|
|
|
local function merge(target, source, ...)
|
|
if not target or not source then return target end
|
|
for k, v in pairs(source) do target[k] = v end
|
|
return merge(target, ...)
|
|
end
|
|
|
|
local la, lf, lg = love.audio, love.filesystem, love.graphics
|
|
|
|
local function makeSound(path)
|
|
local info = lf.getInfo(path, 'file')
|
|
return la.newSource(path, (info and info.size and info.size < 5e5) and 'static' or 'stream')
|
|
end
|
|
|
|
local function makeFont(path)
|
|
return function(size)
|
|
return lg.newFont(path, size)
|
|
end
|
|
end
|
|
|
|
local function loadFile(path)
|
|
return lf.load(path)()
|
|
end
|
|
|
|
cargo.loaders = {
|
|
lua = lf and loadFile,
|
|
png = lg and lg.newImage,
|
|
jpg = lg and lg.newImage,
|
|
dds = lg and lg.newImage,
|
|
ogv = lg and lg.newVideo,
|
|
glsl = lg and lg.newShader,
|
|
mp3 = la and makeSound,
|
|
ogg = la and makeSound,
|
|
wav = la and makeSound,
|
|
flac = la and makeSound,
|
|
txt = lf and lf.read,
|
|
ttf = lg and makeFont,
|
|
otf = lg and makeFont,
|
|
fnt = lg and lg.newFont
|
|
}
|
|
|
|
cargo.processors = {}
|
|
|
|
function cargo.init(config)
|
|
if type(config) == 'string' then
|
|
config = { dir = config }
|
|
end
|
|
|
|
local loaders = merge({}, cargo.loaders, config.loaders)
|
|
local processors = merge({}, cargo.processors, config.processors)
|
|
|
|
local init
|
|
|
|
local function halp(t, k)
|
|
local path = (t._path .. '/' .. k):gsub('^/+', '')
|
|
local fileInfo = lf.getInfo(path, 'directory')
|
|
if fileInfo then
|
|
rawset(t, k, init(path))
|
|
return t[k]
|
|
else
|
|
for extension, loader in pairs(loaders) do
|
|
local file = path .. '.' .. extension
|
|
local fileInfo = lf.getInfo(file)
|
|
if loader and fileInfo then
|
|
local asset = loader(file)
|
|
rawset(t, k, asset)
|
|
for pattern, processor in pairs(processors) do
|
|
if file:match(pattern) then
|
|
processor(asset, file, t)
|
|
end
|
|
end
|
|
return asset
|
|
end
|
|
end
|
|
end
|
|
|
|
return rawget(t, k)
|
|
end
|
|
|
|
local function __call(t, recurse)
|
|
for i, f in ipairs(love.filesystem.getDirectoryItems(t._path)) do
|
|
local key = f:gsub('%..-$', '')
|
|
halp(t, key)
|
|
|
|
if recurse and love.filesystem.getInfo(t._path .. '/' .. f, 'directory') then
|
|
t[key](recurse)
|
|
end
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
init = function(path)
|
|
return setmetatable({ _path = path }, { __index = halp, __call = __call })
|
|
end
|
|
|
|
return init(config.dir)
|
|
end
|
|
|
|
return cargo
|