Bước tới nội dung

Mô đun:Path

Bách khoa toàn thư mở Wikipedia

function split_path (path)	local parts = {}	local len = 0	for token in path:gmatch("[^/]+") do		len = len + 1		parts[len] = token	end	return parts, lenendfunction 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('Mô đun:Path: sai đường dẫn', 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_oendfunction 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, '/')endlocal 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 retvalendiface.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)endiface.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)endreturn iface