Module:string/nowiki

local byte = string.byte local concat = table.concat local gsub = string.gsub local lower = string.lower local match = string.match local sub = string.sub

local data = mw.loadData("Module:string/nowiki/data") local absolute = data.absolute local after_newline = data.after_newline local after_magic_link = data.after_magic_link local uri_schemes = data.uri_schemes

local function escape_uri(uri) return uri_schemes[lower(uri)] and uri .. "&#58;" or uri .. ":" end

return function(text) local ret, head, n, first = {}, 1, 0, sub(text, 1, 1) if after_newline[first] then n = n + 1 ret[n] = "&#" .. byte(first) .. ";"		head = 2 elseif sub(text, 1, 4) == "" then n = n + 1 ret[n] = "&#45;---" head = 5 end local start = head while true do		local loc, this = match(text, "([\n\r\"&':;<=>IPR[%]_{|}])", head)		if not loc then			n = n + 1			ret[n] = sub(text, start)			return (gsub(concat(ret), "([%w_]+):", escape_uri))		elseif absolute[this] then			n = n + 1			ret[n] = sub(text, start, loc - 1) .. "&#" .. byte(this) .. ";"			head = loc + 1			start = head		elseif this == "\n" or this == "\r" then			local nxt = loc + 1			nxt = sub(text, nxt, nxt)			if after_newline[nxt] then				n = n + 1				ret[n] = sub(text, start, loc) .. "&#" .. byte(nxt) .. ";"				head = loc + 2				start = head			elseif sub(text, loc + 1, loc + 4) == "" then				n = n + 1				ret[n] = sub(text, start, loc) .. "&#45;---"				head = loc + 5				start = head			else				head = head + 1			end		elseif this == "_" then			local nxt = loc + 1			if sub(text, nxt, nxt) == "_" then				n = n + 1				ret[n] = sub(text, start, loc) .. "&#95;"				head = loc + 2				start = head else head = head + 1 end elseif this == ":" and sub(text, loc + 1, loc + 2) == "//" then n = n + 1 ret[n] = sub(text, start, loc - 1) .. "//"			head = loc + 3 start = head elseif (			this == "I" and sub(text, loc + 1, loc + 3) == "SBN" or			this == "P" and sub(text, loc + 1, loc + 3) == "MID"		) then local nxt = loc + 4 nxt = sub(text, nxt, nxt) if after_magic_link[nxt] then n = n + 1 ret[n] = sub(text, start, loc + 3) .. "&#" .. byte(nxt) .. ";"				head = loc + 5 start = head else head = head + 1 end elseif this == "R" and sub(text, loc + 1, loc + 2) == "FC" then local nxt = loc + 3 nxt = sub(text, nxt, nxt) if after_magic_link[nxt] then n = n + 1 ret[n] = sub(text, start, loc + 2) .. "&#" .. byte(nxt) .. ";"				head = loc + 4 start = head else head = head + 1 end else head = head + 1 end end end