This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
This module offers utilities to convert paths into different formats.
Functions
edit Note: In all functions the |1=
argument can indifferently be a relative (i.e. beginning with ./
or ../
or /
) or an absolute path.
abs
edit
The abs
function parses the |1=
argument and returns it as an absolute path.
Examples
edit{{#invoke:path|abs|./example}}
- ↳ Module:Path/example
{{#invoke:path|abs|.}}
- ↳ Module:Path
{{#invoke:path|abs|Wikipedia:Lua}}
- ↳ Wikipedia:Lua
{{#invoke:path|abs}}
- ↳ Module:Path
rel
edit
The rel
function parses the |1=
argument and returns it as a relative path.
Examples
edit{{#invoke:path|rel|Module:Path/example}}
- ↳ ./example
{{#invoke:path|rel|Module:Path}}
- ↳ .
{{#invoke:path|rel|Wikipedia:Lua}}
- ↳ Wikipedia:Lua
{{#invoke:path|rel}}
- ↳ .
[[Module:Path/example|{{#invoke:path|rel|Module:Path/example}}]]
- ↳ ./example
- See also {{Relative link}}
- ↳ ./example
sub
edit
The sub
function parses the |1=
argument and returns it as a partial path with only the subpages shown.
Examples
edit{{#invoke:path|sub|Module:Path/example}}
- ↳ example
{{#invoke:path|sub|Module:Path}}
- ↳
{{#invoke:path|sub|Wikipedia:Lua}}
- ↳ Wikipedia:Lua
{{#invoke:path|sub}}
- ↳
[[Module:Path/example|{{#invoke:path|sub|Module:Path/example}}]]
- ↳ example
- See also {{Relative link implicit}}
- ↳ example
See also
edit
function split_path (path)
local parts = {}
local len = 0
for token in path:gmatch("[^/]+") do
len = len + 1
parts[len] = token
end
return parts, len
end
function get_abs_path (current, page)
local tbl_i, len_i = split_path(page)
local tbl_o
local len_o
if tbl_i[1] == '.' or tbl_i[1] == '..' then
tbl_o, len_o = split_path(current)
else
tbl_i[1] = tbl_i[1]:gsub('^([^:]?)([^:]*)(:?)(.?)',
function (s1, s2, s3, s4)
if s3 == '' then return s1:upper() .. s2 end
return s1:upper() .. s2 .. s3 .. s4:upper()
end,
1
)
tbl_o = {}
len_o = 0
end
for key, val in ipairs(tbl_i) do
if val == '..' then
if len_o < 1 then
error('Module:Path: invalid path', 0) end
tbl_o[len_o] = nil
len_o = len_o - 1
elseif val ~= '.' then
len_o = len_o + 1
tbl_o[len_o] = val
end
end
if len_o < 1 then
tbl_o[1] = ''
len_o = 1
end
return tbl_o, len_o
end
function get_rel_path (current, page, add_prefixes)
local tbl_i, len_i = get_abs_path(current, page)
local tbl_c, len_c = split_path(current)
local tbl_o = {}
local len_o = 0
local minlen
local new_at = 0
if len_c < len_i then minlen = len_c else minlen = len_i end
for idx = 1, minlen do
if tbl_c[idx] ~= tbl_i[idx] then
new_at = idx
break
end
end
if new_at == 1 then return table.concat(tbl_i, '/') end
if add_prefixes then
if new_at == 0 then
tbl_o[1] = '.'
new_at = minlen + 1
end
for idx = new_at, len_c do
len_o = len_o + 1
tbl_o[len_o] = '..'
end
if len_o < 1 then len_o = 1 end
elseif new_at == 0 then new_at = minlen + 1 end
for idx = new_at, len_i do
len_o = len_o + 1
tbl_o[len_o] = tbl_i[idx]
end
return table.concat(tbl_o, '/')
end
local iface = {}
iface.abs = function (frame)
local page = frame.args[1]
if page ~= nil then page = page:match'^%s*(.*%S)' end
if page == nil then return mw.title.getCurrentTitle().prefixedText end
local retval, _ = table.concat(get_abs_path(
mw.title.getCurrentTitle().prefixedText,
page:gsub('^%s*/%s*', './', 1)
), '/')
return retval
end
iface.rel = function (frame)
local page = frame.args[1]
if page ~= nil then page = page:match'^%s*(.*%S)' end
if page == nil then return '.' end
return get_rel_path(mw.title.getCurrentTitle().prefixedText,
page:gsub('^%s*/%s*', './', 1), true)
end
iface.sub = function (frame)
local page = frame.args[1]
if page ~= nil then page = page:match'^%s*(.*%S)' end
if page == nil then return '' end
return get_rel_path(mw.title.getCurrentTitle().prefixedText,
page:gsub('^%s*/%s*', './', 1), false)
end
return iface