Module:Homophones

Frae Wikipedia, the free beuk o knawledge
local export = {}

local m_links = require("Module:links")

function export.show(frame)
	local args = frame:getParent().args
	local lang = args["lang"]; if lang == "" then lang = nil end
	
	if not lang then
		lang = "en"
	end
	
	lang = require("Module:languages").getByCode(lang) or error("The language code \"" .. lang .. "\" is not valid.")
	
	local text = ""
	local terms = {} -- because args is unmodifiable
	
	--make the term empty string if only the alternate text exists
	for name, parameter in pairs(args) do
		local regex = mw.ustring.match(tostring(name),"^alt%d+$")
		
		if regex then
			local index = tonumber((name:gsub("alt", "")))
			
			if not args[index] then
				terms[index] = ""
			end
		end
	end
	
	--copy all unnamed parameters to terms
	for i, param in ipairs(args) do
		terms[i] = param
	end
	
	--main process
	local comma = false
	local count = 0
	
	for i, parameter in ipairs(terms) do
		count = count + 1
		
		if comma then
			text = text .. ", "
		else
			comma = true
		end
		
		local alt = args["alt" .. tostring(i)]
		local tr = args["tr" .. tostring(i)]
		
		if parameter == "" then
			text = text .. alt
		else
			text = text .. m_links.full_link({lang = lang, term = parameter, alt = alt, tr = tr})
		end
	end
	
	--return process
	if count > 1 then --add an "s" to "Homophone" if there is more than one term
		return "Homophones: " .. text
	elseif count == 1 then --no "s" if there is only one term
		return "Homophone: " .. text
	end
	
	--if there is no term at all, return default text if namespace is Template
	if mw.title.getCurrentTitle().nsText == "Template" then
		return "Homophone: [[term#Scots|term]]"
	end
	
	--if this line is parsed, there are no terms at all and the namespace is not Template
	error("Please provide at least one homophone.")
end

return export