Module:IPA

Revision as of 22:22, 20 March 2024 by TheNightAvl (talk | contribs)

{{IPA}}


local export = {}
local params = {
	[1] = {},
	[2] = {list = true},
	nolarge = {type = "boolean"},
	linked = {type = "boolean"},
	nopre = {type = "boolean"},
}
local params_inline = {
	[1] = {},
	[2] = {list = true},
}

function get_SAMPAd(ipa)
	local correspondences = {
		["g"] = "ɡ",
		["E"] = "ɛ",
		["O"] = "ɔ",
		["%:"] = "ː",
		['%"'] = "ˈ",
		["%%"] = "ˌ",
		["'"] = "ʲ",
		["%_j"] = "ʲ",
	}
	for from, to in pairs(correspondences) do
		ipa = mw.ustring.gsub(ipa, "'''", "★★")
		ipa = mw.ustring.gsub(ipa, "''", "★")
		ipa = mw.ustring.gsub(ipa, from, to)
		ipa = mw.ustring.gsub(ipa, "★★", "'''")
		ipa = mw.ustring.gsub(ipa, "★", "''")
	end
	return ipa
end

function format_ipa(language, ipa, nolarge, nopre, linked)
	local language_pron = "Appendix:" .. language.name .. "_pronunciation"
	local out = ""
	if not nopre then
		out = out .. "[[w:International_Phonetic_Alphabet|IPA]]"
		out = out .. "<sup>([[" .. language_pron .. "|key]])</sup>:&nbsp;"
	end
	local class = "IPA"
	if nolarge then class = class .. " nolarge" end
	for i, i_ipa in ipairs(ipa) do
		if i > 1 then out = out .. ", " end
		out = out .. '<span class="' .. class .. '">'
		local pieces = {}
		for pre, escaped, post in mw.ustring.gmatch(i_ipa, "([^%*]*)(%*[^%*]+%*)([^%*]*)") do
			table.insert(pieces, get_SAMPAd(pre) .. '</span>' .. mw.ustring.match(escaped, "^%*([^%*]+)%*$") .. '<span class="' .. class .. '">' .. get_SAMPAd(post))
		end
		i_ipa = table.concat(pieces)
		if linked then
			out = out .. "[[" .. language_pron .. "|" .. i_ipa .. "]]"
		else
			out = out .. i_ipa
		end
		out = out .. "</span>"
	end
	return out
end

function export.show(frame)
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local language = require("Module:languages").get_by_code(args[1])
	if language == nil then
		error("No such language: " .. args[1])
	end
	return format_ipa(language, args[2], args["nolarge"], args["nopre"], args["linked"])
end

function export.show_inline(frame)
	local args = require("Module:parameters").process(frame:getParent().args, params_inline)
	local language = require("Module:languages").get_by_code(args[1])
	if language == nil then
		error("No such language: " .. args[1])
	end
	return format_ipa(language, args[2], true, true, true)
end

return export
--[[
=p.show(mw.getCurrentFrame():newChild{title="parent", args={"rad", "nom", ["nopre"] = "true"}}:newChild{title="child"})
]]--