Module:Path
Appearance
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