Module:IPA/templates/sandbox

From Wiktionary, the free dictionary
Jump to navigation Jump to search
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 = lang, items = items, err = 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