Toggle menu
15
236
74
27.6K
Kenshi Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

This module offers utilities to convert paths into different formats.

Functions

information Note: In all functions the |1= argument can indifferently be a relative (i.e. beginning with ./ or ../ or /) or an absolute path.

abs

The abs function parses the |1= argument and returns it as an absolute path.

Examples

  • {{#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

The rel function parses the |1= argument and returns it as a relative path.

Examples

  • {{#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

sub

The sub function parses the |1= argument and returns it as a partial path with only the subpages shown.

Examples

  • {{#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


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