This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local export = {}

local m_IPA = require("Module:IPA")

local U = mw.ustring.char
local syllabic = U(0x0329)


local tracking = {
	en = {
		{
			symb = "iə",
			cat = "ambig",
		},
		{
			symb = { "ɪi", "ʊu", "ɪj", "ʊw" },
			cat = "eeoo",
		},
	},
	cs = {
		{
			symb = "[mnrl]",
			cat = "syllabic-consonant",
		},
	},
	ps = {
		{
			symb = "ɤ",
			cat = "Pashto",
		},
	},
	fa = {
		{
			symb = "ʔ",
			cat = "glottal-stop",
		},
	},
	{
		{
			symb = "",
			cat = "",
		},
	},
}

local function run_tracking(IPA, lang)
	lang = lang:getCode()
	
	for i, arguments in ipairs(tracking[lang]) do
		mw.log("found tracking parameters")
		if type(arguments) == "table" then
			local required = { "symb", "cat" }
			
			hasArgs = true
			
			for i, arg in pairs(required) do
				if not arguments[arg] or arguments[arg] == "" then
					hasArgs = false
				end
			end
			
			if hasArgs == true then
				local symbols = arguments.symb
				local category = arguments.cat
				
				if type(symbols) == "string" then
					symbols = { symbols }
				end
				
				for _, symbol in pairs(symbols) do
					if mw.ustring.find(IPA, symbol) then
						require("Module:debug").track("IPA/" .. lang .. "/" .. category)
					end
				end
			end
		end
	end
end

-- Used for [[Template:IPA]].
function export.IPA(frame)
	local params = {
		[1] = {list = true, allow_holes = true},
		["n"] = {list = true, allow_holes = true},
		["qual"] = {list = true, allow_holes = true},
		["lang"] = {required = false, default = ""},
	}
	
	local err = nil
	local args = require("Module:parameters").process(frame.getParent and frame:getParent().args or frame, params)
	local lang = mw.title.getCurrentTitle().nsText == "Template" and "en" or args["lang"]
	lang = require("Module:languages").getByCode(lang)
	
	if not lang then
		if args["lang"] == "" then
			err = "No language code specified.[[Category:Language code missing/IPA]]"
		else
			err = "The language code '" .. args["lang"] .. "' is not valid.[[Category:Language code invalid/IPA]]"
		end
	end
	
	-- Temporary test to see which Finnish entries use {{IPA}} rather than {{fi-IPA}}
	if lang and (lang:getCode() == "ca" or lang:getCode() == "fi") then
		require("Module:debug").track("IPA/" .. lang:getCode())
	end
	
	local items = {}
	
	for i = 1, math.max(args[1].maxindex, args["n"].maxindex) do
		local pron = args[1][i]
		local note = args["n"][i]
		local qual = args["qual"][i]
		
		run_tracking(pron, lang)
		
		if pron or note or qual then
			table.insert(items, {pron = pron, note = note, qualifiers = {qual}})
		end
	end
	
	return m_IPA.format_IPA_full(lang, items, err)
end

-- Used for [[Template:IPAchar]].
function export.IPAchar(frame)
	local params = {
		[1] = {list = true, allow_holes = true},
		["n"] = {list = true, allow_holes = true},
		["lang"] = {}, -- This parameter is not used and does nothing, but is allowed for futureproofing.
	}
	
	local args = require("Module:parameters").process(frame.getParent and frame:getParent().args or frame, params)
	
	local items = {}
	
	for i = 1, math.max(args[1].maxindex, args["n"].maxindex) do
		local pron = args[1][i]
		local note = args["n"][i]
		
		if pron or note then
			table.insert(items, {pron = pron, note = note})
		end
	end
	
	-- Format
	return m_IPA.format_IPA_multiple(nil, items)
end

function export.XSAMPA(frame)
	local params = {
		[1] = { required = true },
	}
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	return m_IPA.XSAMPA_to_IPA(args[1] or "[Eg'zA:mp5=]")
end

-- Used by [[Template:X2IPA]]
function export.X2IPAtemplate(frame)
	local params = {
		[1] = { list = true, allow_holes = true },
		["n"] = { list = true, allow_holes = true },
		["qual"] = { list = true, allow_holes = true },
		["lang"] = { required = true },
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	pronunciations, notes, qualifiers, lang = args[1], args["n"], args["qual"], args["lang"]
	
	local output = {}
	table.insert(output, "{{IPA")
	
	for i = 1, math.max(pronunciations.maxindex, notes.maxindex, qualifiers.maxindex) do
		if pronunciations[i] then
			table.insert(output, "|"..m_IPA.XSAMPA_to_IPA(pronunciations[i]))
		end
		if notes[i] then
			table.insert(output, "|n"..i.."="..notes[i])
		end
		if qualifiers[i] then
			table.insert(output, "|qual"..i.."="..qualifiers[i])
		end
	end
	
	if lang then
		table.insert(output, "|lang="..lang.."}}")
	end
	
	return table.concat(output)
end

-- Used by [[Template:X2IPAchar]]
function export.X2IPAchar(frame)
	local params = {
		[1] = { list = true, allow_holes = true },
		["n"] = { list = true, allow_holes = true },
		["lang"] = { },
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	pronunciations, notes, lang = args[1], args["n"], args["lang"]
	
	local output = {}
	table.insert(output, "{{IPAchar")
	
	for i = 1, math.max(pronunciations.maxindex, notes.maxindex) do
		if pronunciations[i] then
			table.insert(output, "|"..m_IPA.XSAMPA_to_IPA(pronunciations[i]))
		end
		if notes[i] then
			table.insert(output, "|n"..i.."="..notes[i])
		end
	end
	
	if lang then
		table.insert(output, "|lang="..lang)
	end
	
	table.insert(output, "}}")
	
	return table.concat(output)
end

-- Used by [[Template:X2rhymes]]
function export.X2rhymes(frame)
	local params = {
		[1] = { required = true, list = true, allow_holes = true },
		["lang"] = { required = true },
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	pronunciations, lang = args[1], args["lang"]
	
	local output =  {}
	table.insert(output, "{{rhymes")
	
	for i = 1, pronunciations.maxindex do
		if pronunciations[i] then
			table.insert(output, "|"..m_IPA.XSAMPA_to_IPA(pronunciations[i]))
		end
	end
	
	if lang then
		table.insert(output, "|lang="..lang)
	end
	
	table.insert(output, "}}")
	
	return table.concat(output)
end

return export
"https://si.wiktionary.org/w/index.php?title=Module:IPA/templates/sandbox&oldid=27972" වෙතින් සම්ප්‍රවේශනය කෙරිණි