--[[ Copyright (c) 2012-2013 Kaarle Ritvanen See LICENSE file for license details --]] module(..., package.seeall) local map = require('acf.util').map function is_absolute(path) return string.sub(path, 1, 1) == '/' end function to_absolute(path, base) if not is_absolute(path) then path = base..(base ~= '/' and '/' or '')..path end local comps = split(path) local i = 1 while i <= #comps do if comps[i] == '..' then if i == 1 then error('Invalid path: '..path) end table.remove(comps, i - 1) table.remove(comps, i - 1) i = i - 1 else i = i + 1 end end return '/'..table.concat(comps, '/') end local function escape(comp) if type(comp) == 'number' then return tostring(comp) end local res = string.gsub(comp, '([\\/])', '\\%1') return tonumber(res) and '\\'..res or res end function rawjoin(p1, p2, ...) if not p2 then return p1 end if not is_absolute(p2) then p2 = '/'..p2 end return rawjoin((p1 == '/' and '' or p1)..p2, unpack(arg)) end function join(parent, ...) return rawjoin(parent, unpack(map(escape, arg))) end function split(path) local res = {} local comp = '' local escaped local function merge(s) if s > '' then table.insert(res, not escaped and tonumber(s) or s) end end while true do local prefix, sep, suffix = string.match(path, '([^\\/]*)([\\/])(.*)') if not prefix then merge(comp..path) return res end comp = comp..prefix if sep == '\\' then comp = comp..string.sub(suffix, 1, 1) escaped = true path = string.sub(suffix, 2, -1) else merge(comp) comp = '' escaped = false path = suffix end end end function parent(path) local comps = split(path) table.remove(comps) return join('/', unpack(comps)) end function name(path) local comps = split(path) return comps[#comps] end