Documentation for this module may be created at Module:Sandbox/Thayts/1/doc

local p = {}

function p.test(frame)
	local url = frame.args[1]
	local count = 0
	local urlEnc = {}
	local delim = ""

	for part in mw.text.gsplit(url, "[;/?:@&=+$,#]") do
		urlEnc[#urlEnc + 1] = delim
		urlEnc[#urlEnc + 1] = mw.uri.encode(mw.uri.decode(part, "PATH"), "PATH")
		count = count + #part + 1
		delim = url:sub(count, count)
	end
	
	return table.concat(urlEnc)
end

local function split(str, del, from)
	local i, j

	from = from or 1
	i, j = str:find(del, from)

	if i and j then
		return str:sub(1, i - 1), str:sub(j + 1), i, j
	end

	return str
end

function p.test2(frame)
	local i, j, urlSplit, urlPath
	local url = frame.args[1]
	local urlPre = ""

	i, j = url:find("//", 1, true)

	if i == 1 or (i and i > 1 and url:sub(i - 1, i - 1) == ':') then
		urlSplit = {split(url, "[/?#]", j + 1)}
		urlPre = urlSplit[1]

		if urlSplit[2] then
			urlPath = url:sub(urlSplit[3], urlSplit[4]) .. urlSplit[2]
		else
			urlPath = ""
		end
	else
		urlPath = url
	end

	local count = 0
	local pathEnc = {}
	local delim = ""

	for part in mw.text.gsplit(urlPath, "[;/?:@&=+$,#]") do
		pathEnc[#pathEnc + 1] = delim
		pathEnc[#pathEnc + 1] = mw.uri.encode(mw.uri.decode(part, "PATH"), "PATH")
		count = count + #part + 1
		delim = urlPath:sub(count, count)
	end

	return urlPre .. table.concat(pathEnc)
end

return p